回 帖 发 新 帖 刷新版面

主题:Rich Edit 没有EN_CHANGE和EN_UPDATE消息??

我用下面的一句将文本框的消息处理程序改为我自己的.
(这一句在窗口的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个回复)

沙发

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.

板凳

[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 楼

这个消息只会以WM_COMMAND的形式发送给父窗口.
就算你自己为编辑框写了消息处理函数,在编辑框的消息处理函数里也收不到这个消息.
下次看清楚了说明再回答.

4 楼

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 楼

我用的是switch,case语句嵌套来处理.先是case ID,再case 事件.很正常啊.
我假设你用的是向导默认的消息处理函数:
switch(wmId)
{
case ....
case IDC_EDIT_EXP:
switch(wmEvent)
{
case EN_CHANGE:
//添加你的消息处理代码.
break;
default:

}
break;
case ...
default:

}

6 楼

还是不知道为什么不行....
我这是在对话框的消息处理程序里:
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 楼

有啊。(MessageBox(0,"focus",0,MB_OK);后面少了break;)
你把MessageBox(0,"focus",0,MB_OK);注释掉
编译运行,在编辑框中输入一个数字或者字母,就会弹出MessageBox(0,"EN_CHANGE",0,MB_OK);

8 楼

那奇怪了,为什么我的不行

9 楼

终于知道了..
原来RichEdit控件没有EN_CHANGE,Edit才有,但有EN_SETFOCUS,真是奇怪,
当RichEdit文本框内的内容改变时居然是没有消息通知的!

10 楼

晕,用RichEdit也不说明.

我来回复

您尚未登录,请登录后再回复。点此登录或注册