經(jīng)常有人提出CDialog中響應鍵盤消息的OnKeyDown函數(shù)沒反應。結(jié)論是CDialog不響應OnKeyDown,相應的解決方法是:
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message == WM_KEYDOWN)
{
switch (pMsg->wParam)
{
case VK_LEFT:
break;
case VK_RIGHT:
break;
case VK_UP:
break;
case VK_DOWN:
break;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
經(jīng)過仔細研究發(fā)現(xiàn)CDialog是相應對應消息的OnKeyDown函數(shù)的,只是這個消息在到達窗體之前,已經(jīng)被它的子控件捕獲了,如果將窗體中的所有控件都刪除,窗體就會捕獲到這個消息,但要注意的是,MFC為了實現(xiàn)在窗體上切換子控件的焦點,已經(jīng)將 VK_TAB,VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN進行了處理,同時VK_RETURN也被系統(tǒng)捕獲用來處理相應的確定事件,所以即使窗體中沒控件,這幾個鍵還是無法捕獲,暫時只能用PreTranslateMessage解決。
一個窗體僅在它沒有可視和有效的控件時。響應OnKeyDown。
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message == WM_KEYDOWN)
{
switch (pMsg->wParam)
{
case VK_LEFT:
break;
case VK_RIGHT:
break;
case VK_UP:
break;
case VK_DOWN:
break;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
經(jīng)過仔細研究發(fā)現(xiàn)CDialog是相應對應消息的OnKeyDown函數(shù)的,只是這個消息在到達窗體之前,已經(jīng)被它的子控件捕獲了,如果將窗體中的所有控件都刪除,窗體就會捕獲到這個消息,但要注意的是,MFC為了實現(xiàn)在窗體上切換子控件的焦點,已經(jīng)將 VK_TAB,VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN進行了處理,同時VK_RETURN也被系統(tǒng)捕獲用來處理相應的確定事件,所以即使窗體中沒控件,這幾個鍵還是無法捕獲,暫時只能用PreTranslateMessage解決。
一個窗體僅在它沒有可視和有效的控件時。響應OnKeyDown。