摘自:http://blog.csdn.net/howard_liu1314/article/details/8222357
项目中要对对话框的键盘按键做出相应,实现逻辑如下:
VS2005开发MFC的wince项目;在对话框中‘重写’ PreTranslateMessage方法;
1.头文件中添加:virtual BOOL PreTranslateMessage(MSG* pMsg);
2.cpp文件的实现代码:
BOOL CSystemSetupDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN)
{
UINT iKey=(UINT)pMsg->wParam;
switch(iKey)
{
case VK_F1:
//可以用GetKeyState()检测按键状态
if(GetKeyState(VK_CONTROL)<0)
{
//CTRL+F1的处理逻辑
}
break;
case VK_F2:
if(GetKeyState(VK_CONTROL)<0)
{
//CTRL+F2的处理逻辑
}
break;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
这样对话框就能相应键盘按键消息了。
3.CEDIT控件只允许输入数字
BOOL CXXDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO:Add your specialized code here and/or call the base class
CEdit*pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
ASSERT(pEdit &&pEdit->GetSafeHwnd());
//可以使用pEdit->m_hwnd替代GetSafeHwnd
if((WM_KEYDOWN == pMsg->message)&&(pEdit->GetSafeHwnd() ==pMsg->hwnd))
{
if((pMsg->wParam >= _T('0')&& pMsg->wParam<= _T('9'))
|| ((pMsg->wParam >= VK_NUMPAD0)&& (pMsg->wParam<= VK_NUMPAD9))
|| (_T('*') == pMsg->wParam) || (_T('#') ==pMsg->wParam)
|| (VK_LEFT == pMsg->wParam) || (VK_RIGHT ==pMsg->wParam)
|| (VK_UP == pMsg->wParam) || (VK_DOWN ==pMsg->wParam)
|| (VK_DELETE == pMsg->wParam) || (VK_BACK ==pMsg->wParam))
{
return CDialog::PreTranslateMessage(pMsg);
}
else
{
return TRUE;
}
}
returnCDialog::PreTranslateMessage(pMsg);
}
4.控件知识