WPARAM 和 LPARAM,消息响应机制以及LPVOID的说明 

LPVOID是一个无类型的指针,常用于参数传递,如在CMyClass的StartThread函数中。WPARAM和LPARAM是Win16API遗留下来的参数,原本代表16位和32位整型,但在Win32API中它们都是32位,通常WPARAM用于传递控件ID等信息,LPARAM用于传递结构指针或句柄。消息响应机制中,消息由消息名称、WPARAM和LPARAM组成,窗口过程根据消息类型进行处理。MFC中通过ON_MESSAGE宏处理自定义消息,并在窗口过程里解释这两个参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LPVOID  

LPVOID是一个没有类型的指针,也就是说你可以将任意类型的指针赋值给LPVOID类型的变量(一般作为参数传递),然后在使用的时候在转换回来。
  可以将其理解为long型的指针,指向void型。
  例如:
  class CMyClass
  {
  void Start();
  static UINT StartThread(LPVOID lParam);
  };
  void CMyClass::Start()
  {
  AfxBeginThread(StartThread, this);
  }
  UINT CMyClass::StartThread(LPVOID lParam)
  {
  CMyClass * pMyClass = (CMyClass*)lParam;
  ...
  return 0;
  }

WPARAM 和 LPARAM,消息响应机制
wParam和lParam 这两个是Win16系统遗留下来的产物,在Win16API中WndProc有两个参数:
一个是WORD类型的16位整型变量;另一个是LONG类型的32位整型变量。因此根据匈牙利命名法,16位的变量就被命名为wParam, 32位的变量就被命名为lParam。

到了Win32API中,原来的16位变量也被扩展为32位,因此此时wParam和lParam的大小完全相同。
在Win32API的早期,为了保

