Comment convertir HICON à HBITMAP dans VC++?
Comment convertir HICON à HBITMAP dans VC++?
Je sais que c'est une FAQ, mais toutes les solutions que j'ai trouvé sur Google ne fonctionnent pas. Ce dont j'ai besoin est une fonction qui prend un paramètre HICON et retourne HBITMAP.
Plus si possible de faire la conversion en bitmap 32 bits même l'icône est de 24 bits, 16 bits ou 8 bits.
C'est le code, je ne sais pas où ça se passe mal:
HBITMAP icon_to_bitmap(HICON Icon_Handle) {
HDC Screen_Handle = GetDC(NULL);
HDC Device_Handle = CreateCompatibleDC(Screen_Handle);
HBITMAP Bitmap_Handle =
CreateCompatibleBitmap(Device_Handle,GetSystemMetrics(SM_CXICON),
GetSystemMetrics(SM_CYICON));
HBITMAP Old_Bitmap = (HBITMAP)SelectObject(Device_Handle,Bitmap_Handle);
DrawIcon(Device_Handle, 0,0, Icon_Handle);
SelectObject(Device_Handle,Old_Bitmap);
DeleteDC(Device_Handle);
ReleaseDC(NULL,Screen_Handle);
return Bitmap_Handle;
}
OriginalL'auteur jondinham | 2011-09-10
Vous devez vous connecter pour publier un commentaire.
Je n'ai pas de code facilement accessibles à partager, mais je pense que c'est assez facile. Vous devez créer la HBITMAP, créer un contexte de périphérique, sélectionnez l'image dans le contrôleur de domaine (cela rendra le bitmap de la zone de dessin pour ce contrôleur de domaine). Enfin appeler la DrawIcon() fonction pour dessiner votre icone sur ce DC. Après que la détacher de l'image à partir de la DC et de détruire les DC. Votre image bitmap devriez maintenant être prêt à aller.
Mise à jour après avoir regardé votre code:
Je crois que le problème est dans la createCompatibleBitmap appel. Vous demandez un bitmap compatible avec le DC de mémoire, mais la mémoire DCs commencent par un 1 bit/pixel image bitmap sélectionné. Essayez de demander à un bitmap compatible avec l'écran de DC à la place.
Mise à jour 2: vous pouvez regarder la cette question comme il semble liée à votre problème.
Veuillez élargir votre question avec des exemples de code. Semble que votre image a été créée avec le droit de bits/pixel, mais ne peut pas dire à coup sûr, sans regarder le code.
ajouté le code, le DC créé à partir de l'écran de sorte qu'il est censé être 32 bits/pixel, les pls ont un coup d'oeil....
J'ai mis à jour ma réponse, donnez-lui un essai et laissez-moi savoir si ça aide!
Voir le lien que j'ai ajouté à la question, il peut être de l'aide.
OriginalL'auteur Miguel
OriginalL'auteur Euan
ce code n':
et c'est le code dans l' *.fichier rc:
et c'est le code dans l' *.h fichier:
hbmColor
suffisant pour représenter une icône dans HBITMAP? Quel est lehbmMask
?OriginalL'auteur user1544067
J'ai trouvé ceci(le même code fonctionne pour moi - 32x32 icônes avec ou sans données alpha):
utilisé CopyImage msdn (lien)
BM_32_bit_color image peut être Alpha *canal*(tous les 4 octets) déjà mis en! Afin de vérifier cela avant u " ajouter un masque de bits de données de couleur.
OriginalL'auteur befzz