Рисование значков вместо растровых изображений в MFC CMenu? - PullRequest
2 голосов
/ 06 ноября 2008

Я могу использовать растровое изображение в меню

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.

Ответы [ 5 ]

4 голосов
/ 06 ноября 2008

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

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

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

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

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

0 голосов
/ 07 марта 2012

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

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

0 голосов
/ 25 июня 2009

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

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

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

Укротитель

0 голосов
/ 22 мая 2009

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

        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 голосов
/ 06 ноября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...