BEGIN_MESSAGE_MAP(CTestApp, CWinApp)
ON_COMMAND(ID_APP_ABOUT, &CTestApp::OnAppAbout)
END_MESSAGE_MAP()新建个MFC工程,默认的那个是放在 App 类里,这有什么好处? 我觉得菜单是在框架上,为什么Microsoft 不设计默认在 Frame 类里?
还有一点不明白&CTestApp::OnAppAbout 前为什么要取地址?函数名不已经是地址了吗,再取不就是传说中的指向指针的指针,为什么要这么设计,有什么好处?谢谢达人!

解决方案 »

  1.   

    看一些command消息比较处理,是由FrameWnd接受,处理流程如下:
    System->FrameWnd(orignal)->ActiveView->AvtiveDocument->FrameWnd(process)->App
    ActiveView是优先处理command消息的,如果不处理依次向后转发,直到被抛弃,一般MENU是在view中被处理
      

  2.   

    这里的&不是取地址吧,应该是个引用。
      

  3.   

    那 Microsoft 默认是在 App 里处理,这是为什么?
    还有为什么放在 Dlg 类里的,按钮是灰的,不能点?
      

  4.   

    那  Microsoft 把 处理菜单消息默认放在  App 里,这么做有什么用意呢?还有就是这些处理函数放在  Dlg 里就响应不到,这是为什么?按钮是灰的。
      

  5.   

    那  Microsoft 把 处理菜单消息默认放在  App 里,这么做有什么用意呢?还有就是这些处理函数放在  Dlg 里就响应不到,这是为什么?按钮是灰的。
      

  6.   

    那  Microsoft 把 处理菜单消息默认放在  App 里,这么做有什么用意呢?还有就是这些处理函数放在  Dlg 里就响应不到,这是为什么?按钮是灰的。
      

  7.   

    OnAppAbout放在App里面,就是因为对话框没有FrameWnd。
      

  8.   

    对话框应该是 子窗体,这和父窗体的 FrameWnd 有什么关系?
      

  9.   

    lz .对话框类是不会响应命令消息。即不会响应点击菜单发出的command消息。
    1楼是正解,去仔细研究哈。MFC响应消息的顺序。就可,之所以将菜单的命令消息
    放在APP最后一个中。是为了保证菜单命令消息能被响应
    lz可以自己做一个test。在每个类中添加一个鼠标左键点击消息。。看看他们的顺序,
    就知道了
      

  10.   

    谢谢 RFbenson
    听你这么一说,我倒想起来了。
    但能不能举个例:把菜单消息放在其他类,然后让他响应不到菜单命令消息谢谢
      

  11.   

    放在哪个类消息都能流动过去,所以都是工作的。实际选择取决于以下几点:
    (1)这个消息跟哪一个类关系更密切。
    (2)放在不同的类会造成界面行为不同。比如你有两个view,那么你放在哪一个view,相应的菜单项只有这个view激活时才能选择,如果想另一个view激活时也能选择,就需要放在CMyApp或CMyDoc等。
    (3)为了你写函数的方便。比如这个响应函数用到的数据都在那个类。
      

  12.   

    重载主框架类的OnCmdMsg函数,可以让任意类处理命令消息。OnCmdMsg是消息路由函数,可以将命令消息(WM_COMMAND)分配到任意类处理。
    命令消息不同于一般window消息,MFC的消息循环机制遇见命令消息会调用OnCommand函数,OnCommand函数会调用OnCmdMsg函数进行消息路由。如果重载该函数可以将命令消息分派到任意类对象,而不局限于主窗类对象(菜单所属窗口)。
      

  13.   

    为什么是CWinApp类,看下OnCmdMsg函数的介绍就明白了,这个函数是命令消息的路由机制,它的路由机制是先将命令消息发到主窗口的激活子框架,如果子框架无法处理该命令消息,OnCmdMsg函数就查找主框架看是否能处理该消息,如果否,就将命令消息发到应用程序类对象(CWinApp类)处理,将这个消息放到CWinApp类对象的目的是不用重载OnCmdMsg命令。