首页 / 知识

MFC Feature Pack类菜单上的图标

2023-04-15 19:34:00

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)的颜色深度与第一个不同,则它们似乎失败了,因为无法将它们添加到同一调色板中。


菜单图标下拉菜单位置

最新内容

相关内容

猜你喜欢