谈谈MSG中的 WPARAM 和 LPARAM .

地址:http://blog.csdn.net/ljd_1986413/article/details/6258604

第一: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字节的就行

 

 

 

MICROSOFT在使用时两种参数分别代表不同的含义和内容,WPARAM常常代表一些控件的ID或者高位底位组合起来分别表示鼠标的位置,如果消息的发送者需要将某种结构的指针或者是某种类型的句柄时,习惯上用LPARAM来传递,可以参考各种控件的通知消息:可以查看:EN_CHANGE (EDIT控件的一个通知消息),CBEM_INSERTITEM(可扩展组合框的可接受消息)等等来加以领会。
理论上在使用自定义消息时,WPARAM LPARAM的含义可以程序员任意指定的,但是最好遵从MFC中的习惯。在调用SendMessage()函数时,第二个参数是WPARAM,第三个参数是这个消息的LPARAM,但是你在程序中某个类中写下ON_MESSAGE()宏来处理这个消息时,处理函数SomeHandler(WPARAM,LPRAM(默认是0))中解释这两个参数时必须按照SendMessage调用中的意搜索义来进行。

你可能感兴趣的:(msg,Lparam,WPARAM)