MSG结构具有如下形式:
1 typedef struct tagMSG { 2 HWND hwnd; 3 UINT message; 4 WPARAM wParam; 5 LPARAM lParam; 6 DWORD time; 7 POINT pt; 8 DWORD lPrivate; 9 } MSG, *PMSG, *NPMSG, *LPMSG;
MSG结构中包含了线程的消息队列中的消息信息。
hwnd | 标识了接收的消息的窗口过程所属的窗口的句柄。 |
message | 指定了消息号。 WM_XXX |
wParam | 指定了消息的附加信息。具体的含义与message成员的值有关。实际上为 unsigned int |
lParam | 指定了消息的附加信息。具体的含义与message成员的值有关。实际上为 long |
time | 指定了发出消息的时间。消息队列时间 |
pt | 指定了发出消息时光标位置的屏幕坐标。 当前鼠标位置 |
1 int WINAPI WinMain( 2 HINSTANCE hInstance, 3 HINSTANCE hPrevInstance, 4 LPSTR lpCmdLine, 5 int nShowCmd 6 );
WINAPI 其实就是 __stdcall 即调用约定
hInstance:表示改程序的当前运行的实例句柄。
hPrevInstance:表示当前实例的前一个句柄。Win32环境下参数为NULL。
lpCmdLine:是一个以空终止的字符串,指定传递给应用程序的命令行参数。
nShowCmd:指定程序的窗口应该如何显示。
创建窗口的过程:
1、设计一个窗口类
2、注册窗口类
3、创建窗口
4、显示及更新窗口
1、设计一个窗口类
窗口特征WNDCLASS结构体:
1 typedef struct _WNDCLASS 2 { 3 UINT style; ==》指定窗口的样式 4 WNDPROC lpfnWndProc; ==》 lpfnWndProc 是一个函数指针,指向窗口过程函数,窗口过程函数是一个回调函数。 5 int cbClsExtra; ==》 该参数没有使用,直接设置为0即可。 6 int cbWndExtra; ==》 该参数没有使用,直接设置为0即可。 7 HANDLE hInstance; ==》 hInstance 指向包含窗口过过程的程序的实例句柄。即WinMain里的句柄。 8 HICON hIcon; ==》 指定窗口类的图标句柄。如果加载的是系统的标准图标,那么第一个参数必须为NULL。 9 HCURSOR hCursor; ==》和上面一样。 10 HBRUSH hbrBackground; ==》指定窗口类的背景画刷句柄。 11 LPCTSTR lpszMenuName; ==》指定菜单资源的名字。 12 LPCTSTR lpszClassName; ==》指定窗口类的名字。 13 } WNDCLASS;
2、注册窗口类
设计完成后,需要调用RegisterClass进行注册,参数为创建窗口类对象的指针。
3、创建窗口
1 HWND CreateWindow( 2 LPCTSTR lpClassName, ==》 指定窗口名称 3 LPCTSTR lpWindowName, ==》指定窗口的名字。如果窗口样式指定了标题栏,那么窗口名字将会显示到标题栏上。 4 DWORD dwStyle, ==》 指定创建窗口的样式。 5 int x, 6 int y, 7 int nWidth, 8 int nHeight, 9 HWND hWndParent, ==》 指定被创建窗口的父窗口句柄。 10 HMENU hMenu, ==》 指定窗口餐单的句柄 11 HANDLE hInstance, ==》 指定窗口所属的应用程序实例的句柄。 12 PVOID lpParam ==》 多数窗口设置为 NULL 13 );
4、显示及更新窗口
(1)显示窗口
1 BOOL ShowWindow( 2 HWND hWnd, 3 int nCmdShow ==》 指定窗口的显示状态 4 );
(2)更新窗口
1 BOOL UpdateWindow( 2 HWND hWnd 3 );