﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-SuiTang's Cpp Blog-文章分类-MFC</title><link>http://www.cppblog.com/suitang/category/15641.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 12 Dec 2010 05:40:49 GMT</lastBuildDate><pubDate>Sun, 12 Dec 2010 05:40:49 GMT</pubDate><ttl>60</ttl><item><title>MFC添加右键菜单</title><link>http://www.cppblog.com/suitang/articles/136172.html</link><dc:creator>隋唐</dc:creator><author>隋唐</author><pubDate>Sat, 11 Dec 2010 10:04:00 GMT</pubDate><guid>http://www.cppblog.com/suitang/articles/136172.html</guid><wfw:comment>http://www.cppblog.com/suitang/comments/136172.html</wfw:comment><comments>http://www.cppblog.com/suitang/articles/136172.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/suitang/comments/commentRss/136172.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/suitang/services/trackbacks/136172.html</trackback:ping><description><![CDATA[可以使用响应WM_RBUTTONDOWN或者WN_RBUTTONUP消息。这里使用的是响应WM_CONTEXMENU消息。<br>一、按钮右键弹出菜单<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img id=Codehighlighter1_42_49_Open_Image onclick="this.style.display='none'; Codehighlighter1_42_49_Open_Text.style.display='none'; Codehighlighter1_42_49_Closed_Image.style.display='inline'; Codehighlighter1_42_49_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_42_49_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_42_49_Closed_Text.style.display='none'; Codehighlighter1_42_49_Open_Image.style.display='inline'; Codehighlighter1_42_49_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CRButtonMenuDlg::OnContextMenu(CWnd</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_42_49_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_42_49_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">pWnd</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">,&nbsp;CPoint&nbsp;</span><span id=Codehighlighter1_59_67_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_59_67_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">point</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img id=Codehighlighter1_70_388_Open_Image onclick="this.style.display='none'; Codehighlighter1_70_388_Open_Text.style.display='none'; Codehighlighter1_70_388_Closed_Image.style.display='inline'; Codehighlighter1_70_388_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_70_388_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_70_388_Closed_Text.style.display='none'; Codehighlighter1_70_388_Open_Image.style.display='inline'; Codehighlighter1_70_388_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_70_388_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_70_388_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;TODO:&nbsp;在此处添加消息处理程序代码</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CRect&nbsp;rect;<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_button.GetWindowRect(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">rect);<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;CPoint&nbsp;p;<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;GetCursorPos(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">p);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">鼠标点的屏幕坐标</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(rect.PtInRect(p))<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img id=Codehighlighter1_205_386_Open_Image onclick="this.style.display='none'; Codehighlighter1_205_386_Open_Text.style.display='none'; Codehighlighter1_205_386_Closed_Image.style.display='inline'; Codehighlighter1_205_386_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_205_386_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_205_386_Closed_Text.style.display='none'; Codehighlighter1_205_386_Open_Image.style.display='inline'; Codehighlighter1_205_386_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_205_386_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_205_386_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMenu&nbsp;m_Menu;<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_Menu.LoadMenu(IDR_MENU1);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">编辑好的菜单资源</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">12</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMenu&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">m_SubMenu&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_Menu.GetSubMenu(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_SubMenu</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">TrackPopupMenu(TPM_LEFTALIGN&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;TPM_RIGHTBUTTON,&nbsp;p.x,&nbsp;p.y,&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
注意：（1）GetCursorPos获得的是点的屏幕坐标，这在后一个例子当中比较重要；<br>（2）在资源编辑器里编辑的菜单，一级菜单不能用来弹出，用GetSubMenu(index)来弹出索引对应的菜单。<br>二、CTreeCtrl控件右键点击item弹出菜单<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_Tree.ScreenToClient(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">p);<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UINT&nbsp;uFlags;<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTREEITEM&nbsp;hItem&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_Tree.HitTest(p,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">uFlags);<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;((hItem&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;NULL)&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;(TVHT_ONITEM&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;uFlags))<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img id=Codehighlighter1_142_387_Open_Image onclick="this.style.display='none'; Codehighlighter1_142_387_Open_Text.style.display='none'; Codehighlighter1_142_387_Closed_Image.style.display='inline'; Codehighlighter1_142_387_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_142_387_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_142_387_Closed_Text.style.display='none'; Codehighlighter1_142_387_Open_Image.style.display='inline'; Codehighlighter1_142_387_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_142_387_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_142_387_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_Tree.ClientToScreen(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">p);<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_Tree.Select(hItem,&nbsp;TVGN_CARET);<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMenu&nbsp;m_Menu1;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_Menu1.LoadMenu(IDR_MENU1);<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMenu&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">m_SubMenu1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_Menu1.GetSubMenu(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_SubMenu1</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">TrackPopupMenu(TPM_LEFTALIGN&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;TPM_RIGHTBUTTON,&nbsp;p.x,&nbsp;p.y,&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);</span></div>
注意：（1）CTreeCtrl控件的HitTest方法中第一个参数用的客户坐标，所以需要将p从屏幕坐标转到客户（m_Tree）坐标；<br>（2）在弹出菜单前需要将p转回屏幕坐标。<br></span>
<img src ="http://www.cppblog.com/suitang/aggbug/136172.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/suitang/" target="_blank">隋唐</a> 2010-12-11 18:04 <a href="http://www.cppblog.com/suitang/articles/136172.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>