C++:MSG 消息结构体
1. 定义与用途
在C++的Windows编程中,MSG是一个结构体类型,用于存储消息相关的信息。它是Windows API(应用程序编程接口)中的一部分,在处理窗口消息时起着关键的作用。通过GetMessage、PeekMessage等函数,可以将消息队列中的消息存储到MSG结构体中,以便后续对消息进行处理和分发。
2. 结构体成员介绍
hwnd(HWND类型):
这是接收消息的窗口句柄。在Windows操作系统中,每个窗口都有一个唯一的句柄,这个句柄用于标识窗口。当一个消息被发送到某个窗口时,hwnd成员就存储了这个目标窗口的句柄。例如,当用户在某个应用程序窗口中点击鼠标,产生的鼠标消息中的hwnd成员就指向这个被点击的窗口。
message(UINT类型):
这是消息标识符,用于唯一标识消息的类型。Windows定义了许多消息标识符,如WM_CREATE(窗口创建时发送)、WM_DESTROY(窗口销毁时发送)、WM_MOUSEMOVE(鼠标移动时发送)、WM_KEYDOWN(键盘按键按下时发送)等。这个成员告诉程序接收到的是哪种类型的消息,以便进行相应的处理。
wParam(WPARAM类型):
这是一个消息参数,其含义取决于具体的消息类型。它通常用于传递与消息相关的附加信息。例如,对于WM_KEYDOWN消息,wParam包含了按下的键的虚拟键码;对于WM_COMMAND消息(当用户操作菜单、按钮等控件时发送),wParam可能包含了控件的标识符等信息。
lParam(LPARAM类型):
这也是一个消息参数,同样其含义取决于消息类型。它可以用于传递更多的与消息相关的信息,并且常常与wParam一起提供完整的消息上下文。例如,对于WM_MOUSEMOVE消息,lParam的低位字包含了鼠标的当前x坐标,高位字包含了鼠标的当前y坐标,这样就可以确定鼠标在窗口中的位置。
time(DWORD类型):
这个成员记录了消息被放入消息队列的时间。它是以毫秒为单位,从系统启动开始计时的。虽然在大多数简单的应用程序中可能不会直接使用这个时间信息,但在一些需要精确记录消息时间顺序或者进行性能分析的场景下,这个时间戳可能会很有用。
pt(POINT类型):
这是一个包含x和y坐标的结构体,用于存储消息产生时鼠标的位置信息(对于鼠标相关的消息)。POINT结构体有两个成员:x和y,分别表示鼠标的横坐标和纵坐标。不过需要注意的是,对于某些消息,这个鼠标位置信息可能是相对于屏幕的,而对于另一些消息,可能是相对于接收消息的窗口客户区的。
3. 示例代码
以下是一个在消息循环中使用MSG结构体的示例:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { // 窗口类注册、窗口创建等操作省略 MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { // 根据msg.message判断消息类型并处理 if (msg.message == WM_MOUSEMOVE) { // 处理鼠标移动消息 int x = LOWORD(msg.lParam); int y = HIWORD(msg.lParam); // 在这里可以根据鼠标位置进行相应的操作,如更新窗口显示等 } TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }
在这个示例中,GetMessage函数获取消息并存储到msg结构体中。在消息循环中,通过检查msg.message成员来判断是否是WM_MOUSEMOVE消息。如果是,就从msg.lParam中提取鼠标位置信息(通过LOWORD和HIWORD宏分别获取横坐标和纵坐标),并可以根据这个位置信息进行相应的操作,如更新窗口中的鼠标光标位置指示或者其他与鼠标位置相关的操作。之后,通过TranslateMessage和DispatchMessage函数对消息进行进一步处理。