Рисование значков вместо растровых изображений в 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.


mfc
person ravenspoint    schedule 06.11.2008    source источник


Ответы (5)


Я задал вопрос, о котором вы говорите.

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

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

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

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

person Roel    schedule 06.11.2008
comment
Спасибо. Похоже, это может сработать. Однако это кажется довольно сложным, тем более что я раньше с панелями инструментов не работал. На данный момент я буду придерживаться своего текущего обходного пути - сохранения растрового изображения И значка для каждого изображения. Вздох! - person ravenspoint; 06.11.2008

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

        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);
person Community    schedule 22.05.2009

Я думаю, что то, что вы ищете, очень похоже на то, что описано здесь ... www.codeguru.com/cpp/controls/menu/bitmappedmenus/article.php/c165/

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

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

Укротитель

person Community    schedule 25.06.2009

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

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

person Lothar    schedule 07.03.2012

Чтобы настроить растровое изображение для меню, вам нужно вызвать 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 ().

person DavidK    schedule 06.11.2008
comment
Похоже, вы неправильно прочитали вопрос. Я знаю, как использовать растровое изображение в меню (используя более простой метод, опубликованный в моем вопросе). Я надеялся узнать, как использовать значок таким же простым способом. - person ravenspoint; 06.11.2008