SuiTang's Cpp Blog
C++博客
首页
新随笔
联系
聚合
管理
<
2025年4月
>
日
一
二
三
四
五
六
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
统计
随笔 - 0
文章 - 2
评论 - 1
引用 - 0
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
给我留言
查看公开留言
查看私人留言
文章分类
C++
(rss)
Java
(rss)
JSP
(rss)
Linux
(rss)
MFC(1)
(rss)
VC(1)
(rss)
文章档案
2010年12月 (2)
搜索
最新评论
1. re: MFC添加右键菜单
rundll32.exe user32.dll,
--rundll32.exe user32.dll,
MFC添加右键菜单
可以使用响应WM_RBUTTONDOWN或者WN_RBUTTONUP消息。这里使用的是响应WM_CONTEXMENU消息。
一、按钮右键弹出菜单
1
void
CRButtonMenuDlg::OnContextMenu(CWnd
*
/**/
/*
pWnd
*/
, CPoint
/**/
/*
point
*/
)
2
{
3
//
TODO: 在此处添加消息处理程序代码
4
CRect rect;
5
m_button.GetWindowRect(
&
rect);
6
CPoint p;
7
GetCursorPos(
&
p);
//
鼠标点的屏幕坐标
8
if
(rect.PtInRect(p))
9
{
10
CMenu m_Menu;
11
m_Menu.LoadMenu(IDR_MENU1);
//
编辑好的菜单资源
12
CMenu
*
m_SubMenu
=
m_Menu.GetSubMenu(
0
);
13
14
m_SubMenu
->
TrackPopupMenu(TPM_LEFTALIGN
|
TPM_RIGHTBUTTON, p.x, p.y,
this
);
15
}
16
}
注意:(1)GetCursorPos获得的是点的屏幕坐标,这在后一个例子当中比较重要;
(2)在资源编辑器里编辑的菜单,一级菜单不能用来弹出,用GetSubMenu(index)来弹出索引对应的菜单。
二、CTreeCtrl控件右键点击item弹出菜单
1
m_Tree.ScreenToClient(
&
p);
2
UINT uFlags;
3
HTREEITEM hItem
=
m_Tree.HitTest(p,
&
uFlags);
4
if
((hItem
!=
NULL)
&&
(TVHT_ONITEM
&
uFlags))
5
{
6
m_Tree.ClientToScreen(
&
p);
7
m_Tree.Select(hItem, TVGN_CARET);
8
CMenu m_Menu1;
9
m_Menu1.LoadMenu(IDR_MENU1);
10
CMenu
*
m_SubMenu1
=
m_Menu1.GetSubMenu(
1
);
11
12
m_SubMenu1
->
TrackPopupMenu(TPM_LEFTALIGN
|
TPM_RIGHTBUTTON, p.x, p.y,
this
);
注意:(1)CTreeCtrl控件的HitTest方法中第一个参数用的客户坐标,所以需要将p从屏幕坐标转到客户(m_Tree)坐标;
(2)在弹出菜单前需要将p转回屏幕坐标。
posted on 2010-12-11 18:04
隋唐
阅读(4837)
评论(1)
编辑
收藏
引用
所属分类:
MFC
评论
#
re: MFC添加右键菜单
2012-08-30 16:08
rundll32.exe user32.dll,
rundll32.exe user32.dll,
回复
更多评论
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理