• WinMain与WndProc以及窗口诞生过程总结


    一、int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int nCmdShow)

    1. 四个参数:
      1. hInstance:程序当前实例的句柄(handle to current instance),以后随时可以用GetModuleHandle(0)来获得
      2. hPrevInstance:前一个实例的句柄(handle to previous instance),在Win32中,每一个进程都有一个独立的4G地址空间,从0到2G属于进程私有,对其他进程来说是不可见的。所以,在Win32中,hPrevInstance总是为NULL。
      3. szCmdLine:指向以/0结尾的命令行,不包括EXE本身的文件名(pointer to command line),以后随时可以用GetCommandLine()来获取完整的命令行。
      4. iCmdShow:指明应该以什么方式显示主窗口(show state of window)。
    2. 宏定义:
      1. WINAPI:#define WINAPI      __stdcall    表示函数调用遵循__stdcall规则
      2. HINSTANCE:

        DECLARE_HANDLE(HINSTANCE);
        typedef HINSTANCE HMODULE;

        #define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name

      3. LPSTR:typedef _Null_terminated_ CHAR *NPSTR, *LPSTR, *PSTR;  就是一个以/0结尾的字符串

        #ifndef VOID
        #define VOID void
        typedef char CHAR;

    二、LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

    1. 参数:
      1. hwnd:窗口句柄
      2. message:消息ID
      3. wParam和lParam:消息参数
    2. 宏定义:
      1. LRESULT、WPARAM、LPARAM:

        typedef UINT_PTR WPARAM;
        typedef LONG_PTR LPARAM;
        typedef LONG_PTR LRESULT;

        typedef _W64 unsigned int UINT_PTR, *PUINT_PTR;

        typedef _W64 long LONG_PTR, *PLONG_PTR;

      2. CALLBACK:#define CALLBACK    __stdcall
      3. HWND:DECLARE_HANDLE            (HWND);   与HINSTANCE的定义类似
      4. UINT:typedef unsigned int        UINT;

    三、窗口诞生过程总结

    1. 定义窗口类结构(WNDCLASS)
      1. #ifdef UNICODE
        typedef WNDCLASSW WNDCLASS;
        typedef PWNDCLASSW PWNDCLASS;
        typedef NPWNDCLASSW NPWNDCLASS;
        typedef LPWNDCLASSW LPWNDCLASS;
        #else
        typedef WNDCLASSA WNDCLASS;
        typedef PWNDCLASSA PWNDCLASS;
        typedef NPWNDCLASSA NPWNDCLASS;
        typedef LPWNDCLASSA LPWNDCLASS;
        #endif // UNICODE

      2. 结构成员:

        typedef struct tagWNDCLASSW {
        UINT style;                          //窗口类型
        WNDPROC lpfnWndProc;      //窗口过程(必须是回调函数)
        int cbClsExtra;                    //预留的额外空间,一般为0
        int cbWndExtra;                  //预留的额外空间,一般为0
        HINSTANCE hInstance;         //应用程序的实例句柄
        HICON hIcon;                      //为所有基于该窗口类的窗口设定一个图标
        HCURSOR hCursor;              //为所有基于该窗口类的窗口设定一个鼠标指针
        HBRUSH hbrBackground;      //指定窗口背景色
        LPCWSTR lpszMenuName;     //指定窗口菜单
        LPCWSTR lpszClassName;     //指定窗口类名
        } WNDCLASSW, *PWNDCLASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW;

    2. 注册窗口类
      1. RegisterClass:注册在随后调用CreateWindow函数和CreateWindowEx函数中使用的窗口类。
      2. 参数为lpWndClass,指向一个WNDCLASS结构的指针
      3. 返回值:ATOM的宏定义
        typedef WORD ATOM;
        typedef unsigned short WORD;
      4. 关于RegisterClassEx:参数lpwcx指向一个WNDCLASSEX结构的指针如果函数成功,返回这个窗口类型的标识号;如果函数失败,返回值为0。若想获得更多错误信息,请调用GetLastError函数。
    3. 创建窗口
      1. HWND WINAPI CreateWindow(
        _In_opt_   LPCTSTR  lpClassName, // 窗口类名称
        _In_opt_   LPCTSTR  lpWindowName, // 窗口标题
        _In_       DWORD     dwStyle, // 窗口风格,或称窗口格式
        _In_       int       x, // 初始 x 坐标
        _In_       int       y, // 初始 y 坐标
        _In_       int       nWidth, // 初始 x 方向尺寸
        _In_       int       nHeight, // 初始 y 方向尺寸
        _In_opt_   HWND    hWndParent, // 父窗口句柄
        _In_opt_   HMENU   hMenu, // 窗口菜单句柄
        _In_opt_   HINSTANCE   hInstance, // 程序实例句柄
        _In_opt_   LPVOID   lpParam // 创建参数
        );

      2. _In_说明该参数是输入的,_opt_说明该参数是可选参数
      3. 函数成功返回窗口句柄,否则返回NULL
    4. 显示窗口

      BOOL WINAPI ShowWindow(
      _In_ HWND hWnd,
      _In_ int nCmdShow
      );

      1. 第一次调用时应使用WinMain的参数nCmdShow作为参数
      2. 如果窗口之前可见,则返回非0否则返回0
    5. 更新窗口

      BOOL UpdateWindow(
      _In_ HWND hWnd
      );

      1. 绕过消息队列直接向窗口过程发送WM_PAINT消息
      2. 函数调用成功返回非0
    6. 消息循环
      1. BOOL WINAPI GetMessage(
        _Out_ LPMSG lpMsg,        //指向MSG结构
        _In_opt_ HWND hWnd,    //需要检索消息窗口的句柄,为NULL时检索所有的当前线程的窗口消息和线程消息,为-1时只检索当前线程消息
        _In_ UINT wMsgFilterMin,  //指定被检索的最小消息值得整数
        _In_ UINT wMsgFilterMax  //指定被检索的最大消息值得整数
        );

        1. 作用:从当前线程的消息队列里取出一个消息并放入MSG结构中,不能获得其他线程的消息
        2. 若消息队列为空,函数会一直等待到有消息到来才有返回值
        3. 返回值:
          1. 函数出现错误则返回-1,
          2. 获得WM_QUIT消息返回0
          3. 否则返回非0
      2. BOOL WINAPI TranslateMessage(
        _In_ const MSG *lpMsg
        );

        1. 该函数将虚拟键消息转换为字符消息。字符消息被寄送到调用线程的消息队列里,当下一次线程调用函数GetMessage或PeekMessage时被读出。
      3. LRESULT WINAPI DispatchMessage(
        _In_ const MSG *lpmsg
        );

        1. 分派一个消息给窗口过程
        2. 返回值为窗口过程返回的值,通常被忽略
  • 相关阅读:
    MINIBASE源代码阅读笔记之heapfile
    MINIBASE源代码阅读笔记之HFPage
    naive cube implementation in python
    C++中对已分配空间的指针调用一个类的构造函数
    作死自救日记——不小心修改linux下/etc/sudoers权限的解决办法
    TPC-H数据导入MySQL教程
    TeX Live & TeXstudio 安装手记
    Web开发入门知识小总结
    配置静态服务器和配置nfs
    数论们
  • 原文地址:https://www.cnblogs.com/wd1001/p/4867950.html
Copyright © 2020-2023  润新知