1 回答

TA貢獻1785條經驗 獲得超8個贊
參數返回值會根據不同的消息而不同
首先來解析一下這個函數
第一個參數HWND hWnd ,是要將這個消息發送的對象的句柄,hwnd一般指窗口句柄,但這里的窗口是廣義上的,一個按鈕,一個文本框,一個列表框等等控件這些都可以看成按鈕,所以傳它們的句柄也可以。
第二個參數UINT Msg就是要發送的消息是什么, 窗口消息一般都以WM開頭,意思是WindowMessage 取了2個字母, 而按鈕消息一般以BM開頭即ButtonMessage,靜態類的是
STM,列表框是LBM 等等。 總之你要發什么消息,這里就寫什么消息。
第三個和第四個參數是針對消息的附加參數。 這2個參數會參著所傳入的消息值的不同而變經。
WPARAM曾經在16位的WINDOWS當中是一個16位的整數即word parameter
LPARAM曾經在16位的WINDOWS當中是一個32位的整數即long parameter
當時要使用LPARAM一般都要用HIWORD和LOWORD宏來取LPARAM的高16位和低16位,因它們分別代表不同的東西。
而現在對于32位的操作系統來說,它們沒啥區別了,都是一個32位的整數,之所以沒改名稱,大概微軟為了兼容性吧。
其實在winuser.h中對它們都有定義,追蹤過去一般都可以看到是long類型。
此函數的返回值也會因為所發消息的不同而不同
舉個例子,當我們單擊了窗口中一個按鈕中,程序會將一個WM_COMMAND放入程序的消息隊列中,于是窗口可以對WM_COMMAND消息進行處理
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
WM_COMMAND, // the message to send
WPARAM wParam, // notification code and identifier
LPARAM lParam // handle to control (HWND)
);
這是MSDN中的說明,第一個肯定是窗口的句柄,第二個就是消息
第三個參數,指明了按鈕的通知碼和ID
wParam
The high-order word specifies the notification code if the message is from a control. If the message is from an accelerator, this value is 1. If the message is from a menu, this value is zero.
The low-order word specifies the identifier of the menu item, control, or accelerator
高位的字代表通知碼,低位字代表它的ID, 我們一般用HIWORD 和LOWORD來分離它們
比如id = LOWORD(wParam) 這樣
lParam
Handle to the control sending the message if the message is from a control. Otherwise, this parameter is NULL.
這個代表了控件的句柄,就是所點擊的那個按鈕的句柄。
再比如這個:
SendMessage(
(HWND) hWnd, // handle to destination window
BM_GETCHECK, // message to send
(WPARAM) wParam, // not used; must be zero
(LPARAM) lParam // not used; must be zero
);
這個BM_GETCHECK消息可以獲得一個復選框是否打勾
第一個參數,很顯然該寫上那個復選框的句柄
第二個參數,就是那個消息
第三和第四個參數在MSDN中寫的很清楚,不使用,必須寫0
所以調用時我們很明確要寫成
SendMessage(hwndCtrl,BM_GETCHECK,0,0);
而它的返回值可以是下邊的幾個
BST_CHECKED BST_INDETERMINATE BST_UNCHECKED
這個些在winuser.h中有宏定義的,它們本質就是一些整數,只不過這樣宏定義以后更容易理解
所以有時候我們就可以用一個if句判斷它是不是選中
if(BST_CHECKED == SendMessage(hwndCtrl,BM_GETCHECK,0,0))
{
//寫上處理代碼
}
OK 差不多就這些
- 1 回答
- 0 關注
- 326 瀏覽
添加回答
舉報