2008-11-06 3 views
2

я могу использовать растровое изображение в менюРисование значков вместо растровых изображений в MFC CMenu?

CMenu men; 
CBitmap b; 
b.LoadBitmap(IDB_0); 
men.AppendMenu(MF_ENABLED,1,&b); 

Я могу нарисовать иконку в DC

CImageList IL; 
    IL.Create(70, 14, ILC_COLOR16 | ILC_MASK, 1, 0); 
    IL.Add(AfxGetApp()->LoadIcon(IDI_0)); 
    IL.Draw (pDC, 0, rcIcon.TopLeft(), ILD_BLEND50); 

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

CMenu men; 
CBitmap b; 
// here the miracle happens, load the icon into the bitmap 
men.AppendMenu(MF_ENABLED,1,&b); 

Похоже, это должно быть возможно.


Это тот же вопрос, что и this. Однако этот вопрос, упомянутый в пакете функций MFC, не получил ответа и не показывал активности в течение месяца, поэтому я подумал, что было бы целесообразно снова задать его в отношении базового MFC.

ответ

4

Я задал вопрос, на который вы ссылаетесь.

Способ добавления (обычных, 16-битных цветов) значков в меню состоит в том, чтобы сделать панель инструментов с тем же идентификатором ресурса, что и в меню, в котором вы хотите иметь значки. Затем вы назначаете идентификаторы каждой из кнопок панели инструментов, те же идентификаторы, что и записи меню. Создайте новое приложение MFC, созданное мастером, и вы увидите, как он работает там.

Ответы на вопрос, который я опубликовал, предположили, что он должен работать одинаково для 32-битных изображений с прозрачностью для панелей инструментов Feature Pack; Однако я не стал проверять это.

Если ваша конкретная проблема заключается в том, как создавать динамически созданные меню, я думаю, вы должны передать идентификатор существующей записи на панели инструментов, а затем это изображение будет использоваться.

Не настоящий ответ на ваш вопрос, но, возможно, он укажет вам в правильном направлении.

+0

спасибо. Похоже, это может сработать. Однако это кажется довольно сложным, тем более, что я раньше не работал с панелями инструментов. На данный момент я буду придерживаться своего обходного пути - сохранение растрового изображения И значка для каждого изображения. Вздох! – ravenspoint 2008-11-06 14:05:11

-1

Для того, чтобы установить битовую карту для меню, вам нужно вызвать CMenu :: SetMenuItemInfo() для каждого элемента с чем-то вроде этого:

MENUITEMINFO mii; 
mii.cbSize = sizeof mii; 
mii.fMask = MIIM_BITMAP; 
mii.hbmpItem = bitmapHandle; 
menu.SetMenuItemInfo(menuItem,&mii,TRUE); 

Еще одна сложность этого состоит в том, что это хорошо для 256 цветных растровых изображений, но не полноцветных 32-битных растровых изображений RGBA - они будут работать, но только на Vista, а затем только в том случае, если вы представляете растровое изображение как предварительно вычисленное RGBA.

На практике в моем коде я обойдусь этим, используя другую функцию значков меню, которая заключается в том, чтобы установить hbmpItem в HBMMENU_CALLBACK, что позволяет обратный вызов рисовать растровое изображение: я делаю это для Windows XP и раньше. Код становится слишком сложным, чтобы публиковать здесь. В качестве примера, вы можете взглянуть на мой код на

http://www.ifarchive.org/if-archive/infocom/interpreters/frotz/WindowsFrotzSrc.zip

Посмотрите в «MenuBar.h» и «MenuBar.cpp», в частности, кода вокруг MenuBar :: SetBitmaps().

+0

Вы, кажется, неправильно поняли вопрос. Я знаю, как использовать растровое изображение в меню (используя более простой метод, опубликованный в моем вопросе). Я надеялся узнать, как использовать значок с одинаково простым методом. – ravenspoint 2008-11-06 16:40:57

0

Хороший код. Обратите внимание, что это показывает растровое изображение, но всегда полезно удалить пустое пространство, оставшееся до строки (используется для проверки/unchek), если вы показываете изображение. Мне это понравилось.

 MENUINFO mi; 
     mi.cbSize = sizeof(mi); 
     mi.fMask = MIM_STYLE; 
     mi.dwStyle = MNS_NOCHECK; 
     pcSubMenu->SetMenuInfo(&mi); 

     MENUITEMINFO mii; 
     mii.cbSize = sizeof mii; 
     mii.fMask = MIIM_BITMAP; 

     mii.hbmpItem = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_16_HELP),IMAGE_BITMAP,0,0,LR_SHARED |LR_VGACOLOR |LR_LOADTRANSPARENT); 
     pcSubMenu->SetMenuItemInfo(ID_CONTENTS,&mii,FALSE); 
0

Я думаю, что вы ищете, очень похоже на то, что описано здесь ... www.codeguru.ком/CPP/управления/меню/bitmappedmenus/article.php/C165/

смешанный с тем, что описано в www.codeproject.com/KB/shell/DynIcon.aspx

Еще надо посмотреть, если он будет работать ,

Укротитель

0

На Windows Vista/Windows7 вы не можете сделать это, это либо 32 BGRA или меню не прорисовывается в новом стиле пользовательского интерфейса. Нет обходного пути, возможно, ownerdrawing, но я читаю API стиля, который работает неправильно с меню, поэтому я никогда не пытался глубже в нем.

В любом случае вы должны использовать 32-битные значки BGRA.

Смежные вопросы