zoukankan      html  css  js  c++  java
  • 学习Win32框架的一点总结

    学习Win32框架的一点总结

    最近在学习Windwos,了解了一点Win32框架,整个框架总得来说分为以下部分:

    • 注册一个窗口类
    • 创建一个窗口
    • 消息循环

    自己写了一个Win32框架,从代码直接分析。

    
    #include <Windows.h>
    #include "resource.h"
    
    //消息回调函数
    LRESULT CALLBACK WinProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
        switch(message)
        {
        case WM_CLOSE:
            if (IDOK == MessageBox(hWnd,"你确定退出?","退出",MB_OKCANCEL))
            {
                DestroyWindow(hWnd);
            }
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd,message,wParam,lParam);
        }
    }
    
    int WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nShowCmd )
    {
        MSG msg; 
        //Step1:注册一个窗口类
        HWND hwnd; //窗口的句柄
        WNDCLASSEX wc; //窗口类结构
        wc.cbSize = sizeof(WNDCLASSEX);
        wc.style = CS_VREDRAW | CS_HREDRAW;
        wc.lpszMenuName = 0;
        wc.lpszClassName = "Win32";
        wc.lpfnWndProc = WinProc ; //消息回调函数
        wc.hInstance = hInstance ;
        wc.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1)); //设置窗口的图标
        wc.hCursor = LoadCursor(NULL,(LPCSTR)IDC_CURSOR1); //设置窗口的指针图标
        wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
        wc.cbWndExtra = 0 ;
        wc.cbClsExtra = 0 ;
        wc.hIconSm = LoadIcon(wc.hInstance,MAKEINTRESOURCE(IDI_ICON1));
        RegisterClassEx(&wc); //注册窗口
        //Step2:创建一个窗口
        hwnd = CreateWindow(
            "Win32", //窗口的类名,也就是上面我们自定义的窗口类的名字
            "Win32程序", //窗口的标题
            WS_OVERLAPPEDWINDOW, //窗口style
            500, //窗口位置x坐标
            300, //窗口位置y坐标
            800, //窗口宽度
            600, //窗口高度
            NULL, //父窗口句柄
            NULL, //菜单句柄
            hInstance, //实例句柄
            NULL //创建数据
            );
        if (!hwnd)
        {
            return FALSE;
        }
        ShowWindow(hwnd,SW_SHOW); //显示窗口
        UpdateWindow(hwnd); //刷新
        //Step3:消息循环
        while(GetMessage(&msg,NULL,0,0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        return 0;
    }

           Win32程序的工作流程

    1. 首先是自己创建了一个窗口类结构体,也就是WNDCLASSEX,这个结构体是 WNDCLASS的升级版。里面一共有12个成员,具体的什么含义,我在代码中重要的地方写了一下,具体可以参考MSDN。成员都赋值完成后,调用RegisterClassEx函数注册窗口,如果使用的是WNDCLASS,这里用RegisterClass函数,这里就完成了第一步工作,注册窗口类。
    2. 接着需要进行第二步,创建一个窗口,调用CreateWindow函数,函数里面的具体含义我都标明了,经过了这一步Windows就为我们分配好了这个窗口的所有资源,再调用ShowWindow函数就可以显示了。
    3. 紧接着需要对窗口的消息进行处理,剩下的任务就是窗口不断从操作系统获取消息和处理消息,使用GetMessage函数从系统获取消息,而消息处理则在WinProc函数中完成,在这个函数里,我对关闭窗口这个消息进行了处理,也就是你点窗口右上角那个叉的时候会弹出一个对话框让你选择是否退出,如果点“是”就执行DestroyWindow函数,这个函数的执行会发送一个WM_DESTROY消息,因此又可以捕获到并执行case WM_DESTROY后面的内容,PostQuitMessage就是发送一条退出消息,告诉操作系统,我已经退出了,这个函数里面的0表示的返回结果。

           上面代码需要添加资源,添加好的资源可以看到

    资源管理器

    我自己用到了一些资源,比如IDI_ICON1IDC_CURSOR1,是窗口用到的图标资源,自己从网上下个Icon图标和cur图标添加到资源中就OK。和整个代码的流程就是这样,这是最简单的一个Win32程序框架,也是我刚开始学,写下来当做一点点心得吧!
  • 相关阅读:
    opencv目录
    qt5-编译并添加opencv库
    java版gRPC实战之二:服务发布和调用
    java版gRPC实战之一:用proto生成代码
    github搜索技巧小结
    client-go实战之五:DiscoveryClient
    client-go实战之四:dynamicClient
    client-go实战之三:Clientset
    client-go实战之二:RESTClient
    client-go实战之一:准备工作
  • 原文地址:https://www.cnblogs.com/cuglzf/p/8490683.html
Copyright © 2011-2022 走看看