來源: C++心得分享 ╮(╯_╰)╭: PreTranslateMessage()
前面提到在message loop中
用GetMessage()來取得message 再用DispatchMessage()來分發message
在這兩個function中間 我們可以照我們的意思來對message做修改
甚至可以在此把message給吃掉 不發出去
在MFC中 這個功能被包在 PreTranslateMessage() 中
每個windows元件(如dialog,button...等)的類別都是繼承自CWnd類別
在CWnd類別中 有個member function叫做PreTranslateMessage()
他會傳入一個MSG的指標 指標的內容便是這個message的資訊
包括 目標元件,message,wParam,lParam
我們可以修改其內容 這便會改變要發出去的message
或者是只要傳回 TRUE 便可以將這個message吃掉
PreTranslateMessage() 的使用方法只要在該元件的類別中改寫他的PreTranslateMessage()即可
範例程式如下
BOOL CMyDlg::PreTranslateMessage(MSG *pMsg) { BOOL rst = CDialog::PreTranslateMessage(pMsg); if(pMsg->message == WM_KEYDOWN || pMsg->message == WM_KEYUP ) { return TRUE; } return rst; } |
在以上的程式中 會把該CMyDlg中所有 鍵盤按下跟放開的message都吃掉
我們便不會再收到任何鍵盤的message了
要注意的是 不僅僅是dialog會收不到鍵盤message 在這dialog上面的其他window元件也都不會收到
因為任何一個window元件都會受到自己跟他parent 的PreTranslateMessage()影響
我們也可以寫成隻影響特定元件 只需要多判斷個hwnd即可
範例如下
BOOL CMyDlg::PreTranslateMessage(MSG *pMsg) { BOOL rst = CDialog::PreTranslateMessage(pMsg); if(pMsg->message == WM_KEYDOWN || pMsg->message == WM_KEYUP ) { if(pMsg->hwnd == this->m_hWnd) return TRUE; } return rst; } |
在dialog中有很多元件 我們或許會希望改變特定元件的特性
我們便可以在dialog中的PreTranslateMessage()做完成
全站熱搜
留言列表