zoukankan      html  css  js  c++  java
  • 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.窗口类的注册

        

        看看WNDCLASS的内容:

        

      5.窗口的创建

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

        

      6.窗口的显示

        

      7.消息循环

        

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

      8.窗口过程函数

  • 相关阅读:
    转载:有关推挽输出、开漏输出、复用开漏输出、复用推挽输出以及上拉输入、下拉输入、浮空输入、模拟输入区别
    生活该是什么样子
    怎么处理问题
    jquery.validate 1.7版本(remote方法)bug修复方法(一)
    jquery.ui.dialog 1.81在IE8中出现滚动条bug解决方法
    javascript 懒加载技术(lazyload)简单实现
    jquery.validate 1.7版本(remote方法)bug修复方法(二)
    发布一款JavaScript焦点图组件
    发布一款轻量级的JSON转换代码
    android_intent和intent_action大全 .
  • 原文地址:https://www.cnblogs.com/rayguo/p/3662826.html
Copyright © 2011-2022 走看看