CEdit是否有OnKeyDown事件 有,CEdit也是窗口,只要是窗口就会有这个消息 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你自己给EDIT控件加这个函数啊用Ctrl+w掉出向导给EDIT加一个处理WM_KEYDOWN的函数 从CEdit派生一个类,加入对WM_KEYDOWN的处理。 delphi和visual c++ 是两种不同的编程工具,编程思想和方法肯定会用不同的地方。在VC中,是响应消息,可以在MFC ClassWizard对话框里找到。 对控件来说,可以响应BN_CLICKED 和BN_DOUBLECLIEKED消息。菜单是响应COMMAND命令。CView 和CMainFrame等类是响应WM_KEYDOWN 和WM_KEYUP消息。 谢谢各位了,我明天回公司试一下,做程序做到我的程度算是够失败的了都快两年了,就会delphi,而且电脑都自己买不起 是不是要对CEDIT子类化,我不明白,即然CEDIT是继承的是CWND,即然CWND有什么keydown,mousedown事件,为什么子类没直接就有呢,还要什么子类呢 vc得控件使用和delphi不太一样。要找vc得介绍mfc得书和例子 我打开了MFC向导,CEDIT就是没有这些keydown事件。对了,如果VC没这些事件肯定是不行的,像我经常在编辑框的回车事件中处理一些事情,哪VC岂不没法实现了吗? 在用ctrl+w调出向导时为其定义类型为控件型就可以看到相应的事件和方法定义了 WM_KEYDOWN事件发生后,系统会自动调用EDIT的DefaultWndProc去执行。系统不会讲这个事件发到主线程。如果你需要这个消息,请安如下方法即可原理是安装一个钩子去截获该消息。定义钩子HHOOK hhkTemp;设置钩子 hhkTemp=SetWindowsHookEx( WH_KEYBOARD, &KeyboardProc, GetModuleHandle(NULL), GetCurrentThreadId());在不需要该事件的时候 UnhookWindowsHookEx(hhkTemp);KeyboradProc的代码如下LRESULT CALLBACK KeyboardProc( int code, // hook code WPARAM wParam, // virtual-key code LPARAM lParam // keystroke-message information){ if(code<0) { return(CallNextHookEx(hhkTemp,code,wParam,lParam)); } else { HWND hWndTemp=GetFocus(); if(hEdit==hWndTemp)//self message,hEdit是你需要获得WM_KEYDOWN的那个EDIT控件的句柄 { ...就是它。写入你的代码 } return(0); }}把钩子去掉 重載PreTranslateMessage函數:下面代碼只讓CEdit接受輸入0~9的數字BOOL CxxxDlg::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if(pMsg->hwnd==CEdit控件變量.GetSafeHwnd ()){ if(pMsg->message ==WM_KEYDOWN) { if (pMsg->wParam<'0' || pMsg->wParam >'9') pMsg->wParam =0; } } return CDialog::PreTranslateMessage(pMsg);} 有void CMyEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { //do sth; CEdit::OnKeyDown(nChar, nRepCnt, nFlags);} 不会吧,这可是微软的重型武器,一个简单的事件居然这么复杂,在DELPHI中拦截消息太简单了。仅仅需要在凼数声明的地方加上 message;wm_keydown 就可以了。 自己从CEdit派生一个CMyEdit类,在ClassView中选中CMyEdit类,按右键,选“Add Windows Message Handler”。在Filter for Messages avaiable to 中选"Windows"再在左边的New Windows Message/Event中选WM_KEYDOWN即可加如该消息处理函数。自己编写之。然后通过ClassWizard将这个CMyEdit类和你使用的控件绑定起来即可。 通过ClassWizard将这个CMyEdit类和你使用的控件绑定起来即可。通过ClassWizard将这个CMyEdit类和你使用的控件绑定起来即可。这一步我上班的时候偷偷试了一下,还没试出来,我已经成功添加了类,而且赋了我期望的ID(IDC_EDIT1),但运行时事件没有产生 ado数据库打包 谁有xpbutton类?能都给小弟一份,非常感谢! 如何打开文件,急! 求救,全局的变量应该在哪里定义,才不会在链接时出现错误? SDK编程时如何把声音文件静态连接在程序中..... clientserversocket关闭对话框奇怪问题 关于VC中开发数据库程序的问题 CODER的未来??? 如何调用系统的〈打开方式〉对话框? VC读写EXECL属性--详细信息 关于“动态绑定”和《深入浅出MFC第2版》 关于CSliderCtrl ::GetPos()
用Ctrl+w掉出向导
给EDIT加一个处理WM_KEYDOWN的函数
的地方。在VC中,是响应消息,可以在MFC ClassWizard对话框里找到。
对控件来说,可以响应BN_CLICKED 和BN_DOUBLECLIEKED消息。菜单是响应
COMMAND命令。CView 和CMainFrame等类是响应WM_KEYDOWN 和WM_KEYUP消息。
对了,如果VC没这些事件肯定是不行的,像我经常在编辑框的回车事件中处理一些事情,哪VC岂不没法实现了吗?
原理是安装一个钩子去截获该消息。定义钩子HHOOK hhkTemp;
设置钩子
hhkTemp=SetWindowsHookEx(
WH_KEYBOARD,
&KeyboardProc,
GetModuleHandle(NULL),
GetCurrentThreadId());
在不需要该事件的时候
UnhookWindowsHookEx(hhkTemp);
KeyboradProc的代码如下
LRESULT CALLBACK KeyboardProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
if(code<0)
{
return(CallNextHookEx(hhkTemp,code,wParam,lParam));
}
else
{
HWND hWndTemp=GetFocus();
if(hEdit==hWndTemp)//self message,hEdit是你需要获得WM_KEYDOWN的那个EDIT控件的句柄
{
...就是它。写入你的代码
}
return(0);
}
}
把钩子去掉
下面代碼只讓CEdit接受輸入0~9的數字
BOOL CxxxDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->hwnd==CEdit控件變量.GetSafeHwnd ()){
if(pMsg->message ==WM_KEYDOWN)
{
if (pMsg->wParam<'0' || pMsg->wParam >'9') pMsg->wParam =0;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
void CMyEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
//do sth;
CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
}
仅仅需要在凼数声明的地方加上 message;wm_keydown 就可以了。
选“Add Windows Message Handler”。在Filter for Messages avaiable to 中选"Windows"再在左边的New Windows Message/Event中选WM_KEYDOWN
即可加如该消息处理函数。自己编写之。然后通过ClassWizard将这个CMyEdit
类和你使用的控件绑定起来即可。
通过ClassWizard将这个CMyEdit类和你使用的控件绑定起来即可。这一步我上班的时候偷偷试了一下,还没试出来,我已经成功添加了类,而且赋了我期望的ID(IDC_EDIT1),但运行时事件没有产生