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;
三、窗口诞生过程总结
定义窗口类结构(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;
注册窗口类
RegisterClass:注册在随后调用CreateWindow函数和CreateWindowEx函数中使用的窗口类。
参数为lpWndClass,指向一个WNDCLASS结构的指针
返回值:ATOM的宏定义
typedef WORD ATOM;
typedef unsigned short WORD;
关于RegisterClassEx:参数lpwcx指向一个WNDCLASSEX结构的指针如果函数成功,返回这个窗口类型的标识号;如果函数失败,返回值为0。若想获得更多错误信息,请调用GetLastError函数。
创建窗口
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
消息循环
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/66705.html