大家好,学VC的时候有这段代码,其中最后是menu.Detach()。书上说当菜单对象是个局部对象时,调用菜单对象的detach函数将菜单句柄和菜单对象分开。我仍然感觉到模糊,希望大家能不能指点一下,这个detach的意思是什么呢。
代码如下int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
....
SetMenu(NULL);
menu.LoadMenu(IDR_MAINFRAME);
setMenu(&menu);
menu.Detach();
return 0;
}
当不调用detach的时候,书上说的是点击打印窗口,然后关闭打印窗口,这个时候菜单就会不在了。为什么会不在了呢,如果不用detach,究竟是在哪一部分操作时候会出错?

解决方案 »

  1.   

    哪个书上这样说的?detach就是把一个类对象从一个句柄上分离开来,大致是这样的:
    HMENU CMenu::Detach()
    {
        HMENU h = m_hMenu;
        m_hMenu = NULL;    return h;
    }
      

  2.   

    CMenu和HMENU的区别是MFC和API的区别。
    Windows的接口也就是API,MFC是对API的一层封装。菜单是一种资源,API通过HMENU来引用它、使用它,
    CMenu对HMENU进一部封装,从而使菜单更加用以使用。
      

  3.   

    假如menu是你在OnCreate中定义的一个局部变量,当执行完OnCreate之后这个对象的生命周期就结束了,程序就会自动销毁这个对象和与这个对象想关联的窗口,所以我们要在menu被销毁之前把与它想关联的窗口通过Detach函数分离开,这样当menu被销毁之后那个窗口才能继续存在
    我是初学者,如果讲错了还请大虾们批评指教
      

  4.   

    detach就是把windows资源和C++对象分离开来,如果你不detach,由于menu对象是局部对象,退出函数后menu就自我销毁了。他的析构函数会强迫销毁那个菜单系统资源,相当于调用诸如DeleteMenu(hMenu)之类的函数(注意区分C++对象和系统菜单对象)你detach之后,c++对象还是会析构,但是系统资源则不会被销毁
      

  5.   

    如果不调用Detach()函数的话,理论上,当OnCreate()函数执行完毕的时候,这个CMenu的对象创建的POPUPMENU也就被析构了,编译运行程序后,当点击在菜单栏上创建的响应的POPOUPMENU的时候就会报错,错误内容为找不到改资源等等。