Возможно ли тематическое главное меню с иконками в Delphi?

я использую Delphi 7. Тестировали на Windows 7.

падение TMainMenu и TImageList на форме. Добавьте некоторые меню в TMainMenu и некоторые изображения в TImageList. Когда TImageList не присваивается TMainMenu ' s Images свойство, приложение выглядит следующим образом:

Delphi themed TMainMenu without icons

но после того, как TImageList назначена TMainMenu ' s Images свойства, применение, как выглядит это:

Delphi non-themed TMainMenu with icons

дальше больше, если Images свойство изменяется (назначается или не назначается) во время выполнения, меняются только элементы подменю, элементы корневого меню (Файл, редактирование, Инструменты, Настройки и справка в моем примере приложения) никогда не меняются-они всегда остаются тематическими, если Images собственность не была назначена во время разработки, или они всегда остаются не тематическими, если Images свойство было назначено во время разработки.

и, наконец, все это происходит ли это.

Итак, мои вопросы:

1. Почему тема исчезает, когда используются значки? я бы предположил, что значки рисуются внутри, используя что-то вроде рисования владельца, что нарушает тематику, но это всего лишь догадка.

2. Почему главное меню тематическое, даже когда XPManifest не используется?

3. И самое главное, как я могу иметь тематический меню со значками?

1 ответов


Я надеюсь, что этот ответ не будет слишком много разглагольствовать, но это область, где Embarcadero имеют долгую историю неправильных шагов. Я представил большое количество отчетов QC в этой области, поэтому, возможно, я немного озлоблен. Тем не менее, самые последние выпуски Delphi, похоже, реализуют меню приемлемым образом. Я не смог споткнуться о меню XE6, когда недавно взял их на спину. Но им потребовалось много времени, чтобы наверстать упущенное.

ваш Delphi предварительно датирует Vista. И Vista был большой сарай для воды для меню Windows. Хотя API темы был представлен в XP, он не оказал реального влияния на меню. Что изменилось в Vista. Но Delphi 7 был до всего этого и был закодирован с XP в виду.

в XP рисование меню с глифами было непросто. The MENUITEMINFO struct имеет растровое поле,hbmpItem. Но в XP он имеет ограниченное применение. Системное рисованное меню XP не будет рисовать чистое Альфа-растровое изображение в меню. Такие меню требуют рисования владельца. И так в коде Delphi 7, если в вашем меню есть какие-либо глифы, то он будет нарисован владельцем. И владелец нарисован с помощью API XP.

это объясняет разницу между двумя скриншотами в вашем вопросе. Тематический скриншот-это меню без глифов. Код меню Delphi 7 просит систему нарисовать меню. И он рисует тематические меню. С манифестом comctl32 или без него. Это стандартное меню на Vista и более поздних.

и когда вы добавляете глифы, код VCL, который знает только о XP, решает владелец рисует меню. И делает это, используя функциональность XP. В конце концов, нельзя ожидать, что он будет использовать API тематического меню Vista. Предварительно даты код тех.

современные версии Delphi постепенно добавили поддержку тематических меню Vista. Оригинальные реализации в Menus юниты были, честно говоря, жалкие. Дизайнеры Embarcadero решили нарисовать меню с помощью API темы. API, который во всех смыслах и целях является недокументированным. Вероятно, лучший источник информация об этом API-это исходный код Delphi (!), и исходный код вина. Бессмысленно искать MSDN для помощи здесь. Так что я сочувствую Эмбаркадеро, бедному инженеру, который должен был это решить. И возьмите 5 выпусков программного обеспечения, чтобы смыть ошибки.

однако, Embarcadero также заслуживают небольшого порицания. Для этого можно заставить систему рисовать тематические меню на Vista и вверх, которые содержат глифы. Секрет в