Иконки в меню классов MFC Feature Pack

Есть три места, где меню отображаются в новой функциональности MFC (Feature Pack):

  • В строках меню (CMFCMenuBar)
  • Во всплывающих меню (CMFCPopupMenu)
  • В "раскрывающемся меню" версия CMFCButton

Я хочу поместить значки (цветные и с прозрачностью) в меню во всех них. Я нашел CFrameWndEx::OnDrawMenuImage(), который я могу использовать для пользовательского рисования значков перед элементами строки меню. Это не очень удобно, когда приходится реализовывать рисование иконок в 2008 году, но это работает. Для других я еще не нашел решения. Есть ли автоматический способ установки значков для меню?

5 ответов

Решение

Вот как я получил это на работу:

Первый

как говорили другие, создайте невидимую панель инструментов рядом с основной панелью инструментов (я использую обычные имена, основанные на именах 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) );
    }
}

Второе: изображения и ресурсы панели инструментов

IDR_MAINFRAME а также IDR_MAINFRAME_256 были созданы AppWizard. Первая - это уродливая 16-цветная версия, а вторая - интересная цветная версия.
Несмотря на название, если я правильно помню, даже изображение, созданное AppWizard, имеет глубину цвета 24 бита. Классная вещь: просто замените его на 32-битное изображение, и это тоже будет работать.

Есть невидимая панель инструментов IDR_OTHERTOOLBAR: Я создал панель инструментов с редактором ресурсов. Просто несколько фиктивных значков и идентификаторов команд. Затем VS сгенерировал растровое изображение, которое я заменил своей цветной версией. Готово!

Заметка

Не открывайте панели инструментов с помощью редактора ресурсов: возможно, придется преобразовать его в 4-битный, прежде чем он сможет что-либо с ним сделать. И даже если вы позволите ему это сделать (потому что за спиной Visual Studio вы снова замените результат изображением с высоким цветом, ха!), Я обнаружил, что он (иногда?) Просто не может редактировать панель инструментов. Очень странно.
В этом случае я советую напрямую редактировать файл.rc.

Попробуйте использовать эту функцию:

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

Так, например:

CMFCToolBar::AddToolBarForImageCollection(IDR_TOOLBAROWNBITMAP_256);

Работал очень хорошо для меня.

Я считаю (но я могу ошибаться), что эти классы такие же, как классы BCGToolbar, которые были включены в MFC, когда Microsoft купила BCG. Если это так, вы можете создать панель инструментов и использовать тот же идентификатор на кнопке панели инструментов, что и в пунктах меню, для которых вы хотите создать значки, и они должны появиться автоматически. Конечно, вам не нужно отображать панели инструментов.

В BCGToolbar достаточно создать панель инструментов в ресурсах и загрузить ее (но не отображать окно), но кнопка панели инструментов должна иметь тот же идентификатор, что и элемент меню, с которым вы хотите связать ее.

Одна вещь, которая может застать человека врасплох, это то, что для настраиваемых (то есть не заблокированных) панелей инструментов, первой созданной панели инструментов, структура разделяется и превращается в своего рода палитру растровых изображений всех значков в программе. Если позже вы попытаетесь добавить больше панелей инструментов (или других панелей инструментов), которые имеют растровые изображения (или png) с глубиной цвета, отличной от той, что была у первого, они, похоже, потерпят неудачу, потому что они не могут добавить их в одну и ту же палитру.

Другие вопросы по тегам