MDI的主框架是唯一可以加载菜单资源的框架,
当框架中没有任何文档时,主框架装载菜单资源IDR_FRAME_MAIN
当框架中有某种类型的文档打开时,主框架装载对应类型的菜单资源,比如IDR_XXXTYPE。我的问题是:
主框架装载菜单的时机具体是什么(哪个函数),有没有高手研究过这个问题,还希望指教!
先谢谢。

解决方案 »

  1.   

    没有研究过,应该是这个?
    CMainFrame* pMainFrame = new CMainFrame;
    if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME))
    return FALSE;
    OnCreate反正是已经加载完了。
      

  2.   

    去研究下MFC库中winmdi.cpp中的CMDIChildWnd::OnUpdateFrameMenu()这个方法。
      

  3.   

    上面是ChildFrame根据ActiveDocument去替换主框架菜单的地方。至于主框架则是CFrameWnd的Create中根据资源ID区LoadMenu得到Menu。
    Create又调用了CreateEx,CreateEx又调用了AfxCtxCreateWindowEx,上一步LoadMenu得到的菜单资源句柄作为CREATESTRUCT 传给了AfxCtxCreateWindowEx。
      

  4.   

    你建立个文档:
    应该有XXXDoc.cpp,XXXView.cpp,XXX.cpp
    在XXX.cpp中有InitInstance()函数,里面有加载楼主所说的内容
      

  5.   


    谢谢xyzhaopeng兄。
    还有个问题,mfc框架在什么时机修改了窗口子菜单,并在其中加入打开的文档的名称作为其中的二级子菜单。
    这个问题我问了好多高手都回答不了,我觉得你应该会,先感谢你的帮助。
      

  6.   


    刚才我没说清楚,我的意思是,mfc框架在什么时候修改了菜单栏中的窗口子菜单(帮助子菜单左边的菜单)。
    每次用户打开一个文件,然后就会打开一个新的窗口,接着,当你去查看菜单栏中的窗口子菜单是,就会发现多了一个文件名称,但这个列表和文件子菜单中的列表不一样。我想知道,mfc框架是在什么函数直接修改菜单资源的。
      

  7.   

    问题已经解决了,自己祝贺一下自己。CMDIFrameWnd::GetWindowMenuPopup是mfc框架修改名为“窗口”或者“window”的子菜单中的二级子菜单的过程的关键。
    MSDN的原文如下:
    The default implementation looks for a pop-up menu containing standard Window menu commands such as ID_WINDOW_NEW and ID_WINDOW_TILE_HORZ.Override this member function if you have a Window menu that does not use the standard menu command IDs.所以,只需要覆盖CMDIFrameWnd::GetWindowMenuPopup就可以利用mfc框架使用自己想要的窗口列表菜单。
      

  8.   


    xyzhaopeng说得有道理,CMDIChildWnd::OnUpdateFrameMenu确实是最直接的修改菜单资源的位置。感谢xyzhaopeng的帮助,谢谢!!!