创建弹出式菜单

创建弹出式菜单时,先创建一个菜单资源,然后调用LoadMenu方法加载菜单资源。

BOOL LoadMenu( LPCTSTR lpszResourceName );
BOOL LoadMenu( UINT nIDResource );
返回值:如果菜单资源装载成功,则返回非零值,否则为0。
参数:
lpszResourceName指向一个空终止的字符串,该字符串包含了要装载的菜单资源名称。nIDResource指定将要装载的菜单资源的菜单ID号。

调用GetSubMenu方法获取弹出式菜单中的一个菜单项。

CMenu*GetSubMenu(int nPos) const;

参数:nPos:标识菜单项位置,第一个菜单项对应的位置是0,第二个菜单项对应的位置是1,依此类推。

最后调用TrackPopupMenu方法显示一个弹出式菜单。

BOOL TrackPopupMenu(UINT nFlags,int x,int y,CWnd*pWnd,LPCRECT lpRect=NULL);

hMenu:被显示的快捷菜单的句柄。此句柄可为调用 CreatePopupMenu创建的新 快捷菜单的句柄,也可以为调用 GetSubMenu取得的与一个已存在菜单项相联系的子菜单的句柄。
uFlags:一种指定功能选项的位标志。用下列标志位之一来确定函数如何水平放置快捷菜单:
TPM_CENTERALIGN:若设置此标志,函数将按参数x指定的坐标水平居中放置快捷菜单。
TPM_LEFTALIGN:若设置此标志,函数使快捷菜单的左边界与由参数X指定的坐标对齐。
TPM_RIGHTALIGN:若设置此标志,函数使快捷菜单的右边界与由参数X指定的坐标对齐。
用下列标志位之一来确定函数如何垂直放置 快捷菜单
TPM_BOTTOMALIGN:若设置此标志,函数使快捷菜单的下边界与由参数y指定的坐标对齐。
TPM_TOPALIGN:若设置此标志,函数使快捷菜单的上边界与由参数y指定的坐标对齐。
TPM_VCENTERALIGN;若设置此标志,函数将按参数y指定的坐标垂直居中放置快捷菜单
用下列标志位之一来确定在菜单没有父窗口的情况下用户的选择:
TPM_NONOTIFY:若设置此标志,当用户单击菜单项时函数不发送通知消息。
TPM_RETURNCMD;若设置此标志;函数将用户所选菜单项的标识符返回到返回值里。
(注意:当TrackPopupMenu的返回值大于0,就说明用户从弹出菜单中选择了一个菜单。当不设置TPM_NONOTIFY和TPM_RETURNCMD时,程序给自己发送了一个WM_COMMAND消息,以返回的ID号为参数wParam的值)
用下列标志位之一来确定在 快捷菜单跟踪哪一个 鼠标键
TPM_LEFTBUTTON:若设置此标志,用户只能用鼠标左键选择菜单项。
TPM_RIGHTBUTTON:若设置此标志,用户能用鼠标右键选择菜单项。
X:在屏幕坐标下,快捷菜单的水平位置。
Y:在屏幕坐标下,快捷菜单的垂直位置。
NReserved:保留值,必须为零。
HWnd:拥有快捷菜单的窗口的句柄。此窗口接收来自菜单的所有消息。函数返回前,此窗口不接受来自菜单的 WM_COMMAND消息。
如果在参数uFlags里指定了TPM_NONOTIFY值,此函数不向 hWnd标识的窗口发消息。 但必须给hWnd里传一个窗口句柄,可以是应用程序里的任一个 窗口句柄
PrcRect:未用。
返回值:如果在参数uFlags里指定了TPM_RETURNCMD值,则返回值是用户选择的菜单项的标识符。如果用户未作选择就取消了菜单或发生了错误,则退回值是零。如果没在参数uFlags里指定TPM_RETURNCMD值,若 函数调用成功,返回非零值,若函数调用失败,返回零。若想获得更多的错误信息,清调用 GetLastError.
实例:
1.创建一个基于对话框的应用程序。
2.插入菜单资源;
3.在对话框头文件中声明一个CMenu类对象m_Menu;
4.在OnInItDialog方法中调用LoadMenu方法加载菜单资源:
m_Menu.LoadMenu(IDR_MENU1);    //加载菜单资源

5.打开类向导,添加消息WM_RBUTTONUP,该事件在鼠标右键抬起时触发;

6.处理鼠标右键抬起事件的处理函数,代码如下:

void CMenuDlg::OnRButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CMenu*pMenu = m_Menus.GetSubMenu(0);     //获得菜单句柄
	CRect rect;                              //声明CRECT类对象
	ClientToScreen(&point);                  //将客户坐标转换为屏幕坐标
	rect.top = point.x;                      //将鼠标当前横坐标作为弹出菜单的左上角坐标
	rect.left = point.y;                     //将鼠标当前纵坐标作为弹出菜单的左上角坐标
	pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_CENTERALIGN, rect.top, rect.left, this, &rect);//显示弹出菜单
	CDialog::OnRButtonUp(nFlags, point);     //调用类的方法
}

7.打开类向导,在其中为“添加文件”菜单项处理单击事件,代码如下:

void CMenuDlg::OnAdd()
{
	MessageBox(_T("菜单被按下!"));
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值