日本艺术家奈良美智:VC对话框添加右键菜单

来源:百度文库 编辑:中财网 时间:2024/05/03 21:39:20
VC对话框添加右键菜单 (2008-12-21 10:15:24)标签:it 分类:VC++学习实例及资料VC对话框添加右键菜单2006-12-05 22:34 一.在资源创建对话框中选择Menu项并单击New按钮自动创建ID为IDR_MENU1的菜单,为该菜单添加一个菜单项File,并在File菜单项下添加Cut,Copy和Paste三个菜单(为这三个菜单添加消息响应代码)
如:
void CExampleDlg::OnCut()
{
  AfxMessageBox("Cut"); //弹出对话框
}
void CExampleDlg::OnCopy()
{
  AfxMessageBox("Copy"); //
弹出对话框
}
void CExampleDlg::OnPaste()
{
  AfxMessageBox("Paste"); //弹出对话框
}
 二.当在窗口内右击时,窗口将接收到WM_CONTEXTMENU消息,在该消息的处理函数中装载右键菜单,并调用CMenu::TrackPopupMenu函数便可显示右键菜单,添加对话框WM_CONTEXTMENU消息处理函数的响应代码如下: void CExampleDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
  CMenu menu;
  menu.LoadMenu(IDR_MENU1); //读取资源
  menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON, point.x, point.y, this) //弹出自定义右键菜单
}

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

在mousemove中使用
if(rect.PtInRect(point))
MessageBox("hi");

不起作用,即使鼠标落入有效区域。

--------------------------------------------------------------------------------
这个rect是怎样得来的。
要注意,鼠标操作都是屏幕坐标,即point是相对于屏幕左上角的偏移。
如果rect是设备坐标,则需要转换成屏幕坐标
--------------------------------------------------------------------------------

由此而来->GetWindowRect(&rect)
rect (top,bottom,left,right),观察rect运行数据,正常。
--------------------------------------------------------------------------------
以上代码测试成功
--------------------------------------------------------------------------------
GetWindowRect返回的是屏幕坐标
而mousemove里面获取的是对话框的相对坐标
因此要把鼠标的坐标转换位屏幕坐标,可以用ClientToScreen(&point)转换后,就可以实现你的目的了
--------------------------------------------------------------------------------
ScreenToClient
把屏幕坐标转换成客户区坐标
--------------------------------------------------------------------------------

3楼的方法试了,还是不行。
我的按钮是在图片上建立的,应该没有影响把
--------------------------------------------------------------------------------
对了忘了告诉你,如果你的那个控件是button
则需要先SetCapture,完后记得要ReleaseCapture.

如果区域不是按钮区域的话就不用SetCapture了!
--------------------------------------------------------------------------------
谢谢iyranly
可以了,但SetCapture太霸道了,结果是只有这一个功能可以用,其他功能都给屏蔽掉了。
看来,在什么位置放ReleaseCapture是个学问
--------------------------------------------------------------------------------
那个当然很霸道的
在mousemove最后一行释放掉就可以了

 

以下代码是在对话框的一个控件上,按右键弹出一菜单.

void CMenuDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
 //CPoint   pt;   当不在OnContextMenu()时,使用取得MOUSE 位置.
 //::GetCursorPos(&pt);  当不在OnContextMenu()时,使用取得MOUSE 位置.
 CRect rect;
 (GetDlgItem(IDC_STATIC_TEST))->GetWindowRect(&rect);//取得控件句柄,并获取控件所在屏幕区域
 //ScreenToClient(&rect);
 if(rect.PtInRect(point))  //判断MOUSE是否在控件所在区域.
  
  
  // TODO: Add your message handler code here
  CMenu menu;
  menu.LoadMenu(IDR_MENU_POPUP);//装载菜单
  menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON, point.x, point.y, this);
  menu.DestroyMenu();
 }
}