int CSunxin5View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
       // CClientDC dc(this);
         CBitmap  pBitmap ;             
        pBitmap.LoadBitmap(IDB_BITMAP1);
        CreateCaret(&pBitmap);
ShowCaret();
return 0;
}
在上面函数中,由于 pBitmap 对象析构,于之关联的资源销毁,所以创建的图形插入符不能显示出来。但是为什么下面这段程序的快捷菜单又能显示出来??如果按上面那么理解的话应该资源也销毁了啊
void CSunxin5View::OnRButtonDown(UINT nFlags ,CPoint point)

      CMenu menu;
      menu.LoadMenu(IDR_MENU1);
      CMenu* pPopup=menu.GetSubMenu(0);
      ClientToScreen(&point);
      pPoppup->TrackPopMenu(……)
      CView::OnRButtonDown(UINT nFlags ,CPoint point)
}
 还有很多时候在函数内会定义CClientDC dc这个对象,这个对象不是在函数结束时也要析构销毁的吗?为什么图像还会显示呢?这几个问题困扰了我很久了,求解脱!!谢谢   }

解决方案 »

  1.   

    TrackPopupMenu后你关闭菜单才返回,所以没有释放资源
      

  2.   

    TrackPopMenu()函数实现内部有一个消息循环,也就是说,当代码执行到这句时,会一直停在这,函数CSunxin5View::OnRButtonDown还没有退出,所以CMenu的析构没有执行。(设个断点看看就知道了)CClientDC dc,已经画到屏幕上了,跟内存那个对象没关系了,所以即使那个对象被释放了,屏幕上还是存在的。
      

  3.   

    跟Dialog的Domodal()函数一样。
      

  4.   

    CView::OnRButtonDown(UINT nFlags ,CPoint point)
    你自己在这一行打上断点试试呗,看看菜单消失和这一行被执行谁先谁后八~