2013-10-10 2 views
1

Tout d'abord, je ne suis pas un développeur C++, je programme principalement en C#. J'essaie d'utiliser la classe ContextMenu (oui je suis au courant de ContextMenuStrip) dans .NET qui est un wrapper autour de CMenu dans mon application.Façon simple d'afficher un bitmap à côté d'un élément de menu dans un CMenu avec une transparence correcte

Comment afficher une image à côté d'un élément de menu présentant une transparence appropriée?

Ce que je l'ai fait jusqu'à présent est d'appeler SetMenuItemBitmaps sur mon élément de menu, voici le résultat ci-joint:

enter image description here

Comme vous pouvez le voir, il y a un fond blanc sur l'élément de menu. C'est tellement frustrant près de ce que je veux. Comment puis-je faire disparaître les problèmes de transparence? J'ai joint l'image exacte je ci-dessous sur cet élément de menu:

enter image description here

Je sais que SetMenuItemBitmaps n'est pas pour les images de couleur.

Les bitmaps sélectionnés et clairs doivent être monochromes. Le système utilise l'opérateur booléen AND pour combiner les bitmaps avec le menu afin que la partie blanche devienne transparente et la partie noire devient la couleur de l'élément de menu . Si vous utilisez des bitmaps couleur, les résultats peuvent être indésirables.

Alors, quelle est la manière correcte (espérons-le simple) de le faire?

EDIT

Une autre chose que j'ai essayé d'appeler a été SetMenuItemInfo, mais je continue à obtenir l'erreur 87 (paramètre non valide).

C'est ce que la structure MENUITEMINFO ressemble avant d'appeler SetMenuItemInfo:

enter image description here

Et les valeurs des paramètres I appel à SetMenuItemInfo sont:

hMenu - La poignée à la Menu contextuel?

uItem-0 (le premier indice de l'élément?)

fByPosition - true

lpmii - (le contenu de la structure ci-dessus)

+0

Il n'y a rien d'anormal avec la structure que je peux voir, donc peut-être vérifier que 'hMenu' est valide?Peut-être tester en appelant 'GetMenuItemInfo()' pour obtenir quelque chose de simple ('fState' par exemple). –

+0

@JonathanPotter J'ai réussi à faire fonctionner SetMenuItemInfo, merci pour la direction. Le seul problème est qu'il ressemble exactement à ce qui précède (pixélisé avec un fond blanc). – test

+0

Est-ce que votre bitmap 32bpp avec alpha pré-multiplié? –

Répondre

1

Lorsque vous ajoutez l'élément de menu, Il suffit de définir le drapeau MIIM_BITMAP et de passer le HBITMAP au membre hbmpItem de la structure MENUITEMINFO. Si votre bitmap est 32bpp avec alpha pré-multiplié alors il sera affiché correctement.

+0

Désolé de vous faire cela, mais pouvez-vous me donner un exemple d'appel à SetMenuItemInfo qui fait ce que vous avez dit? En fait, j'ai tenté ce que vous avez décrit comme ma première tentative, mais je n'ai pas réussi à le faire fonctionner. – test

+0

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

+0

Ouais j'ai pensé que cette partie, je ne suis pas en train de créer le menu en C++. C'est une application C# donc je dois pinvoke pour le faire. Je ne suis pas sûr à 100% comment j'appellerais SetMenuItemInfo et peuplerais aussi la structure MENUITEMINFO. Je reçois systématiquement l'erreur 87 (paramètre invalide). – test

Questions connexes