2013-10-10 4 views
1

Во-первых, я не разработчик на C++, я программирую в основном на C#. Я пытаюсь использовать класс ContextMenu (да, я знаю, ContextMenuStrip) в .NET, который является оболочкой в ​​CMenu в моем приложении.Простой способ показать растровое изображение рядом с пунктом меню в CMenu с правильной прозрачностью

Как отобразить изображение рядом с пунктом меню, имеющим соответствующую прозрачность?

Что я сделал до сих пор называют SetMenuItemBitmaps на моем пункте меню, здесь прилагается результат:

enter image description here

Как вы можете видеть, что есть белый фон на пункт меню. Это просто так расстраивает, что я хочу. Как я могу избежать проблем с прозрачностью? Я приложил точный образ я использовал ниже по данному пункту меню:

enter image description here

Я знаю, что SetMenuItemBitmaps не предназначен для цветных изображений.

Выбранные и четкие растровые изображения должны быть монохромными. Система использует оператор Boolean AND, чтобы комбинировать растровые изображения с меню, чтобы белая часть стала прозрачной, а черная часть стала цветом меню . Если вы используете цветные растровые изображения, результаты могут быть нежелательными.

Итак, каков правильный (надеюсь, простой) способ сделать это?

EDIT

Другая вещь, которую я пытался звала SetMenuItemInfo, но я получаю ошибку 87 (неверный параметр).

Это то, что структура MENUITEMINFO выглядит как раньше я называю SetMenuItemInfo:

enter image description here

И значения параметров Призываю SetMenuItemInfo являются:

HMenu - Ручка к Контекстное меню?

uItem - 0 (первый индекс элемент?)

fByPosition - истинный

lpmii - (содержание структуры выше)

+0

Нет ничего явно неправильного в структуре, которую я вижу, поэтому, возможно, проверьте, что 'hMenu' действительно?Может быть, тест, вызвав 'GetMenuItemInfo()', чтобы получить что-то простое (например, 'fState'). –

+0

@JonathanPotter Ну, мне удалось заставить SetMenuItemInfo работать, спасибо за направление. Единственная проблема заключается в том, что он выглядит точно так же, как и выше (пиксель с белым фоном). – test

+0

Является ли ваш растровый 32bpp с заранее умноженной альфой? –

ответ

1

При добавлении пункта меню, просто установите флаг MIIM_BITMAP и передайте HBITMAP в члене hbmpItem структуры MENUITEMINFO. Если ваше растровое изображение составляет 32bpp с предварительно умноженной альфа, то оно будет отображаться правильно.

+0

Прошу прощения за это, но можете ли вы предоставить мне пример правильного вызова SetMenuItemInfo, который делает то, что вы сказали? Я действительно попытался описать то, что вы описали, как мою первую попытку, но не смог заставить ее работать. – test

+0

'mi.fMask | = MIIM_BITMAP; mi.hbmpItem = hbmp; ' –

+0

Да, я понял, что часть, я просто не создаю меню на C++. Это приложение на C#, поэтому я должен сделать вывод, чтобы сделать это. Я не уверен на 100%, как я бы назвал SetMenuItemInfo, а также заполнил структуру MENUITEMINFO. Я постоянно получаю ошибку 87 (недопустимый параметр). – test