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. 返回值为窗口过程返回的值,通常被忽略
时间: 2024-10-16 02:52:07

WinMain与WndProc以及窗口诞生过程总结的相关文章

VC++编程之第三课笔记——MFC窗口创建过程以及窗口类的封装

第三课 MFC窗口创建过程以及窗口类的封装 MFC的每一个类都是以C开头的,表明这是一个Class. 工程包含(单文档) 创建工程名为aaa的工程(单文档)时,在类视图中可看见五个类: CAboutDlg CMainFrame CAaaApp CAaaDoc CAaaView 其中: 类CAboutDlg继承自CDialog类,对话框的类 类CMainFrame继承自CFrameWnd类,创建整个程序的框架窗口 类CAaaApp继承自CWinApp类,创建唯一的应用程序对象 类CAaaDoc继承

非易失性MRAM诞生过程

MRAM技术是以可沉积在标准逻辑制程上的磁性隧道结 (MTJ)储存单元为基础,MTJ中包含了一个维持单一极性方向的固定层,和一个通过隧道结与其隔离的自由层.当自由层被施予和固定层相同方向的极化时,MTJ的隧道结便会显现出低电阻特性.而当自由层被施予反方向的极化时,MTJ便会有高电阻.此一磁阻效应可使MRAM不需改变内存状态,便能快速读取数据.在MRAM存储器中有一个富含创造性的设计,这也是EVERSPIN的专利. 在MRAM的诞生过程中,设计的难点和关键节点,在于一个小电流通过"自由层"

(转)C#在父窗口中调用子窗口的过程(无法访问已释放的对象)

C#在父窗口中调用子窗口的过程: 1. 创建子窗口对象 2. 显示子窗口对象 笔者的程序中,主窗体MainFrm通过菜单调用子窗口ChildFrm.在窗体中定义了子窗口对象,然后在菜单项点击事件中,加入了如下代码来创建和显示子窗口: Private childFrm myChildFrm = null; //定义子窗口对象 private void OpenChildFrmToolStripMenuItem_Click(object sender, EventArgs e) { myChildF

MFC应用程序创建窗口的过程 good

MFC应用程序中处理消息的顺序 1.AfxWndProc()      该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc()  该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,然后调用WindowProc()函数 3.WindowProc()      该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数 4.OnWndMsg()        该函

uCGUI窗口初始化过程

一.相关结构体和变量 重要的uCGUI系统全局变量 NextDrawWin                      下一个需要重绘的窗口句柄 WM__NumWindows       系统当前的总共窗口总数 WM__NumInvalidWindows   系统当前无效的窗口总数,这些窗口都需要重绘的 WM__FirstWin                    系统第一个窗口的句柄,默认的就是桌面窗口,桌面窗口的句柄就是1.在创建桌面窗口的时候,会将桌面窗口的句柄,付给该全局变量,该动作发生

wxWidgets源码分析(6) - 窗口关闭过程

目录 窗口关闭过程 调用流程 关闭文档 删除视图 删除文档对象 关闭Frame App清理 多文档窗口的关闭 窗口的正式删除 窗口关闭过程总结 如何手工删除view 窗口关闭过程 调用流程 用户点击窗口的关闭按钮后,Win32系统会向当前的Frame对象发送WM_CLOSE消息,此时会进入到Frame的wxFrame::MSWWindowProc函数进行处理: WXLRESULT wxFrame::MSWWindowProc(WXUINT message, WXWPARAM wParam, WX

SetWindowLong设置窗口新过程

函数原型:LONG SetWindowLong(HWND hWnd,  int nIndex,  LONG dwNewLong); 主要说明函数的第二个参数为GWL_WNDPROC的情况. GWL_WNDPROC Sets a new address for the window procedure. You cannot change this attribute if the window does not belong to the same process as the calling

android的窗口创建过程

待补充! 一个窗口本质上是一个view,而Window类只是一个应用窗口的抽象. ①    启动activity的代码本质,是一个创建activity的过程,是由ActivityThread完成的.其代码如下: 2109 Activity activity = null; 2110 try { 2111 java.lang.ClassLoader cl = r.packageInfo.getClassLoader(); 2112 activity = mInstrumentation.newAc

【产品规划】一个APP的诞生过程

1.idea形成—APP项目雏形 一个APP项目的最初首先要确定项目整体方案,整个项目的规划,大体框架,做成文档展现出来,以便大家提意见和更好的改进.也就是说首先要确立产品原型,进入项目评估阶段.经过反复确认,最终形成产品脑图和完整的需求文档. 2.功能设计—APP项目概要设计 第二步相当于网站的需求分析,需要整理确定App的主要用户群体和APP能实现的功能.关于APP开发设计可以在DevStore(开发者服务商店)平台上借助一些工具来充实你的APP,像结合推送.地图.社交分享.第三方登录等常用