CContextMenuManager上下文菜单管理器以及为菜单添加图标

在Visual Studio 2008SP1中,要弹出上下文关联菜单的话,只需要在应用程序初始化的时候调用CWinAppEx::InitContextMenuManager,然后使用CWinAppEx::GetContextMenuManager获得一个指向应用程序的上下文管理器。
如果工程是单文档/多文档的话,可能会自动关联一个右键菜单,可以在应用程序的实现文件看到类似如下代码:

// CXXXApp 自定义加载/保存方法 
void CXXXApp::PreLoadState() 

    BOOL bNameValid; 
    CString strName; 
    bNameValid = strName.LoadString(IDS_EDIT_MENU); 
    ASSERT(bNameValid); 
    GetContextMenuManager()->AddMenu(strName, IDR_POPUP_EDIT); 

要弹出菜单的时候,只需要调用ShowPopupMenu即可。如下类似:

BOOL CXXXForEdit::PreTranslateMessage(MSG* pMsg) 
{     
    if   ((pMsg->message   ==   WM_RBUTTONDOWN))   
    { 
        CPoint point(pMsg->pt);         
        theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE); 
        return   TRUE;  
    } 
    else   
        return CXXXForEdit::PreTranslateMessage(pMsg); 

如果是要弹出另一个菜单资源ID的话,需要先在CXXXApp::PreLoadState()里面添加快捷菜单,如下:

void CXXXApp::PreLoadState() 

    BOOL bNameValid; 
    CString strName; 
    bNameValid = strName.LoadString(IDS_EDIT_MENU); 
    ASSERT(bNameValid); 
    GetContextMenuManager()->AddMenu(strName, IDR_POPUP_EDIT); 
    GetContextMenuManager()->AddMenu(_T("专门编辑"), IDR_POPUP_FOREDIT); 

这时,才能使用下面语句调用:

theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_FOREDIT, point.x, point.y, this, TRUE); 

要为菜单添加图标的话,要使用到CMFCToolBar::AddToolBarForImageCollection ()函数,其函数原型如下:

static BOOL __stdcall AddToolBarForImageCollection( 
   UINT uiResID,    //Resource ID of a toolbar with images to load. 
   UINT uiBmpResID=0,    //Resource ID of a bitmap with toolbar images. 
   UINT uiColdResID=0,    //Resource ID of a bitmap with "cold" toolbar images. 
   UINT uiMenuResID=0,    //Resource ID of a bitmap with menu images. 
   UINT uiDisabledResID=0,//Resource ID of a bitmap with disabled toolbar images. 
   UINT uiMenuDisabledResID=0 //Resource ID of a bitmap with disabled menu images. 
); 


对于使用CContextMenuManager管理的上下文菜单项,若要添加图标则思路为:

(1)使弹出菜单的某一项的ID与ToolBar中的某一个工具按钮的ID相同,从而建立弹出菜单与ToolBar资源之间的联系;

(2)为建立联系的ToolBar创建位图图像BITMAP,则这时弹出菜单的某一项与位图的内容就建立了关联;

(3)为建立关联的ToolBar和BitMap调用CMFCToolBar::AddToolBarForImageCollection(ToolBarID,BitMapID);

(4)这里需要的ToolBar和BitMap仅仅需要资源就可以,不需要在程序运行中实际创建;


在资源视图ToolBar插入一个ToolBar,然后创建四个工具栏对象,如下图所示:

接着四个工具栏对象的ID号要跟需要绑定到菜单项图标的ID号一致,且顺序一致。接着把预先准备好的工具栏图像位图BMP,加载到资源视图里面,修改其ID为IDB_POPUP_BITMAP,如下图所示:

 

然后,在初始化函数OnInitialUpdate()下添加入下代码:

CMFCToolBar::AddToolBarForImageCollection (IDR_TOOLBAR1,IDB_POPUP_BITMAP); 

运行程序就可以看到效果了,但是此时还是灰色状态,为菜单项“添加事件处理程序”,结果如下图所示:

 

参考资料:
1.CContextMenuManager http://msdn.microsoft.com/en-us/library/bb982387.aspx
2.CMFCToolBar::AddToolBarForImageCollection http://msdn.microsoft.com/en-us/library/bb983344%28VS.90%29.aspx
3.BCGControlBar菜单编程方法详解 http://www.evget.com/zh-CN/Info/catalog/14414.html



Visual Studio 2010 MFC Ribbon 用户界面 新增Windows7样式,操作方便,效果也很漂亮。但在透明图标的制作却让初学者头疼。使用普通的BMP位图做图标背景不透明,很难看。

其实Ribbon上用的图标是32位的位图序列,包含Alpha通道。Visual Studio 2010 MFC 自带的编辑器不好用,要配合一些图标制作软件,才能制作出32位包含Alpha通道的位图图标序列。

1.准备好需要的32X32普通图标文件,可以从网上下载喜欢的,或是自己手动做。

2.用图标合并工具将图标合并成一个位图序列。这里我用的是Visual Toolbar 1.5破解版。使用方法很简单我就不讲了。

3.用photoshop打开各32X32的图标(我这里用png格式的图标),设有N个图标。新建一个宽度为N乘以32像素,高度为32像素的空白图像,颜色模式为8位的RGB颜色,背景内容为透明,将各图标依次并排拷贝至新的图像上,放好位置,选择“图层”-“合并可见图层”。当然多图标位图合并也可以使用专业的工具如Visual Toolbar,在我的资源里可以下载。

4.按Ctrl+A全选图像,然后在通道面板中选择创建新通道,默认的是Alpha1通道,按Ctrl+V粘贴刚复制的内容,出现黑白的图像,黑色为纯白色,原物变为灰黑色,双击新建的Alpha1通道,然后用魔棒选中背景区,用黑色油漆桶将背景漆为黑色,再选择反选选中实物区,按“Delete”键将特物区删除成白色。

5.存储图像,格式选择BMP格式,并勾选Alpha通道选项,点保存后弹出BMP选项,使用默认文件格式为Windows,深度为32位,即可保存。另外,最好制作对应的小图标供使用。方法是将刚才做好的图标大小调整为16X16,再用同样的方法保存一个32位具有Alpha通道的位图即可。

6.将制作好的32位BMP格式位图资源(32X32图标和对应的16X16图标)导入VC2010项目中,设置ID分别为IDB_Large、IDB_Small,在Ribbon中需要使用该图标的类别控件属性中设置Large Images为IDB_ Large,Small Images为IDB_Small,即可使用刚制作好的位图集。在面板中添加按钮并在属性中Image Index选择相应的图标索引即可。

运行程序就会看到效果了。


使用MFC的菜单资源会遇到为菜单添加提示(ptromopt)情况,规则是:

例如:创建新文件\n新建——则“创建新文件”会出现在状态栏,且“新建”和“创建新文件”同时出现在对应工具栏的气泡提示中,且“新建”在第一行,“创建新文件”作为提示出现在第二行。

如下所示:



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值