请教大家两个问题:
1.一个基于MFC的对话框,按下回车之后会消失。然后我改写了PreTranslateMessage
BOOL CDfggDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
         if (pMsg->message == 0x0d)
            return TRUE;
return CDialog::PreTranslateMessage(pMsg);
}
这时就不会消失了,恩,我理解,没有被DispatchMessage,但是我改成return FALSE之后按照我的理解应该还是消失的,但事实上并没有消失,奇怪了,return FALSE,不是表明继续分发吗?
2.一个基于MFC的对话框程序,上面有一个Edit控件。在Dlg::OnLButtonDown()中SetFocus(...)为什么Edit上的焦点还是在呢?

解决方案 »

  1.   

    1、“return FALSE,不是表明继续分发吗?”,我本人好像没这个概念;2、SetFocus(...),就是设置焦点,焦点当然还在。要看你SetFocus/GetFocus的对像。
      

  2.   

    1你这么改写就不往上调用系统的处理函数直接return了,不对吧。要就重载ONOK;
    2SetFocus(...)到哪?焦点问题有点复杂吧,在SDK里面也不是能很想当然的使用。
      

  3.   

    先回答第一个问题:1. return FALSE ——这是什么东西? 函数返回值啊,好好想想你的C基础知识,不管你函数前面干了多少事,一运行到这儿,OK,全白干了,为什么呢? 做为假返回了2. Dlg::OnLButtonDown()中SetFocus(...) 这问题我也遇到过,我是用HideCaret解决的。
      

  4.   

    第一个问题 return false ->这个是什么东西,这样后,界面仍然没有关掉,你去掉后就能关掉了
    是因为,界面能关掉,是下面的 return CDialog::PreTranslateMessage(pMsg);
    这句话,里面的操作让界面关掉了,你return false;没有关掉,是因为后面的代码没有运行
    你的dialog的基类 CDialog,如果他处理了 VK_RETURN 就会关掉,你直接 return 了,不管你return true还是false ,这句没有运行,return CDialog::PreTranslateMessage(pMsg);
    就这么简单,如果这句你放在函数的开头,你后面的操作会起作用吗?不管你怎么return 都没用了吧这个问题很好理解,理解了派生就明白了第二个问题,我是这样理解的,你的edit控件是mfc的子窗口,他是当前焦点,那你的mfc界面的标题栏也是亮的吧,说明你的edit的父窗口当前也是焦点,这种关系的,子控件是焦点时,父窗口也是,你设置窗口上的另一个edit得到焦点,我想先前的焦点就不在了
      

  5.   

    不知道是不是我没说清楚,我说的return FALSE的时候那么就没有把这个消息Hook掉,他还是会被分发往统一的窗口过程AfxWndProc,最终还是会调用DefWindowProc的啊,事实上CDialog::PreTranslateMessage(pMsg)和DefWindowProc的作用是一样的,只是前者做了一些其他的操作而已。那么按照这样的话return FALSE之后还是会消失的啊....渴望指点