zoukankan      html  css  js  c++  java
  • Win32 SDK 编程开始, 创建窗口, 消息的处理, 消息循环

    Windows SDK 编程的一般步骤为:
        1. 注册窗口类, 使用到的结构 WNDCLASSEX, 函数 RegisterClassEx.
        2. 创建窗口, 函数 CreateWindowEx.
        3. 消息循环, 结构 MSG, 函数 GetMessage, TranslateMessage, DispatchMessage.
        4. 进入无限循环, 消息处理 :-)

      下面是代码, 当然, 还有分析:

    #include <windows.h>    //包含 Windows 相关的 API 函数
    
    //这里就是所谓的消息处理函数了
    //CALLBACK 说明当前函数是回调函数, 就是说明调用约定
    //hwnd:窗口句柄, uMsg:收到的消息, wParam, lParam:与该消息有关的参数
    LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        switch(uMsg)    //消息选择
        {
        //这里我添加一个左键按下的消息
        case WM_LBUTTONDOWN:
            MessageBox(hwnd, "左键按下", "提示", MB_OK);
            return 0;
            
        case WM_DESTROY:    //当前窗口被销毁时
            PostQuitMessage(0);    //发出退出程序的消息
            return 0;    //如果处理了该消息, 就返回 0 来告知 Windows
    
        case WM_CLOSE:    //当用户点击窗口右上角的关闭按钮时
            DestroyWindow(hwnd);    //销毁窗口
            return 0;
    
        case WM_PAINT:    //当窗口需要重绘时
            {
                PAINTSTRUCT ps = {0};
                BeginPaint(hwnd, &ps);    //开始重绘
                
                EndPaint(hwnd, &ps);    //结束重绘
                return 0;
            }
        }
        return DefWindowProc(hwnd, uMsg, wParam, lParam);    
        //对于我们不想处理的消息, 比如鼠标在窗口上移动时发出的消息
        //我们就原样传给默认的窗口消息处理函数处理, 不然应用程序会失去响应
    }
    
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        //注意 Windows 程序应该使用 WinMain 入口函数了, 不再使用 main 函数
        //当然, 如果不创建窗口, 不使用窗口 也可以使用 main.
        WNDCLASSEX wc = {0};            //窗口类结构, 为注册窗口类作准备
        wc.cbClsExtra = 0;                //附加的类信息, 没有, 设为0
        wc.cbSize = sizeof(wc);            //WNDCLASSEX结构的大小
        wc.cbWndExtra = 0;                //窗口额外内存, 没有, 设为0
        wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);            //窗口背景, 这里使用灰色背景
        wc.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));        //应用程序使用的鼠标类型
        wc.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION));    //光标类型
        wc.hIconSm = NULL;                    //应用程序程序的小光标, 不管, 设为 NULL
        wc.hInstance = hInstance;            //应用程序程序实例句柄, 由 WinMain 函数传递过来
        wc.lpfnWndProc = WndProc;            //这个很重要, 就是当前窗口的消息处理函数, 传递 WndProc 的地址
        wc.lpszClassName = "vbgk_class";    //创建类时使用的类名, 可以自定义
        wc.lpszMenuName = NULL;                //菜单, 没有, 就使用 NULL
        wc.style = CS_HREDRAW | CS_VREDRAW;    //类的风格, 垂直重绘, 水平重绘
    
        if(!RegisterClassEx(&wc))    //注册窗口类
        {
            MessageBox(NULL, "Register Class Failed!", NULL, MB_OK);
            return 1;
        }
        
        //创建窗口咯, 介绍一下 CreateWindowEx 函数的参数
        HWND hWnd = CreateWindowEx(
                    0,                    //扩展窗口风格
                    "vbgk_class",        //这里就是我们刚才创建的窗口类名
                    "木木ing", 
                    WS_OVERLAPPEDWINDOW,//窗口风格
                    CW_USEDEFAULT,        //初始化时的 X 坐标
                    CW_USEDEFAULT,        //Y坐标
                    320,        //窗口宽度, 我们这里设为 320
                    240,        //窗口高度
                    NULL,        //父窗口句柄, 没有
                    NULL,        //菜单, 没有
                    hInstance,    //实例句柄, 来自WinMain
                    NULL        //发送 WM_CREATE 消息时的附加参数, 一般为零
                    );
        if(!hWnd)
        {
            MessageBox(NULL, "CreateWindowEx Failed!", NULL, MB_OK);
            return 2;
        }
    
        UpdateWindow(hWnd);                //更新窗口
        ShowWindow(hWnd, nCmdShow);        //显示窗口
    
        MSG msg;
        BOOL bRet;
        //进入消息循环
        while((bRet = GetMessage(&msg, NULL, 0, 0)) != -1)
        {
            if(bRet == 0)
            {
                break;
            }
    
            TranslateMessage(&msg);    //翻译消息
            DispatchMessage(&msg);    //分发消息
        }
    
        return msg.wParam;    //WinMain函数结束, 整个程序退出
    }
    

      

  • 相关阅读:
    自动化测试
    django
    Linux软件推荐
    deepin升级20.1(2021.3)
    struts_自定义日期类型转换器
    struts_01
    JAVA面向对象思想
    springmvc 文件上传
    ajax+struts2 实现省份-城市-地区三级联动
    mybatis——分页插件
  • 原文地址:https://www.cnblogs.com/alinh/p/6907419.html
Copyright © 2011-2022 走看看