对话框右键有三种情况:
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的三种消息:标准消息,通知消息和命令消息。
右键点在对话框上,用到了标准消息;
右键点在控件上,用到了通知消息;
点击右键菜单的子菜单,用到了命令消息。