2008-11-06 4 views
2

je peux utiliser un bitmap dans un menuDessin d'icônes à la place de bitmaps dans un CM Menu MFC?

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

Je peux dessiner une icône dans un 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); 

Mais je ne peux pas trouver un moyen simple de montrer une icône dans un menu. Je voudrais le faire

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

Cela devrait être possible.


C'est la même question que this. Cependant, cette question renvoyée au pack de fonctions MFC n'a pas reçu de réponse et n'a montré aucune activité depuis un mois. J'ai donc pensé qu'il serait utile de le demander à nouveau en référence au MFC de base.

Répondre

4

J'ai posé la question à laquelle vous faites référence. La manière d'ajouter des icônes (couleurs 16 bits normales) aux menus consiste à créer une barre d'outils avec le même identifiant de ressource que le menu dans lequel vous souhaitez placer des icônes. Vous attribuez ensuite des identifiants à chacun des boutons de la barre d'outils, le même identifiant que les entrées du menu. Créez une nouvelle application MFC générée par un assistant et vous verrez comment cela fonctionne.

Les réponses à la question que j'ai posté ont suggéré qu'il devrait fonctionner de même pour les images 32 bits avec transparence pour les barres d'outils Feature Pack; Je ne suis pas venu pour le tester cependant. Si votre problème spécifique est comment faire des menus générés dynamiquement, je pense que vous devriez passer l'ID d'une entrée existante dans une barre d'outils, puis cette image sera utilisée.

Pas vraiment une réponse à votre question, mais peut-être que cela vous dirigera dans la bonne direction.

+0

Merci. Cela semble fonctionner. Cependant, cela semble plutôt compliqué, d'autant plus que je n'ai pas travaillé avec des barres d'outils auparavant. Pour l'instant, je vais m'en tenir à ma solution de contournement actuelle - stocker un bitmap ET une icône pour chaque image. Soupir! – ravenspoint

-1

Afin de mettre en place un bitmap pour un menu, vous devez appeler CMenu :: SetMenuItemInfo() pour chaque élément avec quelque chose comme ceci:

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

Une autre complication faire est que ce OK pour les bitmaps 256 couleurs, mais pas les bitmaps RVB 32 bits full color - ceux-ci fonctionneront, mais seulement sur Vista, et seulement si vous présentez le bitmap comme RGBA pré-calculé. En pratique, dans mon code j'utilise une autre fonctionnalité des icônes de menu, qui est de mettre le hbmpItem en HBMMENU_CALLBACK, ce qui permet un rappel pour dessiner le bitmap: je le fais pour Windows XP et avant. Le code devient un peu trop compliqué à poster ici. À titre d'exemple, vous pouvez jeter un oeil à mon code à

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

Rechercher dans "MenuBar.h" et "MenuBar.cpp", en particulier le code autour MenuBar :: SetBitmaps().

+0

Vous semblez avoir mal lu la question. Je sais comment utiliser un bitmap dans un menu (en utilisant une méthode plus simple, posté dans ma question). J'espérais découvrir comment utiliser une icône avec une méthode aussi simple. – ravenspoint

0

Bon code. S'il vous plaît noter que cela montre l'image bitmap, mais il est toujours bon de supprimer l'espace vide à gauche de la chaîne (utilisé pour vérifier/décocher) si vous montrez l'image. J'ai fait comme ça.

 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

Je pense que ce que vous cherchez est très similaire à ce qui est décrit ici ... www.codeguru.com/cpp/contrôle/Menu/bitmappedmenus/article.php/C165/

mixte

avec ce qui est décrit dans www.codeproject.com/KB/shell/DynIcon.aspx

reste à voir si cela va fonctionner .

Tamer

0

Sous Windows Vista/Windows7 vous ne pouvez pas le faire, il est soit une image 32 BGRA ou le menu n'est pas dessiné dans le nouveau style de l'interface utilisateur. Il n'y a pas de solution de contournement, peut-être propriétaire, mais j'ai lu l'API de style ne fonctionne pas correctement avec les menus, donc je n'ai jamais essayé d'approfondir.

Vous devez utiliser des icônes BGRA 32 bits de toute façon.

Questions connexes