Win32 Api 学习记录-Ocrosoft
浙江财经大学
信工学院ACM集训队

Win32 Api 学习记录

本文由 Ocrosoft 于 2018-05-11 23:46:48 发表

摘要:一些常见控件的介绍

1.1.还有点问题… 没有问题,不带AUTO的控件需要自己处理消息和选中等操作。

1.2.源码

#include <windows.h>
#include <stdio.h>

#define LPARAMX ((int)(short)LOWORD(lParam))
#define LPARAMY ((int)(short)HIWORD(lParam))

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

struct
{
    int iStyle;
    TCHAR* szText;
}
button[] =
{
    BS_PUSHBUTTON,          TEXT("PUSHBUTTON"),
    BS_DEFPUSHBUTTON,       TEXT("DEFPUSHBUTTON"),
    BS_CHECKBOX,            TEXT("CHECKBOX"),
    BS_AUTOCHECKBOX,        TEXT("AUTOCHECKBOX"),
    BS_RADIOBUTTON,         TEXT("RADIOBUTTON"),
    BS_3STATE,              TEXT("3STATE"),
    BS_AUTO3STATE,          TEXT("AUTO3STATE"),
    BS_GROUPBOX,            TEXT("GROUPBOX"),
    BS_AUTORADIOBUTTON,     TEXT("AUTORADUI"),
    BS_OWNERDRAW,           TEXT("OWNERDRAW")
};

#define NUM (sizeof button / sizeof button[0])

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    static TCHAR szAppName[] = TEXT("BtnLook");
    HWND hwnd;
    MSG msg;
    WNDCLASS wndclass;

    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;

    if (!RegisterClass(&wndclass))
    {
        MessageBox(NULL, TEXT("Program requires Windows NT!"), szAppName, MB_ICONERROR);
        return 0;
    }

    hwnd = CreateWindow(szAppName, TEXT("Button Look"),
                        WS_OVERLAPPEDWINDOW,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        CW_USEDEFAULT, CW_USEDEFAULT,
                        NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND hwndButton[NUM];
    static RECT rect;
    static TCHAR szTop[] = TEXT("message            wParam           lParam"),
                           szUnd[] = TEXT("_______            ______           ______"),
                                     szFormat[] = TEXT("%-16s%04X-%04X        %04X-%04X"),
                                             szBuffer[50];
    static int cxChar, cyChar;

    HDC hdc;
    PAINTSTRUCT ps;
    int i;

    switch (message)
    {
    case WM_CREATE:
        cxChar = LOWORD(GetDialogBaseUnits());
        cyChar = HIWORD(GetDialogBaseUnits());

        for (i = 0; i < NUM; i++)
        {
            hwndButton[i] = CreateWindow(TEXT("button"),
                                         button[i].szText,
                                         WS_CHILD | WS_VISIBLE | button[i].iStyle,
                                         cxChar, cyChar * (1 + 2 * i),
                                         20 * cxChar, 7 * cyChar / 4,
                                         hwnd, (HMENU)i,
                                         ((LPCREATESTRUCT)lParam)->hInstance, NULL);
        }
        return 0;

    case WM_SIZE:
        rect.left = 24 * cxChar;
        rect.top = 2 * cyChar;
        rect.right = LOWORD(lParam);
        rect.bottom = HIWORD(lParam);
        return 0;

    case WM_PAINT: // 绘制标题行
        InvalidateRect(hwnd, &rect, TRUE);

        hdc = BeginPaint(hwnd, &ps);

        SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));
        SetBkMode(hdc, TRANSPARENT);

        TextOut(hdc, 24 * cxChar, cyChar, szTop, lstrlen(szTop));
        TextOut(hdc, 24 * cxChar, cyChar, szUnd, lstrlen(szUnd));

        EndPaint(hwnd, &ps);
        return 0;

    case WM_DRAWITEM: // 按钮、组合框、菜单等的可见部分发生改变时,触发该消息
    case WM_COMMAND: // 窗口菜单或者子窗口产生的消息,lParam = 控件ID,wParam = 消息码
        ScrollWindow(hwnd, 0, -cyChar, &rect, &rect); // 上滚一行

        hdc = GetDC(hwnd);
        SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));
        TextOut(hdc, 24 * cxChar, cyChar * (rect.bottom / cyChar - 1),
                szBuffer,
                wsprintf(szBuffer, szFormat, message == WM_DRAWITEM ? TEXT("WM_DRAWITEM") : TEXT("WM_COMMAND"),
                         HIWORD(wParam), LOWORD(wParam),
                         HIWORD(lParam), LOWORD(lParam))); // 显示消息

        ReleaseDC(hwnd, hdc);
        ValidateRect(hwnd, &rect); // 使rect区域有效
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}

欢迎转载,请保留出处与链接。Ocrosoft » Win32 Api 学习记录

点赞 (0)or拍砖 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址