我从CWnd类继承,开发了一个文本编辑控件。如果是在对话框创建该控件,直接就能获得键盘输入,但如果是在CView中创建,键盘消息就被CView处理了。为了实现该控件的灵活性,我想不论该控件在哪里创建,只要获得了焦点,就能直接获得键盘输入,这一点和CEdit之类应该是相同的,不知道CEdit是如何处理的?

解决方案 »

  1.   

    用GetWindowLong,参数GWL_WNDPROC先获得窗口处理的的过程的地址存储在pOldProc中,然后自己写一个新的Proc,用SetWindowLong()关联。在新的Proc中要处理你想要的WM_CHAR,其余不要处理的调用CallWindowProc(pOldProc)就行了。
    这是Windows SDK的办法,函数详细信息MSDN中有。
    记得《Windows 程序设计》上册中有这样一个样例,不过是用API写的,不是MFC。
      

  2.   

    当然,在MFC中,你只需重写WM_CHAR的OnChar()函数就行把不处理的东西给基类的OnChar()处理就行了。
      

  3.   

    API的方法我也知道,但我在MFC里使用同样的方法行不通,总是报参数错误
    SetWindowLong(hwnd,GWL_WNDPROC,(LONG)mywndproc)
    mywndproc是我定义的类里一个public函数,格式LRESULT ...,应该是没问题,但编译时报第三个参数转换失败。
    bownk(光棍)的方法不好,因为我不希望在外部做相关处理。
      

  4.   

    哦,这样啊,在类中定义回调函数时,需加static关键字去掉this属性。
    既然用MFC,为什么不尝试继承,重写虚函数。
      

  5.   

    如果加static关键字,我将不能访问this,那我又怎么将键盘消息发送到子类处理呢.重写虚函数?能否说明白一点,哪一个函数? OnCmdMsg? 这个函数也只能处理收到的消息啊