你可以建立一个控件,继承于CEdit。然后用ClassWizard来处理WM_KEYDOWN消息。详细的方法可以参考下面的链接。
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q104637
在CEdit 控件中检测键盘的输入并加以控制有多种发法。但是归根结底是接收CEdit 控件的Keydown消息,并且判断是否是需要的按键被按下。举个简单的例子说,如果你的应用程序是基于对话框的,只要重写CDialog的PreTranslateMessage函数就可以方便的完成这项任务。请参考以下的代码:
BOOL CCeitDlg:reTranslateMessage(MSG* pMsg)
{
HWND hwnd;
GetDlgItem(IDC_EDIT1,&hwnd); //得到CEdit 的句柄
if( pMsg->message == WM_KEYDOWN && pMsg->hwnd == hwnd) //判断如果是在CEdit中有按键按下
{
if (( pMsg->wParam >= 'a' && pMsg ->wParam<='z') ||(pMsg->wParam >= 'A' && pMsg->wParam <= 'Z'))
return CDialog:PreTranslateMessage(pMsg);
//屏蔽了除a~z 和A~Z之外的所有的按键。(不包括PrintScreen ...)
else
return TRUE;
}
return CDialog:PreTranslateMessage(pMsg);
}
关于WM_KEYDOWN消息和PreTranslateMessage, 请参考相应的MSDN文档。
当然你还需要添加一些代码来使这个控件更加完善。但是这样的方法却只能够用在一个应用程序当中,如果很多应用程序都要使用相同的这样的控件,那么考虑到重用性,可以用SubClass的方法。