2017-10-21 79 views
1

J'essaye d'utiliser quelques icônes de système telles que SIID_DOCNOASSOC et SIID_FOLDER et les dessiner.Masque manquant de HICON sur Win10 mais pas Win7

J'ai le problème que mon code fonctionne comme prévu dans Windows 7, sur Windows 10 les images récupérées manquent leur masque. Je ne peux pas comprendre pourquoi (le champ PICONINFO.hbmMask que je peux récupérer avec GetIconInfo est non nul, indiquant qu'il y a un masque, en effet).

Mon code est écrit en realbasic, qui utilise un dialecte de VB, mais cela ne devrait guère d'importance, comme je l'ai eu à travailler dans Win 7, je pense:

dim info as SHSTOCKICONINFO 
info.cbSize = SHSTOCKICONINFO.Size 
SHGetStockIconInfo (SIID_DOCNOASSOC, SHGSI_ICON, info) 

dim iconHandle as Integer = info.hIcon 
dim destDC as Integer = ... // intialized outside 
DrawIconEx (destDC, 0, 0, iconHandle, 0, 0, 0, 0, DI_MASK) 

Le code ci-dessus alla chercher la icône pour un fichier simple, puis dessine son masque. Alors que le masque est correct sur Win 7, le masque est entièrement noir sur toute la zone de l'icône sur Win 10.

Pourquoi cela se produirait-il?

+0

Vous semblez ignorer les valeurs de retour, donc ne pas avoir de vérification d'erreur –

+0

Win10 est plus susceptible d'être la version 64 bits, donc une erreur de déclaration pinvoke peut facilement octet. Il n'est pas non plus évident si c'est la même icône, Win10 utilisera beaucoup plus d'icônes plus chics. Celui qui incorpore une image PNG et n'a pas de masque. Aucune n'est nécessaire car le format PNG prend déjà en charge la transparence. –

+1

[L'évolution du format de fichier ICO, partie 4: images PNG] (https://blogs.msdn.microsoft.com/oldnewthing/20101022-00/?p=12473). – IInspectable

Répondre

1

Windows XP added support pour les icônes ARGB 32 bits avec transparence alpha. Ces icônes contiennent toujours un bitmap de masque en noir et blanc mais il est souvent incorrect, cela dépend de l'éditeur d'icônes utilisé et de la façon dont l'artiste a dessiné l'image! Ils ressemblent souvent à l'icône de mes documents au this article.

Vista added support pour les images PNG dans les icônes (souvent appelé "compressé" dans les éditeurs d'icônes) et ne contient pas de bitmap de masque. Il n'est pas documenté ce que GetIconInfo fait pour créer le masque pour ceux-ci.

Les jours de jeu avec les masques HICON sont révolus, si vous voulez dessiner une icône, vous devriez laisser les fenêtres le faire pour vous sans extraire les parties d'un HICON. ImageList_DrawEx a un support de mélange si vous en avez besoin.

Si vous avez absolument besoin d'un masque pour une raison quelconque, vous devez le créer vous-même lorsque l'icône contient une transparence alpha. Choisissez une sorte de seuil (25, 50, peu importe) et traitez tout ce qui est plus haut que cela comme transparent lorsque vous inspectez les valeurs alpha.

+0

J'ai besoin de post-traiter l'icône dans l'environnement de Xojo, donc je dois pouvoir le dessiner dans l'objet Image de Xojo, par ex. avec DrawIcon - et comme Xojo ne supporte pas encore le canal alpha sur Windows (mais seulement un masque img + séparé), je vais devoir extraire le masque séparément. Merci d'avoir fourni des informations générales et d'autres suggestions pour résoudre ce problème. Je vais les regarder plus tard. –

+0

OK, avec votre indication d'utiliser l'alpha au lieu du masque, je l'ai résolu avec Xojo maintenant aussi. Il s'avère que les versions récentes de Xojo prennent soudainement en charge les alphas et semblent avoir une gestion de masque cassée en cours de route. Après avoir réécrit mon code, je peux maintenant utiliser la méthode DrawIcon plus simple pour dessiner l'icône dans un objet Picture sans avoir besoin de séparer l'image et le masque, et cela s'est débarrassé du problème avec Win 10. –

+0

En regardant l'article, je me demande comment je peut obtenir les icônes de stock de haute résolution pour le dossier, le dossier, le disque etc.? SHGetStockIconInfo semble seulement me donner les tailles classiques 16x16 et 32x32. J'ai cherché SO pour des solutions mais seulement rien sur obtenir des versions modernes haute résolution de ces icônes de stock que File Explorer utilise. –