winapi — Создание меню, нарисованного владельцем, в стиле C ++, 2012

Цель моего квеста проста — добавить значки в мое контекстное меню, которое отображается через вызов API TrackPopupMenu. Но, очевидно, кодирование для Windows — это все равно, что грести ложкой, и нет простого способа добавить значки, кроме как сделать меню, нарисованное владельцем. Поэтому я провел некоторый поиск, в котором был найден набор кода C ++ по теме меню, нарисованного владельцем, но пока я не могу найти ни одного, который бы работал для меня. Причина проста — меню, которые оно рисует, похоже на то, что появилось в Windows 95 … Так есть ли способ создать меню, нарисованное владельцем, которое имеет внешний вид Windows 7 по умолчанию?

PS. Если есть более простой способ добавления значков к элементам меню, скажем, LoadIcon, а затем ChangeMenuItem, чтобы установить его, я был бы признателен, если бы кто-то мог показать мне, как, потому что вместо этого я бы с удовольствием пошел с ним …

PS2. Хорошо, это занимает слишком много времени на мой вкус. Почему я не могу выполнить простейшую задачу в этой ОС 🙁 Я сделал небольшой тестовый проект чтобы проиллюстрировать проблему. Я загружаю растровое изображение с помощью моего собственного метода CreatePARGBBitmapFromIcon, который преобразует значок в растровое изображение PARGB (как было предложено ниже), а затем отображает его в двух местах: элемент управления CStatic (середина экрана, который выглядит просто отлично) и в пункте меню (вот и все.) Вот скриншот с Windows 7 и XP (оба выглядят совершенно по-разному):

введите описание изображения здесь

введите описание изображения здесь

Так, ребята, серьезно, что мне здесь не хватает ????

PS3. Благодаря @DavidHeffernan я смог это исправить. Вот рабочее решение C ++ / MFC, вот статья решение основано на, и вот несколько скриншотов:

введите описание изображения здесь
введите описание изображения здесь

Просто к вашему сведению, мне потребовалось около 2 дней, чтобы решить эту проблему — что заняло бы около 2 минут на OS X или iOS …

И, наконец, пара моих любимых цитат из исходной статьи, которые я полностью поддерживаю:

Все эти хаки и рецепты были бы бесполезны, если бы только
простой последовательный API для создания значков пунктов меню. К сожалению меню
значки, то, что всегда присутствовало в Windows и Microsoft
приложения, никогда не получали достойного API, более того, методы, чтобы получить
эти значки меняются для каждой основной версии Windows, заставляет нас
разработчики тратят наше время, «портируя» наши приложения на новые «шинни»
Windows, а не делать что-то продуктивное
.

и это хорошо подводит итог:

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARGH! Почему Microsoft заполнена
идиоты ???

4

Решение

В этой статье рассказывается, как это сделать: http://www.nanoant.com/programming/themed-menus-icons-a-complete-vista-xp-solution

Таким образом, в XP вы должны передать HBMMENU_CALLBACK в поле hbmpItem структуры MENUITEMINFO. Это заставляет вашего владельца меню рисовать, но вам нужно иметь дело только с иконками в WM_MEASUREITEM и WM_DRAWITEM.

В Vista и выше вы помещаете растровое изображение PARGB32 (предварительно умноженное альфа, 32-битную глубину цвета) в hbmpItem и позволяете системе нарисовать меню. Таким образом, ни один владелец не опирается на Vista и выше. Несмотря на то, что API темы действительно предлагает функциональность для рисования меню, до чертиков трудно получить права, и в этом действительно нет необходимости, так как вы можете позволить системе делать это.

7

Другие решения

Других решений пока нет …