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一樣,大家都這么用,也就成了不成文的規定。