主题:Rich Edit 没有EN_CHANGE和EN_UPDATE消息??
abcdxjs
[专家分:240] 发布于 2006-07-08 22:55:00
我用下面的一句将文本框的消息处理程序改为我自己的.
(这一句在窗口的WM_CREATE消息里)
pOldProcRichEdit = (WNDPROC)SetWindowLong(hEdit_Exp, GWL_WNDPROC,(long)Proc_Edit_Exp);
这里是文本框的消息处理程序:
/*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
LRESULT CALLBACK Proc_Edit_Exp(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch (uMsg){
case EN_CHANGE:
MessageBox(0,"ENCHANGE",0,MB_OK);
break;
case WM_CHAR:
MessageBox(0,"char",0,MB_OK);
break;
default:
return CallWindowProc(pOldProcRichEdit,hWnd,uMsg,wParam,lParam);
}
return CallWindowProc(pOldProcRichEdit,hWnd,uMsg,wParam,lParam);
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
但只能接收到WM_CHAR,EN_CHANGE怎么也接收不到,,为什么??
回复列表 (共13个回复)
沙发
aaronwang [专家分:16870] 发布于 2006-07-07 14:58:00
The EN_CHANGE notification message is sent when the user has taken an action that may have altered text in an edit control. Unlike the EN_UPDATE notification message, this notification message is sent after the system updates the screen. The parent window of the edit control receives this notification message through a WM_COMMAND message.
板凳
abcdxjs [专家分:240] 发布于 2006-07-07 18:14:00
[quote]The燛N_CHANGE爊otification爉essage爄s爏ent爓hen爐he爑ser爃as爐aken燼n燼ction爐hat爉ay爃ave燼ltered爐ext爄n燼n爀dit燾ontrol.燯nlike爐he燛N_UPDATE爊otification爉essage,爐his爊otification爉essage爄s爏ent燼fter爐he爏ystem爑pdates爐he爏creen.燭he爌arent爓indow爋f爐he爀dit燾ontrol爎eceives爐his爊otification爉essage爐hrough燼燱M_COMMAND爉essage.[/quote]
Of cause I know,and then?
3 楼
aaronwang [专家分:16870] 发布于 2006-07-07 18:47:00
这个消息只会以WM_COMMAND的形式发送给父窗口.
就算你自己为编辑框写了消息处理函数,在编辑框的消息处理函数里也收不到这个消息.
下次看清楚了说明再回答.
4 楼
abcdxjs [专家分:240] 发布于 2006-07-08 13:43:00
Oh,sorry.
但我在主窗口的WM_COMMAND消息中不知怎样检测这个EN_CHANGE:
case WM_COMMAND:
if (LOWORD(wParam) == IDC_EDIT_EXP && HIWORD(wParam) ==EN_CHANGE){
MessageBox(0,"EN_CHANGE",0,MB_OK);
}
不知道为什么不行??
WM_COMMAND确实是这样的呀:
WM_COMMAND
wNotifyCode = HIWORD(wParam); // notification code
wID = LOWORD(wParam); // item, control, or accelerator identifier
hwndCtl = (HWND) lParam; // handle of control
5 楼
aaronwang [专家分:16870] 发布于 2006-07-08 13:58:00
我用的是switch,case语句嵌套来处理.先是case ID,再case 事件.很正常啊.
我假设你用的是向导默认的消息处理函数:
switch(wmId)
{
case ....
case IDC_EDIT_EXP:
switch(wmEvent)
{
case EN_CHANGE:
//添加你的消息处理代码.
break;
default:
}
break;
case ...
default:
}
6 楼
abcdxjs [专家分:240] 发布于 2006-07-08 14:21:00
还是不知道为什么不行....
我这是在对话框的消息处理程序里:
BOOL CALLBACK Proc_DiaFun(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
case WM_COMMAND:
switch ((short)wParam){
case IDC_EDIT_EXP:
//MessageBox(0,"!",0,MB_OK);
switch (HIWORD(wParam)){
case EN_CHANGE:
MessageBox(0,"EN_CHANGE",0,MB_OK);
break;
case EN_SETFOCUS:
MessageBox(0,"focus",0,MB_OK);
}
break;
case ...
第一个MessageBox有,但第二个没有...,SETFOCUS也收得到,但就是没有EN_CHANGE!
7 楼
zlhhz [专家分:710] 发布于 2006-07-08 19:49:00
有啊。(MessageBox(0,"focus",0,MB_OK);后面少了break;)
你把MessageBox(0,"focus",0,MB_OK);注释掉
编译运行,在编辑框中输入一个数字或者字母,就会弹出MessageBox(0,"EN_CHANGE",0,MB_OK);
8 楼
abcdxjs [专家分:240] 发布于 2006-07-08 22:40:00
那奇怪了,为什么我的不行
9 楼
abcdxjs [专家分:240] 发布于 2006-07-08 22:52:00
终于知道了..
原来RichEdit控件没有EN_CHANGE,Edit才有,但有EN_SETFOCUS,真是奇怪,
当RichEdit文本框内的内容改变时居然是没有消息通知的!
10 楼
aaronwang [专家分:16870] 发布于 2006-07-09 21:48:00
晕,用RichEdit也不说明.
我来回复