Иконки в меню классов MFC Feature Pack - PullRequest
8 голосов
/ 16 сентября 2008

В трех новых функциях MFC (Feature Pack) меню отображаются:

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

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

Ответы [ 5 ]

4 голосов
/ 31 июля 2009

Вот как я заставил его работать:

Первый

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

2 голосов
/ 06 августа 2009

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

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

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

CMFCToolBar::AddToolBarForImageCollection(IDR_TOOLBAROWNBITMAP_256);

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

2 голосов
/ 18 сентября 2008

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

2 голосов
/ 16 сентября 2008

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

0 голосов
/ 24 апреля 2009

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

...