2010-06-13 9 views
4

Je suis en train de développer une liste listée sur le shell. Lorsque j'essaie d'extraire une icône/image de shell ... J'essaie d'extraire une miniature en utilisant IExtractImage si cela échoue, j'essaie d'extraire des icônes en utilisant IExtractIcon, pour obtenir le maximum de iconsize, mais IExtractIcon donne des résultats étranges. Le problème est que j'ai essayé d'utiliser une méthode qui extrait des icônes d'une liste d'images, mais s'il n'y a pas de grande icône (256x256) cela rendra l'icône plus petite à la position topleft de l'icône et ça n'a pas l'air bien. C'est pourquoi j'essaie d'utiliser l'IExtractIcon à la place. Mais les icônes qui apparaissent sous la forme d'icônes 256x256 dans ma méthode d'extraction de l'imagiste indiquent des tailles d'icônes de 33 grandes et 16 petites. Alors, comment vérifier si une grande icône (256x256) existe? Si vous avez besoin de plus d'informations, je peux fournir un exemple de code.Utilisation et résultat de Delphi Shell IExtractIcon

if PThumb.Image = nil then 
begin 
    OleCheck(ShellFolder.ParseDisplayName(0, nil, StringToOleStr(PThumb.Name), Eaten, PIDL, Atribute)); 
    ShellFolder.GetUIObjectOf(0, 1, PIDL, IExtractIcon, nil, XtractIcon); 
    CoTaskMemFree(PIDL); 
    bool:= False; 
    if Assigned(XtractIcon) then 
    begin 
    GetLocationRes := XtractIcon.GetIconLocation(GIL_FORSHELL, @Buf, sizeof(Buf), IIdx, IFlags); 
    if (GetLocationRes = NOERROR) or (GetLocationRes = E_PENDING) then 
    begin 
     Bmp := TBitmap.Create; 
     try 
     OleCheck(XtractIcon.Extract(@Buf, IIdx, LIcon, SIcon, 32 + (16 shl 16))); 
     Done:= False; 

Roy M Klever

+0

voir ce lien http://stackoverflow.com/questions/1703186/can-48x48-or-64x64-icons-be-obtained-from-the-vista-shell – RRUZ

+0

Merci, mais c'est un de mes problèmes. .. si l'élément n'a pas une grande icône (256x256) mais seulement une icône normale (32x32) vous obtenez toujours un bitmap 256x256 mais maintenant avec l'icône 32x32 dans le coin topleft de l'image bitmap ... semble stupide et n'est pas utile pour moi puisque je l'échelle de 56 à 256 pixels. J'essaie de trouver comment je suis supposé obtenir l'image/icône représentée dans l'Explorateur pour que je puisse avoir le même look. –

+0

AFAIK Explorer utilise la liste d'images système, il n'extrait pas d'icône pour chaque fichier. –

Répondre

-1

Prenez votre bitmap 256x256 et simplement vérifier alpha. Assurez-vous que le bmp est 32 bits. Toute partie qui a 0 pour la valeur de pixel (c'est-à-dire BGRA 0,0,0,0, utilisez TBitmap.Scanline pour accéder) est transparente. Vous pouvez trouver la plus petite x et la plus petite coord ayant une valeur différente de zéro et c'est la taille réelle de votre icône. Maintenant, ce nombre peut être inférieur à la "taille de l'icône" telle qu'elle a été conçue. Par exemple, une icône 16x16 peut contenir une image de 2x2, ce qui serait un design étrange.

Mais bien sûr, une icône 8x16 est très bien possible. Considérant que les images sont toujours carrées, prenez le maximum si les coordonnées x et y trouvées (avec et hauteur de l'image réelle) et arrondissez-le au plus proche de 16,24,32,48,64,128 ou 256. Vous pouvez être certain que vous aurez l'icône centrée dans votre bitmap si vous recadrez à cette taille ensuite. Use Bmp.Width=sz; Bmp.Height=sz;. Vous pouvez ensuite l'agrandir ou le centrer sur votre bitmap standard (56x56? 256x256?). Donc, même si Windows n'a pas envie de vous donner les bonnes informations, vous pouvez contourner le besoin de cette information simplement en découvrant vous-même. Ce n'est peut-être pas la façon «correcte» de le faire, mais vous saurez que cela fonctionnera lorsque vous aurez terminé, plutôt que de naviguer sur MSDN pendant 4 heures et de ne jamais trouver de réponse.

+0

-1. Euh, quoi? Il n'y a pas de réponse à la question posée, et ce que vous avez écrit est presque incompréhensible. –

+0

@kenw: Une citation: "S'il n'y a pas de grande icône (256x256), l'icône la plus petite s'affichera à la position topleft ... Alors, comment vérifier si une grande icône (256x256) existe?". Eh bien, vous pouvez vérifier s'il existe en le demandant, mais il retournera un 256x256 avec un petit ico dessus, donc pour vraiment vérifier (étape 2), vous devez comprendre par programme si l'icône est _actually_ cette taille, méthode est décrite ci-dessus. J'assume une certaine connaissance de Delphi dans le post et ce n'est pas un manuel, je sais. Notez également le commentaire "vous obtenez toujours un bitmap 256x256 mais avec une icône 32x32 dans le coin". – DDS

+0

@DDS Eh bien c'est exactement ce que j'ai fait et ça marche très bien ... et oui j'ai passé beaucoup plus de quatre heures à msdn à essayer de le comprendre. Vous pouvez voir ma solution dans cet exemple d'application [Link] (http://rmklever.com/?p=266) –