MFC Feature Pack类菜单上的图标

MFC Feature Pack类菜单上的图标

Icons on menus of MFC Feature Pack classes

新的MFC功能(功能包)在三个位置显示菜单:

  • 在菜单栏中(CMFCMenuBar)
  • 在弹出菜单(CMFCPopupMenu)中
  • 在"下拉菜单"版本的CMFCButton中

我想在所有菜单中放入图标(彩色和透明)。 我找到了CFrameWndEx :: OnDrawMenuImage(),可以用来自定义在菜单栏项目前面绘制图标。 这不是很方便,必须在2008年实现图标绘制,但是可以。 对于其他人,我还没有找到解决方案。 是否有一种自动设置菜单图标的方法?


这就是我的工作方式:

第一

,就像其他人所说的那样,在主工具栏旁边创建一个不可见的工具栏(我使用的是基于AppWizard名称的常用名称):

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
31
32
33
MainFrm.h:
class CMainFrame
{
    //...    
    CMFCToolBar m_wndToolBar;
    CMFCToolBar m_wndInvisibleToolBar;
    //...
};

MainFrm.cpp:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    //...

    // Normal, visible toolbar
    if(m_wndToolBar.Create(this,
        TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC))
    {
        VERIFY( m_wndToolBar.LoadToolBar(
            theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME) );

        // Only the docking makes the toolbar visible
        m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
        DockPane(&m_wndToolBar);
    }

    // Invisible toolbar; simply calling Create(this) seems to be enough
    if(m_wndInvisibleToolBar.Create(this))
    {
        // Just load, no docking and stuff
        VERIFY( m_wndInvisibleToolBar.LoadToolBar(IDR_OTHERTOOLBAR) );
    }
}

第二:图像和工具栏资源

IDR_MAINFRAMEIDR_MAINFRAME_256由AppWizard生成。前者是丑陋的16色版本,后者是有趣的高色版本。
尽管名称正确,但如果我没有记错,即使由AppWizard生成的图像也具有24位色深。很棒的事情:只需将其替换为32位图像即可。

有一个不可见的工具栏IDR_OTHERTOOLBAR:我使用资源编辑器创建了一个工具栏。只是一些虚拟图标和命令ID。 VS然后生成了一个位图,我将其替换为高彩色版本。做完了!

注意

请勿使用资源编辑器打开工具栏:它可能必须先将其转换为4bit,然后才能对其执行任何操作。即使您允许这样做(因为在Visual Studio的背后,您将再次用高彩色图像替换结果,哈!),我发现它(有时?)根本无法编辑工具栏。很奇怪。
在这种情况下,我建议直接编辑.rc文件。


尝试使用此功能:

1
2
3
4
5
6
CMFCToolBar::AddToolBarForImageCollection(UINT uiResID,
   UINT uiBmpResID=0,
   UINT uiColdResID=0,
   UINT uiMenuResID=0,
   UINT uiDisabledResID=0,
   UINT uiMenuDisabledResID=0);

因此:

1
CMFCToolBar::AddToolBarForImageCollection(IDR_TOOLBAROWNBITMAP_256);

对我来说做得很好。


在BCGToolbar中,足以在资源中创建工具栏并加载它(但不显示窗口),但是工具栏按钮必须具有与要链接到它的菜单项相同的ID。


我相信(但我可能错了),这些类与Microsoft购买BCG时MFC中包含的BCGToolbar类相同。如果是这样,则可以使用要创建图标的菜单项中的菜单项来创建工具栏,并在该工具栏按钮上使用相同的ID,它们应自动出现。当然,您不必实际显示工具栏。


让人惊讶的一件事是,对于可定制(即非锁定)的工具栏,即您制作的第一个工具栏,框架拆分并变成程序中所有图标的某种调色板位图。如果您以后尝试添加更多的工具栏(或其他工具栏),这些工具栏的位图(或png)的颜色深度与第一个不同,则它们似乎失败了,因为无法将它们添加到同一调色板中。


推荐阅读

    linux显示错误命令?

    linux显示错误命令?,信息,系统,电脑,状态,时间,环境,命令,搜狐,密码,异常,虚

    linux逐行显示命令?

    linux逐行显示命令?,标准,信息,系统,工作,地址,命令,实时,名称,文件,目录,Lin

    linux显示时间命令?

    linux显示时间命令?,时间,系统,管理,标准,信息,单位,工具,数据,中国,命令,lin

    linux命令行打印图标?

    linux命令行打印图标?,系统,信息,工具,服务,环境,地方,数字,网络,工作,命令,l

    linux启动显示命令行?

    linux启动显示命令行?,系统,密码,终端,状态,首页,情况,基础,电脑,信息,工具,l

    linux命令行打印图标?

    linux命令行打印图标?,系统,信息,工具,服务,环境,地方,数字,网络,工作,命令,l

    linux启动显示命令行?

    linux启动显示命令行?,系统,密码,终端,状态,首页,情况,基础,电脑,信息,工具,l

    linux显示之前的命令?

    linux显示之前的命令?,系统,信息,命令,地址,服务,环境,数据,标准,数字,不了,l

    linux打开显示器命令?

    linux打开显示器命令?,信息,工具,系统,环境,发行,实时,数据,设备,命令,文件,L

    linux命令实时显示?

    linux命令实时显示?,系统,实时,时间,信息,情况,命令,对比,电脑,名称,一致,lin

    linux内置命令位置?

    linux内置命令位置?,工作,系统,信息,地址,位置,标准,命令,目录,密码,名字,Lin

    linux外部命令显示?

    linux外部命令显示?,系统,工具,命令,一致,盘中,软件,技术,外部,内部,文件夹,L

    linux命令显示ip?

    linux命令显示ip?,地址,系统,网络,信息,技术,电脑,手机,设备,服务,管理,配置L

    linux编译时显示命令?

    linux编译时显示命令?,系统,基础,工具,代码,百度,下来,网上,命令,内核,文件,L

    linux显示运行命令?

    linux显示运行命令?,系统,服务,状态,信息,工具,数据,电脑,标准,管理,时间,如

    显示linux网卡命令行?

    显示linux网卡命令行?,系统,信息,工具,网络,服务,电脑,网卡,技术指标,地址,

    linux命令显示内容?

    linux命令显示内容?,标准,系统,数据,命令,百度,实时,时间,信息,文件,内容,lin

    linux命令防火墙位置?

    linux命令防火墙位置?,系统,服务,软件,密码,状态,位置,防火墙,工具,公共,设

    linux常用显示命令?

    linux常用显示命令?,工作,地址,系统,信息,管理,命令,目录,标准,功能,常用命

    命令上一级菜单linux?

    命令上一级菜单linux?,目录,电脑,系统,命令,位置,软件,名称,空格,上级,终端,l