zl450296530

导航

 
1.在  一个空(没有标题)弹出式菜单资源   下   添加菜单资源:   ID_11、ID_12、ID_13。
2.相关代码如下:
    CPoint point ;
 
    GetCursorPos(&point);       
    ScreenToClient(&point);
    CMenu  MyMenu ;
    if(MyMenu.CreatePopupMenu ())
    {
        MyMenu.AppendMenu (MF_STRING,ID_11,"XIANSHI");
        MyMenu.AppendMenu (MF_STRING,ID_12,"HUAHUA") ;
        MyMenu.AppendMenu (MF_STRING,ID_13,"HHAH");
        ClientToScreen(&point) ;
        MyMenu.TrackPopupMenu (TPM_LEFTALIGN ,point.x,point.y,this);
    }
   
    /*因为GetCursorPos取到的是屏幕坐标,HitTest使用的是客户坐标,而TrackPopupMenu使用的又是屏幕坐标。 
    TrackPopupMenu之前再用ClientToScreen转化一次,或者,ScreenToClient之前先保存原来的坐标,
    在TrackPopupMenu中使用保存的坐标。*/
------------------------------------------------------------------------------------------------------
下面另外添加了孙菜单(即弹出子菜单的 子菜单)
------------------------------------------------------------------------------------------------------
    CPoint point ;
    ScreenToClient(&point) ;
    GetCursorPos(&point) ;
    CMenu Menu,PopupMenu; 
  
    Menu.CreatePopupMenu();  //如果这儿是Menu.CreateMenu();的话弹出的菜单在屏幕的左上角,
    PopupMenu.CreatePopupMenu(); 
 
    Menu.AppendMenu(MF_POPUP,(UINT)PopupMenu.m_hMenu,"&File");   //关键!  PopupMenu.m_hMenu 得到PopupMenu句柄
    Menu.AppendMenu(MF_STRING,ID_0,"&Edit");

    PopupMenu.AppendMenu(MF_STRING,ID_1,"&New"); 
    PopupMenu.AppendMenu(MF_STRING,ID_2,"&Open"); 
    PopupMenu.AppendMenu(MF_STRING,ID_3,"&Close"); 
    PopupMenu.AppendMenu(MF_STRING,ID_4,"&Exit");
     
//    GetMenu()->GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this); 

    ClientToScreen(&point) ;        
    Menu.TrackPopupMenu(TPM_CENTERALIGN,point.x,point.y,this);
    SetMenu(&Menu); 
    Menu.Detach(); 
    delete Menu ;
    PopupMenu.Detach();
    delete PopupMenu ;

刚才用 Menu.CreatePopupMenu();  和 PopupMenu.CreatePopupMenu();  创建了Menu 和 PopupMenu 对象 (占据了内存区域)现在要用Detach()和父菜单“拆开” 再delete 内存区
否则父菜单也会跟着不见
posted on 2008-05-05 12:35  luluback  阅读(414)  评论(0)    收藏  举报