VC 创建弹出式菜单

步骤:

(1) 创建一个基于对话框的应用程序

(2)在工作区选择资源视图,插入一个菜单资源,添加菜单项

(3)在对话框的头文件中声明一个CMenu类对象m_Menu

(4)在OnInitDialog方法中调用LoadMenu方法加载菜单资源

	m_Menu.LoadMenuW(IDR_MENU1);		//加载菜单资源
(5)在工作区窗口选择类视图,右击CXXXDlg节点,选择类向导,在弹出的对话框中选择消息,WM_RBUTTONUP事件,改事件在右键抬起时触发

(6)处理鼠标右键抬起时的事件处理函数

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

注意在显示弹出菜单时,使用ClientToScreen函数进行转换,否则弹出菜单的位置可能出错.

效果如下:

用到的函数:

LoadMenu方法:

语法格式如下

BOOL LoadMenu(LPCTSTR lpszResourceName);

BOOL LoadMenu(UINT nIDResource);

lpszResourceName:标识资源名称

 nIDResource: 标识资源ID

GetSubMenu方法获得弹出式菜单第一个项

CMenu* GetSubMenu(int nPos) const;

nPos:标识菜单位置,第一个菜单项对应的位置是0,第2个菜单项的对应位置是1,依次类推.

TrackPopupMenu方法

语法格式如下:

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

nFlags:屏幕标记和鼠标按钮标记

x:以屏幕坐标标识弹出菜单式菜单的水平坐标

y:以屏幕坐标标识弹出菜单式菜单的水平坐标

pWnd:标识弹出式菜单的所有者

IpRect:以屏幕坐标表示用户在菜单中的单击区域,如果为NULL,当用户单击弹出式菜单之外的区域,将释放菜单窗口

nFlags的可选值

定位快捷菜单中的水平位置:

TPM_CENTERALIGN  中心由x参数指定的坐标水平相对快捷菜单

TPM_LEFTALIGN    定位快捷菜单,以便其左侧参数指定的坐标对齐

TPM_RIGHTALIGN   参数指定的快捷菜单,以便其右侧对齐。

定位快捷菜单垂直位置:

TPM_BOTTOMALIGN  位置的快捷菜单中,其底部的参数y指定的坐标对齐。

TPM_TOPALIGN  位置的快捷菜单,以便其顶侧的参数y指定的坐标对齐

TPM_VCENTERALIGN  中心 y所指定的坐标垂直的快捷菜单

使用下列标志指定的鼠标按钮的快捷菜单轨道。

TPM_LEFTBUTTON 用户可以选择菜单项,用鼠标左键。

TPM_RIGHTBUTTON 用户可以选择左,右鼠标按钮的菜单项。

VC++项目中的菜单资源建立结构相同的自绘弹出式菜单,原理和步骤如下: (1)CMenu::LoadMenu读入菜单资源; (2)CImageList::Create读入工具栏位图; (3)CMenu::CreatePopupMenu和CMenu::AppendMenu拷贝菜单资源,建立弹出式菜单。其中CMenu::AppendMenu第1个参数设置成MF_OWNERDRAW(自绘), 第四个参数设置成一个附加结构的指针,包括菜单项文字和位图索引等信息。通过这个结构,在自绘制时,可以获取对应的菜单项文字和位图位置索引,其中位图保存在第(2)步中的CImageList变量中; (4)在对右鼠标键的响应函数里,使用CMenu::TrackPopupMenu启动显示弹出式菜单; (5)在弹出式菜单的拥有者窗口(CxxxView)里,处理WM_MEASUREITEM消息和WM_DRAWITEM消息,分别调用CMenuEx::MeasureItem和CMenuEx::DrawItem, 分别用来定义菜单项的尺寸,对菜单项进行自绘; (6)在自绘函数CMenuEx::DrawItem里,通过每个菜单项的附加结构lpDIS->itemData,获得其文字和位图索引,然后分别使用CDC::DrawText和CImageList::Draw,画出该菜单项的文字和位图,从而实现自绘制。 程序在VC6下编译通过。 没有处理的地方:如果菜单项状态是checked或者radio,程序没做处理。另外,弹出式菜单的激活/禁止时,不会自动触发其拥有者窗口的ON_UPDATE_COMMAND_UI宏。不过,可以处理owner窗口的WM_INITMEMUPOPUP消息(在弹出式菜单的每个子菜单弹出时,都会发出此消息),为每个子菜单项单独生成一个CCmdUI对象,调用其CCmdUI::DoUpdate函数,来手动触发ON_UPDATE_COMMAND_UI宏中对应的消息处理函数,使得菜单项能够根据应用环境进行激活和禁止。详见博客: http://oliver.zheng.blog.163.com/blog/static/14241159520143210595266/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值