欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

我的第一个 Windows 窗口程序(1)

程序员文章站 2023-01-28 17:54:13
一般来说,构建一个 Windows 程序可以分为如下几个步骤:定义窗口类(WNDCLASS)注册窗口类(RegisterClass)创建窗口(CreateWindow)更新显示窗口(UpdateWindow、ShowWindow)建立消息循环(GetMessage)处理消息(DispatchMess... ......

    一般来说,构建一个 Windows 程序可以分为如下几个步骤:

    • 定义窗口类(WNDCLASS)
    • 注册窗口类(RegisterClass)
    • 创建窗口(CreateWindow)
    • 更新显示窗口(UpdateWindow、ShowWindow)
    • 建立消息循环(GetMessage)
    • 处理消息(DispatchMessage)


    消息处理由窗口过程(WndProc)来完成,消息分为队列消息和非队列消息两种:

    • 队列消息:Windows 放入消息队列的消息,在消息循环中被检索(GetMessage),然后分发投递到窗口过程中(DispatchMessage)。
    • 非队列消息:Windows 对窗口过程的直接调用(将消息直接发送到窗口过程)


    Windows 示例程序代码:

    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    
        switch (message) {
        case WM_CREATE:
            /* 窗口创建时的消息处理 */
            return 0;
    
        case WM_PAINT:
            hdc = BeginPaint(hwnd, &ps);
            /* 窗口重绘的消息处理 */
            EndPaint(hwnd, &ps);
            return 0;
    
        case WM_DESTROY:
            /* 窗口销毁时的消息处理 */
            PostQuitMessage(0);
            return 0;
        }
        
        /* 默认的窗口过程消息处理 */
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
    
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    
        LPCTSTR lpszClassName = TEXT("demo");
        
        /* 定义窗口类 */
        WNDCLASS wndclass;
        wndclass.cbClsExtra = 0;
        wndclass.cbWndExtra = 0;
        wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
        wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
        wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
        wndclass.hInstance = hInstance;
        wndclass.lpszClassName = lpszClassName;
        wndclass.lpszMenuName = NULL;
        wndclass.lpfnWndProc = WndProc;
        wndclass.style = CS_HREDRAW | CS_VREDRAW;
        
        /* 注册窗口类 */
        if (!RegisterClass(&wndclass)) {
            MessageBox(NULL, TEXT("This Program requires Windows NT!"), lpszClassName, MB_ICONERROR);
            return 0;
        }
        
        /* 创建窗口 */
        HWND hwnd = CreateWindow(
            lpszClassName, 
            TEXT("Demo Window"), 
            WS_OVERLAPPEDWINDOW, 
            CW_USEDEFAULT, 
            CW_USEDEFAULT, 
            CW_USEDEFAULT, 
            CW_USEDEFAULT, 
            NULL, 
            NULL, 
            hInstance, 
            NULL
        );
        
        /* 更新显示窗口 */
        UpdateWindow(hwnd);
        ShowWindow(hwnd, nCmdShow);
    
        /* 消息循环 */
        MSG msg;
        while (GetMessage(&msg, NULL, 0, 0)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    
        return msg.wParam;
    }

          从上面的程序示例可以看出,WinMain函数完成了程序的基本配置,并且建立了消息循环,WndProc窗口过程则完成每一次消息循环的处理。这样,一个简单的Windows程序框架基本上就构建出来了,其中的细节值得回味。