MFC-单文档程序:1).将CMainFrame类的构造函数的声明由protected改为public  (目的是在view类添加成员变量CMainFrame Frame;)
2).在CMainFrame类中添加成员变量:  CMenu menu;
3)在CMainFrame类中添加成员函数  void a();  和  void b();
4).在void a()的实现函数中添加代码
{
    menu.CreatePopupMenu();//添加菜单模型
    
}
5)在void b()的实现函数中添加代码
{
   this->menu.AppendMenu(MF_STRING,201,"1");//在弹出菜单中动态添加菜单项}
6)在view类中添加头文件 :#include "MainFrm.h"
7)在view类中添加成员变量:CMainFrame Frame;
8)在view类中添加左键按下消息OnLButtonDown,下面是实现代码:
{ static bool b=true;
if(b==true)
{
Frame.a();//菜单模型
GetParent()->GetMenu()->AppendMenu(MF_POPUP,(UINT)Frame.menu.m_hMenu,"pop");//在菜单尾部添弹出菜单
Frame.b();//在弹出菜单中添加菜单项
GetParent()->DrawMenuBar();//刷新菜单
}
b=false;}此时运行,在客户区点击左键,出现弹出菜单,弹出菜单里也出现菜单项,属于正常。
此时问题也就来了,如果将上面view类中的左键按下消息里面的菜单刷新函数[GetParent()->DrawMenuBar()]删除,
在CMainFrame类中的void b()实现代码中添加菜单刷新函数:this->DrawMenuBar(); 这时候再编译,编译能通过,运行时,在客户区点击鼠标左键,就会出现 终止-重试-忽略 的对话框。
这个问题怎么解释啊,这是一个函数调用问题,道理能讲得通,为什么运行时就会出问题?向大家请教请教,这个问题怎么解决?

解决方案 »

  1.   

    会DEBUG吗?出现这个“终止-重试-忽略”,说明你不是DEBUG的。
      

  2.   

    不会DEBUG,我是自学mfc的,当我调试时都是用弹出对话框来调试,总之你帮我解决解决这个问题吧,谢谢啦
      

  3.   

    F5启动后,就停留在这个函数中this->DrawMenuBar();也出现了窗口,点击左键时,又出现了终止-重试-忽略“,然后怎么办呢
      

  4.   

    哦,点击重试。就会Break你出问题的地方了。
      

  5.   

    出问题的地方是: { ASSERT(::IsWindow(m_hWnd)); ::DrawMenuBar(m_hWnd); }
    这句话是什么意思啊?
      

  6.   

    明白了,意味着你的某个窗口没有创建出来,或者是已经Destroy了,但是你却试图操作它。
      

  7.   

    menu是个成员变量,不是局部变量,怎么会Destroy呢?
    问题只是把DrawMenuBar()函数由view类删除,添加到了CMainFrame类的自定义函数中,然后在view类中去调用啊
      

  8.   

    在frame中调用view中的成员变量【(CXXXXView*)GetActiveView()】,然后通过这个指针就很容易的得到view中的成员变量。
    在view中调用frame中的成员变量,【CMainFrame *pMain = (CMainFrame *) AfxGetMainWnd();】在view中定义frame的类对象,这个类对象并不是mfc单文档frame相关联的那个指针,所以得到的句柄为零