十三:谈谈MSG中的 WPARAM 和 LPARAM

本文详细解释了Windows消息处理中的WPARAM和LPARAM参数的作用及意义,包括它们如何用于传递消息特有信息,如鼠标坐标、按键状态等,并举例说明自定义消息时如何使用。

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

第一:WPARAM 和 LPARAM 是什么东西

         typedef uint wparam;//就是无符号整形
         typedef long lparam;//就是长整形

         typedef   struct   tagMSG  

                             {           //   msg      
                                  HWND   hwnd;       //窗口句柄  
                                  UINT   message;       //消息常量标识符  
                                  WPARAM   wParam;     //32位消息的特定附加信息,具体表示什么处决于message  
                                  LPARAM   lParam;     //32位消息的特定附加信息,具体表示什么处决于message  
                                  DWORD   time;       //消息创建时的时间  
                                  POINT   pt;               //消息创建时的鼠标位置  
                              }   MSG;  
        hwnd   接收消息的32位窗口句柄。窗口可以是任何类型的屏幕对象,  
        因为Win32能够维护大多数可视对象的句柄(窗口、对话框、按钮、编辑框等)。  
        message   用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也可以是自定义的常量。  
        wParam   通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。通常用于存储小段信息,如标志  
        lParam   通常是一个指向内存中数据的指针,通常用于存储消息所需的对象。 
        由于wParam,lParam和指针都是32位的,需要时可以强制类型转换。具体表示什么,与message相关,

        他们是事先定义好的。  
        如果自定义消息:#define   WM_MYMESSAGE   WM_USER+100,需确定wParam,lParam的意义  
        (假设wParam=0时发送数据,wParam=1时接收数据,lParam为CMyClass*   指针,指向一个CMyClass对象,

        准备要发送的数据或接收数据  
        发送WM_MYMESSAGE时   SendMessage(hwnd,WM_MYMESSAGE,0,pMyClassObject)  
        接收消息的窗口,接收WM_MYMESSAGE中(CMyClass*)lParam参数即pMyClassObject传过来的数据

第二:WPARAM 和 LPARAM 所代表的意义

         是两个消息参数,相当于长整数。例如一个鼠标左键按下的消息WM_LBUTTONDOW,那么左键按下时,鼠标位置在那里呢?

         就需要用LPARAM参数来传递鼠标位置信息。

         如://鼠标坐标
         point.x=LOWORD(pMsg->lParam);//LOWORD取低位 后面四位 相对于客户窗体左上角的X偏移值
         point.y=HIWORD(pMsg->lParam);//HIWORDs取高位 前面四位 相对于客户窗体左上角的Y偏移值

          还有其他的信息在这个时候也要知道,就是Ctrl键是否也按下了等信息。

         查看一下MSDN关于WM_LBUTTONDOW的帮助,你可以明白很多。

         懒人的问题真多,对于自己定义的消息,你想在WPARAM   和   LPARAM里传什么参数,接受到的就是什么参数,比如说:
         char   str[]= "abcde ";
         myWnd.SendMessage(   WM_MYMESSAGE,   (LPARAM)str,   0   );
         这样接收到的wParam就可以当字符串处理。对于Windows预定义的消息,各自的这两个参数包含的信息各不相同。

         param是parameter(参数)的意思
         wParam和lParam都作为函数的参数 
    

         WPARAM:32位(双字节)的消息参数。值的格式和意思取决于主要的事件消息类型。在不同的情况下,WPARAM变元可能传输一个坐标点对,使用低字值标识次要的消息类型,提供某些其他的数据类型,或被完全忽略。在很多情况下,WPARAM值将被看成两个独立的字值,分别具有不同的功能。

         LPARAM:32位(长整型)的消息参数。这个参数的值和意思取决于主事件消息类型。在不同的情况下,LPARAM变元可能提供一个字符串或记录结构的指针,分解为一组字、字节或标志值,或者往往完全没有用。

         作为参数,在32为系统上它们的类型就是unsigned int,根据情况你可以放不同的数据、指针,只要是4字节的就行

<think>我们正在讨论MFC中的OnCommand函数。根据引用[2],OnCommand是响应WM_COMMAND消息的,一般用于响应控件菜单的命令消息。它的两个参数是WPARAMwParamLPARAMlParam。引用[2]提到,如果WM_COMMAND消息来自控件,那么lParam是发送消息的控件的句柄,否则为0。此外,wParam的低位字(使用LOWORD宏获取)表示菜单项、控件或快捷键的ID值,而高位字(HIWORD)表示通知码(例如按钮的点击通知BN_CLICKED)。引用[3][4]则提供了MFC消息机制的背景知识。MFC封装了消息处理,使得我们可以通过类的成员函数来处理消息,而不是像传统的Windows程序那样使用switch/case语句。因此,OnCommand函数的参数含义及用途如下:-WPARAMwParam:这个参数的低16位(LOWORD(wParam))包含了命令ID,比如按钮的ID(如IDC_BTN_BEGIN)。高16位(HIWORD(wParam))包含了通知码,用于标识控件通知的类型(例如,按钮被点击时,通知码为BN_CLICKED)。-LPARAMlParam:如果消息来自控件,那么lParam是发送该消息的控件的窗口句柄(HWND);如果消息来自菜单或快捷键,那么lParam为0。通过重写OnCommand函数,我们可以处理多个控件的命令消息,而不需要为每个命令单独写消息映射消息处理函数。在OnCommand中,我们可以通过wParamlParam来区分不同的命令来源,并执行相应的操作。下面是一个示例,展示如何在OnCommand中处理按钮点击消息:```cppBOOLCDlgTest::OnCommand(WPARAMwParam,LPARAMlParam){switch(LOWORD(wParam))//获取命令ID{caseIDC_BTN_BEGIN://开始按钮的IDAfxMessageBox(_T("开始"));break;caseIDC_BTN_END://结束按钮的IDAfxMessageBox(_T("结束"));break;}returnCDialog::OnCommand(wParam,lParam);}```在上面的代码中,当ID为IDC_BTN_BEGIN的按钮被点击时,弹出一个消息框显示“开始”。同样,当ID为IDC_BTN_END的按钮被点击时,显示“结束”。注意,这里我们只处理了我们关心的命令ID,其他的命令则交给基类(CDialog)的OnCommand函数处理。需要注意的是,如果我们在OnCommand中处理了某个命令,并且不希望基类再处理它,我们可以返回TRUE。如果返回FALSE(或基类的处理结果),则基类会继续处理。引用[4]也指出,MFC的消息机制允许使用私有类处理消息,而不需要使用传统的switch/case语句,这就是为什么MFC提供了消息映射机制。然而,OnCommand是一个特殊的处理函数,它允许我们集中处理多个命令。总结:-wParam:低16位为命令ID,高16位为通知码。-lParam:若消息来自控件,则为控件的句柄;否则为0。这样,我们就可以在OnCommand函数中根据命令ID来执行不同的操作,同时也可以根据通知码或控件句柄进行更精细的控制。</think> ### MFC中`OnCommand`函数参数详解 在MFC框架中,`OnCommand`函数是处理**WM_COMMAND消息**的核心成员函数,其参数结构如下: ```cpp virtual BOOL CWnd::OnCommand(WPARAM wParam, LPARAM lParam); ``` #### 参数含义及功能: 1. **`WPARAM wParam`** - **低16位 (LOWORD(wParam))**: 控件的命令ID或菜单项ID *示例:用户点击IDC_BUTTON1时,LOWORD(wParam)=IDC_BUTTON1* - **高16位 (HIWORD(wParam))**: 通知代码(控件事件类型) *常见值:BN_CLICKED(按钮点击)、EN_CHANGE(编辑框内容变化)* 2. **`LPARAM lParam`** - 当消息来自**控件**时:发送WM_COMMAND消息的控件窗口句柄(HWND) - 当消息来自**菜单或加速键**时:值为0 #### 典型处理流程: ```cpp BOOL CMyDialog::OnCommand(WPARAM wParam, LPARAM lParam) { UINT nID = LOWORD(wParam); // 提取命令ID UINT nCode = HIWORD(wParam);// 提取通知码 switch(nID) { case IDC_BTN_OK: // 按钮ID处理 if(nCode == BN_CLICKED) OnOK(); break; case ID_MENU_SAVE: // 菜单项ID处理 SaveData(); break; } return CDialog::OnCommand(wParam, lParam); // 其他消息交基类处理 } ``` #### 设计特点: 1. **集中式命令处理**:避免为每个控件单独编写消息映射,适合批量处理相关命令(如对话框控件) 2. **控件识别机制**:通过`lParam`可直接获取发送消息的控件句柄 3. **消息分流**:MFC内部会先将消息路由到`OnCmdMsg()`,再进入`OnCommand`[^3][^4] > 注意:当重写`OnCommand`时,必须对未处理的消息调用基类实现(如`CDialog::OnCommand`),否则会导致标准消息(如IDOK/IDCANCEL)无法正常处理[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值