Как скинить главное меню MFC

У меня есть меню в существующем приложении MFC со стандартным главным меню MFC.

Но я хотел бы изменить цвет его фона, чтобы он более органично вписывался в остальную часть приложения.

  • Первое изображение: главное меню MFC. Приложение окрашено в синий цвет, как видно на панели инструментов, но меню по-прежнему имеет стандартный серый цвет фона.

  • Второе изображение: меню Spotify, скин, чтобы соответствовать остальным цветам.

меню

Я не нашел примеров ни о чем подобном. Не могли бы вы указать мне, как этого добиться?

Подходы, о которых я думал:

  1. Подкласс CMenu к моему собственному SkinnedMenu, но он создается не нашим кодом, а вызовом GetMenu() в классе мейнфрейма, производном от CFrameWnd. Единственное, что я могу найти здесь, это его сигнатура метода, определенная в afxwin.h, так как же тогда я могу использовать свое собственное меню подклассов?

  2. Удаление всего меню и добавление моих собственных пользовательских кнопок меню в ряд, чтобы оно выглядело как меню. Возможно, это то, что сделали Spotify, так как они также удалили оконную рамку Windows.

  3. Каким-то образом редактирую существующий CMenu, но единственная настройка, которую я могу найти прямо сейчас, это изменение его MENUINFO. Например, если я установлю info.hbrBack = skin.GetSysColorBrush(COLOR_MENU), изменится только цвет фона раскрывающегося списка, а не самого главного меню.

  4. Другой :)


person JOG    schedule 26.07.2012    source источник
comment
Ах, царство пользовательских элементов управления. Есть несколько способов добиться желаемого. Начните с подкласса элемента управления и переопределения OnPaint(), просто имейте в виду, что вам придется обрабатывать макет.   -  person johnathan    schedule 26.07.2012
comment
Я мог бы создать подкласс CMenu. Но его пункты определены в файлах ресурсов, а само меню получено из CFrameWnd. Я добавлю это к вопросу. Как бы я тогда использовал подкласс?   -  person JOG    schedule 30.07.2012
comment
Я сделал это успешно, используя новые классы MFC Feature Pack. Мой основной фрейм происходит от CFrameWndEx, имеет элемент CMFCMenubar для своего меню. И я реализовал тему, написав класс, производный от одного из уже существующих на фреймворке классов MFC Visual Manager. Затем я настроил его, чтобы получить цвета в соответствии с тем, что я притворялся и делал CMFCVisualManager::SetDefaultManager (RUNTIME_CLASS (CMyVisualManager)), где CMyVisualManager — класс моей темы.   -  person sergiol    schedule 05.06.2016