Значки в меню классов функциональных пакетов MFC

StackOverflow https://stackoverflow.com/questions/70386

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

Первый

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

Другие советы

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

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

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

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) с другой глубиной цвета, чем у первого, они, похоже, потерпят неудачу, потому что не смогут добавить их в одну палитру.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top