您的位置:首页 > 其它

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

2013-12-09 19:46 417 查看
在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

VC2010 Ribbon 图标位图制作方法

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新建——则“创建新文件”会出现在状态栏,且“新建”和“创建新文件”同时出现在对应工具栏的气泡提示中,且“新建”在第一行,“创建新文件”作为提示出现在第二行。
如下所示:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