English 中文(简体)
MFC功能包类菜单上的图标
原标题:
  • 时间:2008-09-16 08:34:36
  •  标签:

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

  • In menu bars (CMFCMenuBar)
  • In popup menus (CMFCPopupMenu)
  • In the dropdown menu version of CMFCButton

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

最佳回答

这就是我让它工作的方式:

First

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

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) );
    }
}

Second: The images and toolbar resources

IDR_MAINFRAME and IDR_MAINFRAME_256 were generated by AppWizard. The former is the ugly 16 color version and the latter is the interesting high color version.
Despite its name, if I remember correctly, even the AppWizard-generated image has 24bit color depth. The cool thing: Just replace it with a 32bit image and that ll work, too.

有一个不可见的工具栏IDR_OTHERTOOLBAR:我用资源编辑器创建了一个工具栏。只是一些伪图标和命令ID。VS随后生成了一个位图,我用我的高颜色版本替换了它。完成!

Note

Don t open the toolbars with the resource editor: It may have to convert it to 4bit before it can do anything with it. And even if you let it do that (because, behind Visual Studio s back, wou re going to replace the result with the high color image again, ha!), I found that it (sometimes?) simply cannot edit the toolbar. Very strange.
In that case I advise to directly edit the .rc file.

问题回答

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

在BCGToolbar中,只需在资源&;加载它(但不显示窗口),但工具栏按钮必须与要链接到的菜单项具有相同的ID。

尝试使用此功能:

CMFCToolBar::AddToolBarForImageCollection(UINT uiResID,
   UINT uiBmpResID=0,
   UINT uiColdResID=0,
   UINT uiMenuResID=0,
   UINT uiDisabledResID=0,
   UINT uiMenuDisabledResID=0);

因此,例如:

CMFCToolBar::AddToolBarForImageCollection(IDR_TOOLBAROWNBITMAP_256);

对我来说效果很好。

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





相关问题
热门标签