右键弹出菜单——POPUP

对话框右键有三种情况:
1、右键点在标题栏上
2、右键点在对话框上
3、右键点在对话框上边的控件上,比如按钮,编辑框,列表框等

点在标题栏上,框架类来响应,对于对话框程序来说,就不讨论了。

点在对话框上,会产生windows标准消息WM_RBUTTONDOWN,对话框(也就是this指针)直接响应这个消息即可。

点在对话框上边的控件上,控件本身就是一个windows窗口,所以就是由这个控件来响应这个右键消息的。如果控件要响应消息,就必须创建控件的对象(就会多一个.cpp和.h文件),但是一般我们对控件的操作都是直接使用指针来操作的,例如((CListCtrl*)GetDlgItem(IDC_LIST1))->GetItemText( Item, 2 )。所以控件本身就无法响应消息了,这时可以让控件向父窗口(也就是对话框)发送一个通知消息NM_RCLICK,父窗口(对话框,this指针)就可以响应这个消息了,在消息响应函数里反过来对控件进行操作。
其实这和不是基于对话框的程序中,上边的工具栏按钮,菜单栏选项的操作是一样的,只不过那是命令消息WM_COMMAND,在VS2010里边已经把通知消息和命令消息合并在一起了。

打开类向导,可以看到命令选项和消息选项,分别对应的就是命令消息和标准消息。在命令消息里,找到需要发送消息的ID,再找到要发送的消息名称(右键NM_RCLICK),然后添加消息响应函数,在这个消息响应函数里,就可以对右键进行响应了。

添加右键菜单需要两个东西:右键菜单出现的位置和右键菜单的内容。
获取光标位置

POINT pt;
GetCursorPos(&pt);	

右键菜单的内容需要创建一个菜单资源,命名一个ID。
然后创建一个菜单类的对象,把这个对象和这个ID绑定,显示出来。

	CMenu menu;
	menu.LoadMenu(IDR_POPUP);// 加载菜单资源到menu对象
	CMenu * pop=menu.GetSubMenu(0);// 因为右键菜单是弹出式菜单,不包含主菜单栏,所以取子菜单
	pop->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,pt.x,pt.y,this) ;// 弹出右键菜单

然后在类向导中添加针对右键菜单ID的命令消息响应函数,做相应的处理。

总结:
添加右键菜单,用到了windows的三种消息:标准消息,通知消息和命令消息。
右键点在对话框上,用到了标准消息;
右键点在控件上,用到了通知消息;
点击右键菜单的子菜单,用到了命令消息。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值