<think>嗯,用户想了解C++中的LPARAMWPARAM。这两个类型在Windows编程中经常出现,尤其是处理消息的时候。我得先回忆一下它们的基本定义作用。 首先,LPARAMWPARAMWindows API中用于消息传递的参数类型。它们通常出现在窗口过程函数WndProc中,作为消息的附加信息。记得在早期的Windows版本中,WPARAM是16位的,而LPARAM是32位的,后来在Win32之后都变成了32位64位,根据系统架构不同而变化。现在在64位系统中,WPARAM是32位,LPARAM是64位吗?可能需要确认一下具体的数据类型定义。 然后,它们的名字由来。WPARAM可能代表“Word Parameter”,而LPARAM代表“Long Parameter”,这源于16位Windows时代的术语,当时WORD是16位,LONG是32位。但进入32位64位后,它们的实际大小可能有所调整。例如,在32位系统中,WPARAM是16位升级到32位了吗?或者保持原样?需要查证。 接下来,它们在消息处理中的应用。比如,WM_COMMAND消息中,WPARAM的高位字可能是通知码,低位字是控件ID,而LPARAM可能是控件的句柄。例如,处理按钮点击时,这些参数如何分解。另外,WM_LBUTTONDOWN消息中,LPARAM可能包含鼠标的坐标,需要解包为xy值。而WPARAM可能包含键盘状态,比如是否按下了Shift或Ctrl键。 用户可能需要具体的例子来说明如何使用这两个参数。比如,在窗口过程中,如何提取信息。例如,使用LOWORDHIWORD宏来分解WPARAM,或者使用GET_X_LPARAMGET_Y_LPARAM来获取坐标。同时,不同的消息可能有不同的参数用法,需要根据消息类型来处理。 另外,需要注意在64位系统下的兼容性问题。因为LPARAM是64位的,而WPARAM是32位的,所以在进行指针类型转换时要小心。例如,使用SendMessage传递指针时,可能需要将指针转换为LPARAM,或者在WPARAM的情况下,如果指针是32位,可能会被截断,所以应该使用合适的类型转换宏,比如LPVOIDLPARAM。 用户可能想知道为什么需要这两个参数,而不是直接传递结构体或者其他类型。这可能与Windows API的历史设计有关,保持消息参数的通用性,允许不同的消息携带不同类型的数据,通过参数组合来传递更多信息。 最后,应该提醒用户在实际编程中参考具体的文档,因为不同的消息对这两个参数的解释不同,正确使用它们需要查阅每个消息的定义。例如,WM_SIZE消息wParam表示调整大小的类型,而lParam则包含窗口的新宽度高度,需要分解为两个16位或32位的值。 总结起来,LPARAMWPARAM消息处理中传递附加信息的参数,具体含义取决于消息类型,使用时需要结合消息文档进行解析,并注意数据类型在不同架构下的差异。需要给出具体的例子注意事项,帮助用户理解如何正确使用它们。</think>在C++的Windows编程中,`LPARAM``WPARAM`是消息处理机制中的核心参数类型。以下是逐步解析: --- ### **1. 基本定义** - **LPARAM**:全称 *Long Parameter*,早期表示32位整数(32位系统),64位系统下扩展为64位。 - **WPARAM**:全称 *Word Parameter*,早期表示16位整数(16位Windows),32/64位系统下为32位。 它们在Windows头文件中的定义: ```cpp // 32位系统 typedef LONG_PTR LPARAM; // 32位或64位,取决于编译环境 typedef UINT_PTR WPARAM; // 32位 // 64位系统 typedef __int64 LPARAM; // 64位 typedef unsigned int WPARAM; // 32位 ``` --- ### **2. 消息处理中的作用** 在窗口过程函数`WndProc`中,这两个参数携带消息的附加信息: ```cpp LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); ``` - **msg**:消息类型(如`WM_KEYDOWN`, `WM_CLOSE`)。 - **wParam** **lParam**:消息的具体数据,其含义由`msg`决定。 --- ### **3. 典型应用场景** #### **示例1:鼠标消息 `WM_LBUTTONDOWN`** - **wParam**:表示键盘/鼠标状态(如`MK_SHIFT`是否按下)。 - **lParam**:低16位为鼠标X坐标,高16位为Y坐标。 ```cpp case WM_LBUTTONDOWN: { int x = GET_X_LPARAM(lParam); // 宏解包X坐标 int y = GET_Y_LPARAM(lParam); // 宏解包Y坐标 if (wParam & MK_SHIFT) { // Shift键被按下时处理逻辑 } break; } ``` #### **示例2:键盘消息 `WM_KEYDOWN`** - **wParam**:按下的虚拟键码(如`VK_ESCAPE`对应ESC键)。 - **lParam**:包含重复次数、扫描码等详细信息。 ```cpp case WM_KEYDOWN: { if (wParam == VK_ESCAPE) { DestroyWindow(hWnd); // 按下ESC关闭窗口 } break; } ``` #### **示例3:窗口尺寸变化 `WM_SIZE`** - **wParam**:窗口调整类型(如`SIZE_MAXIMIZED`表示最大化)。 - **lParam**:低16位为窗口新宽度,高16位为高度。 ```cpp case WM_SIZE: { UINT width = LOWORD(lParam); UINT height = HIWORD(lParam); // 根据新尺寸调整布局 break; } ``` --- ### **4. 注意事项** 1. **参数解包**:使用Windows提供的宏(如`LOWORD`, `HIWORD`, `GET_X_LPARAM`)确保跨平台兼容性。 2. **类型转换**:传递指针时,需显式转换为`LPARAM`: ```cpp SendMessage(hWnd, MY_MSG, 0, (LPARAM)&myData); ``` 3. **消息文档**:不同消息对参数的解释不同,必须查阅[官方文档](https://learn.microsoft.com/en-us/windows/win32/winmsg/about-messages-and-message-queues)。 --- ### **5. 总结** - `LPARAM``WPARAM`是Windows消息机制的通用参数容器。 - 具体含义完全依赖于消息类型(`msg`)。 - 合理使用宏类型转换是正确处理消息数据的关键。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值