2008-12-14 9 views
1

Dans une application .NET 1.0 C#, je souhaite afficher une liste de fichiers et de dossiers dans un contrôle listview. Je veux récupérer par programme à partir des fenêtres les icônes pour les fichiers ou les dossiers pour les afficher de manière appropriée dans la vue de la liste. Actuellement, j'utilise Windows API Shell32.dll, mais j'ai des problèmes avec le canal alpha dans les icônes (les arrière-plans des icônes apparaissent en noir, plutôt qu'en blanc/transparent). Ci-dessous deux extraits de code montrant l'API que j'essaie d'utiliser, et le code implémenté pour récupérer l'icône du système pour un dossier (le code du fichier est similaire).Récupération des icônes système dans les canaux C# 1.0 et Alpha

[DllImport("Shell32.dll")] 
    public static extern IntPtr SHGetFileInfo(
     string pszPath, 
     uint dwFileAttributes, 
     ref SHFILEINFO psfi, 
     uint cbFileInfo, 
     uint uFlags 
     ); 

... (note: Shell32 est une classe wrapper pour l'API ci-dessus)

// Get the folder icon 
      Shell32.SHFILEINFO shfi = new Shell32.SHFILEINFO(); 
      Shell32.SHGetFileInfo( null, 
       Shell32.FILE_ATTRIBUTE_DIRECTORY, 
       ref shfi, 
       (uint) System.Runtime.InteropServices.Marshal.SizeOf(shfi), 
       flags); 

      System.Drawing.Icon.FromHandle(shfi.hIcon); // Load from the handle 

      // Get the icon for storage in an imagelist // 
      System.Drawing.Icon icon = (System.Drawing.Icon)System.Drawing.Icon.FromHandle(shfi.hIcon).Clone(); 

Est-ce la bonne approche?

Existe-t-il un meilleur moyen d'y parvenir?

Ou, y a-t-il quelque chose que je dois faire pour définir correctement le canal alpha dans l'icône?

Répondre

2

Il existe un bogue dans .NET 1.x, documenté (sorte de) dans KB822488, par lequel les canaux alpha dans les icônes sont perdus lors de la conversion en une image (comme ce serait le cas lors du chargement dans une ImageList). Malheureusement, la solution de contournement dans l'article n'est pas particulièrement utile pour ListViews.

Vous pouvez utiliser l'API Windows pour charger directement les icônes dans la liste d'images de la liste, en ignorant le code .NET défectueux. This article traite de l'obtention d'icônes de la liste d'images système et du chargement de celles-ci dans ListView via l'API Windows, ce qui vous permet de dériver ce dont vous avez besoin.

+0

Merci! Cela m'a fait gagner beaucoup de temps. – Jayden

Questions connexes