來源: 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;
}
如此便只會影響到我們所指定的hwnd


在dialog中有很多元件 我們或許會希望改變特定元件的特性
我們便可以在dialog中的PreTranslateMessage()做完成

huenlil 發表在 痞客邦 PIXNET 留言(0) 人氣()


留言列表 (0)

發表留言