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