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 内存区
否则父菜单也会跟着不见
浙公网安备 33010602011771号