windows程序中消息的传递1

头一回去正规软件公司实习,以前也没怎么接触过windows编程,刚刚工作一个月,终于摸到了一点门路,对windows消息的传递机制有了初步的了解。

1、PostMessage与SendMessage的区别

这点很多文章资料上都有:

SendMessage可以理解为,SendMessage函数发送消息,等待消息处理完成后,SendMessage才返回。稍微深入一点,是等待窗口处理函数返回后,SendMessage就返回了。

PostMessage可以理解为,PostMessage函数发送消息,不等待消息处理完成,立刻返回。稍微深入一点,PostMessage只管发送消息,消息有没有被送到则并不关心,只要发送了消息,便立刻返回。

2、PostMessage的参数传递

更多的内容在MSDN上可以查看,这里只写一点个人理解

一共四个参数:

(1) HWND hwnd:你要发送消息给谁,消息归谁处理,就写谁的窗口句柄

(2) UINT Msg 消息 自己定义的消息名称,与一个消息处理函数对应

(3) WPARAM 传递给消息处理函数的参数

(4) LPARAM   同上

这两个在早期的系统中有差别,前者16位,后者32位。在Win32中两者基本无差别,都是32位。在使用习惯上有所差异,MICROSOFT使用两种参数分别代表不同的含义和内容,WPARAM常常代表一些控件的ID或者高位底位组合起来分别表示鼠标的位置,如果消息的发送者需要将某种结构的指针或者是某种类型的句柄时,习惯上用LPARAM来传递。

由于这两个参数都是32位,和指针大小相同,传递参数时可以进行强制类型转换。比如传递多于两个参数时,经常使用结构体的指针进行参数的传递。

如:

struct ID

{

     int id;

     int number;

     long number2;

};

ID * param_id = new ID;

param_id->id = 0;

param_id->number = 1;

param_id->number2 = 2;

PostMessage(hwnd, WM_MESSAGE_ID, 0, (LPARAM)param_id);

这样,处理消息WM_MESSAGE_ID的函数就可以接收到param_id

3、消息处理函数

假如上例中处理WM_MESSAGE_ID的函数为OnGetInfo,如何使用LPARAM呢?仍然是通过强制转换。

ID * Info = (ID *)lParam;

int id = Info->id;

……

就可以顺利使用传过来的参数了

猜你喜欢

转载自blog.csdn.net/dpk1229/article/details/5822254