經(jīng)常有人提出CDialog中響應(yīng)鍵盤消息的OnKeyDown函數(shù)沒(méi)反應(yīng)。結(jié)論是CDialog不響應(yīng)OnKeyDown,相應(yīng)的解決方法是:
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)過(guò)仔細(xì)研究發(fā)現(xiàn)CDialog是相應(yīng)對(duì)應(yīng)消息的OnKeyDown函數(shù)的,只是這個(gè)消息在到達(dá)窗體之前,已經(jīng)被它的子控件捕獲了,如果將窗體中的所有控件都刪除,窗體就會(huì)捕獲到這個(gè)消息,但要注意的是,MFC為了實(shí)現(xiàn)在窗體上切換子控件的焦點(diǎn),已經(jīng)將 VK_TAB,VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN進(jìn)行了處理,同時(shí)VK_RETURN也被系統(tǒng)捕獲用來(lái)處理相應(yīng)的確定事件,所以即使窗體中沒(méi)控件,這幾個(gè)鍵還是無(wú)法捕獲,暫時(shí)只能用PreTranslateMessage解決。
一個(gè)窗體僅在它沒(méi)有可視和有效的控件時(shí)。響應(yīng)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)過(guò)仔細(xì)研究發(fā)現(xiàn)CDialog是相應(yīng)對(duì)應(yīng)消息的OnKeyDown函數(shù)的,只是這個(gè)消息在到達(dá)窗體之前,已經(jīng)被它的子控件捕獲了,如果將窗體中的所有控件都刪除,窗體就會(huì)捕獲到這個(gè)消息,但要注意的是,MFC為了實(shí)現(xiàn)在窗體上切換子控件的焦點(diǎn),已經(jīng)將 VK_TAB,VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN進(jìn)行了處理,同時(shí)VK_RETURN也被系統(tǒng)捕獲用來(lái)處理相應(yīng)的確定事件,所以即使窗體中沒(méi)控件,這幾個(gè)鍵還是無(wú)法捕獲,暫時(shí)只能用PreTranslateMessage解決。
一個(gè)窗體僅在它沒(méi)有可視和有效的控件時(shí)。響應(yīng)OnKeyDown。

