在VC的对话框程序中,可以创建一个默认按钮,当对话框中还有其它非按钮控件,比如EDIT的时候.当焦点在Edit中的时候,仍可以直接按回车执行默认按钮的功能.但如果是自己从CWnd直接派生的窗口类做父窗口,在其中动态创建的按钮,虽然创建的时候加了BS_DEFPUSHBUTTON风格,但按下回车不会执行相应的操作,这想处理回车键,并调用默认按钮的消息函数的动作应该是在CDialog中处理的,所以直接从CWnd中创建的button不起作用,不知道理解的对不对.如果对,有什么办法把相应的代码找出来吗?谢谢.

解决方案 »

  1.   

    在对话框的PreTraslateMessage处理回车
      

  2.   

    你动态创建的按钮ID是不是  IDOK?
      

  3.   

    mfc对消息系统装了hook,严格按照消息的路由来走
      

  4.   

    这得看WM_COMMAND是如果处理的了.
      

  5.   

    不是IDOK,这个应该是对话框在收到回车后,会发送DM_GETDEFID消息来查询是否有默认按钮,如果有,会自动插入一个WM_COMMAND消息到那个默认按钮上.但这只是对话框的形为,而CWnd不会这样做.我只是想把对话框处理的代码加到CWnd的直接派生类中.但debug到MFC源代码中,并不能找到相关的代码.
    我debug到IsDialogMessage这个API,对于对话框程序,按下回车后产生的WM_KEYDWON消息传给它之后,进行USER32.dll处理,出来以后会生成一个WM_COMMAND消息,但CWnd不会.
      

  6.   

    这个问题确实有点挑战性,基本就是USER32.dll中实现的.但不知道是哪些函数,走怎么的流程.有没有对此的封装?
      

  7.   

    微软的一位员工的 blog 上对对话框的实现有完整的解释,参见此备忘 blog 中的链接:
    http://sluttery.spaces.live.com/blog/cns!3569FEA80C717FD4!3321.entry
      

  8.   

    Elysium(我很忙,现在事业正处于上升期) :刚才心情不好,所以语出粗鲁,还望海涵。不过,对于你对我的评论,我是很在意的。不知道你有没有注意到,那篇博客是我今天才写的。写这篇博客的目的,就是为了让楼主能够有个地方去查询资料。因为原作者的文章也是 blog,而且过去很长时间了,比较难于搜索。之所以没有指明那一篇,是因为我也很忙,我不可能把其中的内容背下来,给大家一个极其精准的答案。说起我的厚道不厚道,你可以在 CSDN 里查询我所有的回复,不敢保证百分之百的帖子,但百分之八十里的我的努力程度、专业程度、仔细程度,我都认为是很多人所达不到的。
      

  9.   

    在此对dandycheung(珠穆朗玛)致歉,浏览了dandycheung(珠穆朗玛)的blog,我相信dandycheung是出于好意,里面的文章为楼主解决问题提供了有益的帮助,楼主也可以深入理解它,相信对了解对话框的运行机制和消息循环很有好处。再次致歉