WinMain与WndProc以及窗口诞生过程总结
一、int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int nCmdShow)
- 四个参数:- hInstance:程序当前实例的句柄(handle to current instance),以后随时可以用GetModuleHandle(0)来获得
- hPrevInstance:前一个实例的句柄(handle to previous instance),在Win32中,每一个进程都有一个独立的4G地址空间,从0到2G属于进程私有,对其他进程来说是不可见的。所以,在Win32中,hPrevInstance总是为NULL。
- szCmdLine:指向以/0结尾的命令行,不包括EXE本身的文件名(pointer to command line),以后随时可以用GetCommandLine()来获取完整的命令行。
- iCmdShow:指明应该以什么方式显示主窗口(show state of window)。
 
- 宏定义:- WINAPI:#define WINAPI __stdcall 表示函数调用遵循__stdcall规则
- HINSTANCE:
DECLARE_HANDLE(HINSTANCE); 
 typedef HINSTANCE HMODULE;#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name 
- 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)
- 参数:- hwnd:窗口句柄
- message:消息ID
- wParam和lParam:消息参数
 
- 宏定义:- 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; 
- CALLBACK:#define CALLBACK __stdcall
- HWND:DECLARE_HANDLE (HWND); 与HINSTANCE的定义类似
- UINT:typedef unsigned int UINT;
 
- LRESULT、WPARAM、LPARAM:
三、窗口诞生过程总结
- 定义窗口类结构(WNDCLASS)- 
#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
- 结构成员:
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;
 
- 
- 注册窗口类
- 创建窗口- 
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 // 创建参数
 );
- _In_说明该参数是输入的,_opt_说明该参数是可选参数
- 函数成功返回窗口句柄,否则返回NULL
 
- 
- 显示窗口
 BOOL WINAPI ShowWindow( 
 _In_ HWND hWnd,
 _In_ int nCmdShow
 );- 第一次调用时应使用WinMain的参数nCmdShow作为参数
- 如果窗口之前可见,则返回非0否则返回0
 
- 更新窗口
 BOOL UpdateWindow( 
 _In_ HWND hWnd
 );- 绕过消息队列直接向窗口过程发送WM_PAINT消息
- 函数调用成功返回非0
 
- 消息循环- 
BOOL WINAPI GetMessage( 
 _Out_ LPMSG lpMsg, //指向MSG结构
 _In_opt_ HWND hWnd, //需要检索消息窗口的句柄,为NULL时检索所有的当前线程的窗口消息和线程消息,为-1时只检索当前线程消息
 _In_ UINT wMsgFilterMin, //指定被检索的最小消息值得整数
 _In_ UINT wMsgFilterMax //指定被检索的最大消息值得整数
 );- 作用:从当前线程的消息队列里取出一个消息并放入MSG结构中,不能获得其他线程的消息
- 若消息队列为空,函数会一直等待到有消息到来才有返回值
- 返回值:- 函数出现错误则返回-1,
- 获得WM_QUIT消息返回0
- 否则返回非0
 
 
- 
BOOL WINAPI TranslateMessage( 
 _In_ const MSG *lpMsg
 );- 该函数将虚拟键消息转换为字符消息。字符消息被寄送到调用线程的消息队列里,当下一次线程调用函数GetMessage或PeekMessage时被读出。
 
- 
LRESULT WINAPI DispatchMessage( 
 _In_ const MSG *lpmsg
 );- 分派一个消息给窗口过程
- 返回值为窗口过程返回的值,通常被忽略
 
 
- 
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号