重载PreTranslateMessage函数:
在Class Wizard里,重载该函数,要重载哪个类就选该类下的Virtual Functions:
重载PreTranslateMessage函数如下:
BOOL CPIToolDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE) return TRUE;
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN) return TRUE;
return CDialogEx::PreTranslateMessage(pMsg);
}
上面代码就是取消按 ESC 和 Enter 键后程序退出功能。
如果要回车键相应某个控件(如编辑框的相应),参考如下:
BOOL CConfigure::PreTranslateMessage(MSG* pMsg)
{
if ((WM_KEYFIRST <= pMsg->message) && (pMsg->message<=WM_KEYLAST))
{
if (pMsg->wParam == VK_RETURN)
{
HWND hWnd = ::GetFocus();
int iID = ::GetDlgCtrlID(hWnd);
if (iID == IDC_EDIT_CFGDATA)
{
CString sData;
sData.Empty();
int lenData = 0;
GetDlgItemText(IDC_EDIT_CFGDATA,sData);
sData += "\r\n";
SetDlgItemTextA(IDC_EDIT_CFGDATA,sData);
lenData = sData.GetLength();
((CEdit*)GetDlgItem((IDC_EDIT_CFGDATA))) -> SetSel(lenData,lenData);
}
else
::SetFocus(hWnd);
return TRUE;
}
}
return FALSE;
}
上例中,将回车后的光标放置在当前编辑框控件上,如果要将光标放置在当前对话框上,不要在某个控件上,只需将else下面的::SetFocus(hWnd)更改为::SetFocus(m_hWnd)即可。
hWnd是自己定义获取的控件句柄,m_hWnd是系统自带固定的句柄。