WPARAM和LPARAM这俩玩意儿,说白了就是Win16时代留下来的老古董。那时候在Win16 API里,WndProc函数有两个参数:一个叫WORD的16位整数,另一个是LONG类型的32位整数。按匈牙利命名法嘛,16位的就叫wParam,32位的就是lParam咯。
到了Win32 API的时候,16位的变量也变成32位了,所以现在wParam和lParam其实大小一样,都是32位。不过为了兼容老代码,MS就搞了WPARAM和LPARAM这两个宏来定义。保留w开头一方面是因为WPARAM宏本身是以W开头的,另一方面也是提醒程序员注意兼容性问题。不过现在Win16早就没人用了,这个命名习惯也就沿用下来了。
举个例子吧,比如主程序MyDlg.cpp:
1. 先自定义个消息:
cpp
define WM_TRAY WM_USER + 100
2. 然后声明函数原型:
cpp
afx_msg LRESULT OnTrayNotify(WPARAM wParam, LPARAM lParam);
3. 消息映射部分写上:
cpp
ON_MESSAGE(WM_TRAY, OnTrayNotify)
4. 接着实现这个函数:
cpp
LRESULT CMyDlg::OnTrayNotify(WPARAM wParam, LPARAM lParam)
{
return m_tray.OnTrayNotify(wParam, lParam);
}
再看托盘类Tray.cpp里的实现:
cpp
int OnTrayNotify(WPARAM wID, LPARAM lEvent)
{
if (wID == TRAYNOTIFYDATA.uID)
return 0;
if (lEvent == WM_LBUTTONDOWN) {
// 处理左键点击逻辑
}
else if (lEvent == WM_RBUTTONDOWN) {
// 处理右键点击逻辑
}
return 0;
}
从本质上讲,WPARAM和LPARAM没啥区别,都是32位的数字。但微软在使用时给它们赋予了不同的含义。WPARAM通常用来表示控件ID或者高低位组合起来表示鼠标坐标之类的;LPARAM则常常用于传递结构体指针或句柄这类更复杂的数据类型。
说到底,它们之间的差异更多是约定俗成的用途不同,而不是技术上的硬性规定。就像你写代码的时候习惯把循环变量叫i、j一样,大家都这么用,也就成了不成文的规定。
到了Win32 API的时候,16位的变量也变成32位了,所以现在wParam和lParam其实大小一样,都是32位。不过为了兼容老代码,MS就搞了WPARAM和LPARAM这两个宏来定义。保留w开头一方面是因为WPARAM宏本身是以W开头的,另一方面也是提醒程序员注意兼容性问题。不过现在Win16早就没人用了,这个命名习惯也就沿用下来了。
举个例子吧,比如主程序MyDlg.cpp:
1. 先自定义个消息:
cpp
define WM_TRAY WM_USER + 100
2. 然后声明函数原型:
cpp
afx_msg LRESULT OnTrayNotify(WPARAM wParam, LPARAM lParam);
3. 消息映射部分写上:
cpp
ON_MESSAGE(WM_TRAY, OnTrayNotify)
4. 接着实现这个函数:
cpp
LRESULT CMyDlg::OnTrayNotify(WPARAM wParam, LPARAM lParam)
{
return m_tray.OnTrayNotify(wParam, lParam);
}
再看托盘类Tray.cpp里的实现:
cpp
int OnTrayNotify(WPARAM wID, LPARAM lEvent)
{
if (wID == TRAYNOTIFYDATA.uID)
return 0;
if (lEvent == WM_LBUTTONDOWN) {
// 处理左键点击逻辑
}
else if (lEvent == WM_RBUTTONDOWN) {
// 处理右键点击逻辑
}
return 0;
}
从本质上讲,WPARAM和LPARAM没啥区别,都是32位的数字。但微软在使用时给它们赋予了不同的含义。WPARAM通常用来表示控件ID或者高低位组合起来表示鼠标坐标之类的;LPARAM则常常用于传递结构体指针或句柄这类更复杂的数据类型。
说到底,它们之间的差异更多是约定俗成的用途不同,而不是技术上的硬性规定。就像你写代码的时候习惯把循环变量叫i、j一样,大家都这么用,也就成了不成文的规定。