Windows窗口的创建

Windows窗口创建的基本代码:

#include <Windows.h>

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

int WINAPI WinMain( 
    __in HINSTANCE hInstance, 
    __in_opt HINSTANCE hPrevInstance, 
    __in LPSTR lpCmdLine, 
    __in int nShowCmd 
    ) {
    TCHAR* appName = TEXT("Demo");
    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 = appName;

    if(!RegisterClass(&wndClass)) {
        MessageBox(NULL, TEXT("Register Class Error"), appName, 0);
        return 0;
    }

    hwnd = CreateWindow(
        appName,
        TEXT("Demo"),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT, 
        CW_USEDEFAULT, 
        NULL,
        NULL,
        hInstance, 
        NULL
    );

    ShowWindow(hwnd, nShowCmd);
    UpdateWindow(hwnd);

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

    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;
    switch(msg) {
    case WM_CREATE:
        {
            return 0;
        }
    case WM_PAINT:
        {
            hdc = BeginPaint(hwnd, &ps);
            GetClientRect(hwnd, &rect);
            DrawText(hdc, TEXT("Ray_xujianguo"), -1, &rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER);
            EndPaint(hwnd, &ps);
            return 0;
        }
    case WM_DESTROY:
        {
            PostQuitMessage(0);
            return 0;
        }
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}

下面一部分一部分来解释:

  1.里面有一些函数我们来看看它们的作用

    LoadIcon                加载图标
    LoadCursor                加载鼠标光标
    GetStockObject            获取一个图形对象,本例子是获取一个画刷
    RegisterClass            注册一个窗口类
    MessageBox                消息框
    CreateWindow            创建一个窗口
    ShowWindow                显示窗口
    UpdateWindow            重绘窗口
    GetMessage                从消息队列中获取信息
    TranslateMessage        翻译键盘消息
    DispatchMessage            将消息转发给窗口
    BeginPaint                窗口开始绘制
    GetClientRect            获取窗口客户区的尺寸
    DrawText                显示一个文本字符串
    EndPaint                结束窗口的绘制
    PostQuitMessage            将”退出“消息插入消息队列中
    DefWindowProc            执行默认的消息处理

  2.一些数值常量

    在上面的程序中我们看到了CW_USEDEFAULT等常量,其实我们从前面的大写字母就可以看到这个常量的类型是什么了。

    前缀                        常量
    CS                        类风格选项
    CW                        创建窗口选项
    DT                        文本绘制选项
    IDI                        图标的ID号
    IDC                        光标的ID号
    MB                        消息框选项
    WM                        窗口消息
    WS                        窗口风格

   3.理解句柄 

    HINSTANCE                实例句柄-程序本身
    HWND                    窗口句柄
    HDC                        设备环境句柄

   4.窗口类的注册

    Windows窗口的创建_第1张图片

    看看WNDCLASS的内容:

    Windows窗口的创建_第2张图片

  5.窗口的创建

    窗口类只是定义了窗口的一般特征,因此基于同一窗口类可以创建许多不同的窗口,在调用CreateWindow函数来创建窗口的时候,可以指定更多细节。

    Windows窗口的创建_第3张图片

  6.窗口的显示

    Windows窗口的创建_第4张图片

  7.消息循环

    Windows窗口的创建_第5张图片

    先是从消息队列中获取消息,然后翻译键盘的消息,再把消息转发给窗口过程函数处理,窗口程序函数处理完毕后,就立即进行下一轮的消息循环。

  8.窗口过程函数

Windows窗口的创建_第6张图片

你可能感兴趣的:(windows)