2008-12-14 51 views
1

在.NET 1.0 C#應用程序中,我希望在listview控件中顯示文件和文件夾的列表。我想以編程方式從窗口中檢索文件或文件夾的圖標,以在列表視圖中適當地顯示它們。在C#1.0和Alpha通道中檢索系統圖標

目前,我使用的是Windows API Shell32.dll,但是在圖標中Alpha通道出現問題(圖標的背景顯示爲黑色,而不是白色/透明)。

下面是兩個代碼提取,顯示我正在嘗試使用的API,以及實現的代碼來檢索文件夾的系統圖標(該文件的代碼類似)。

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

... (注:SHELL32是上述API的包裝類)

// 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(); 

這是正確的做法?

有沒有更好的方法來實現這個目標?

或者,有什麼我需要做的正確設置圖標中的alpha通道?

回答

2

在.NET 1.x中存在一個錯誤,在KB822488中記錄(排序),從而在轉換爲圖像期間丟失圖標中的alpha通道(將它們加載到ImageList時會發生這種情況)。不幸的是,文章中的解決方法對於ListView並不是特別有用。

您可能可以使用Windows API將圖標直接加載到列表視圖的圖像列表中,從而繞過錯誤的.NET代碼。 This article討論從系統映像列表中獲取圖標並通過Windows API將它們加載到ListView中,以便您可以從那裏獲取所需的內容。

+0

謝謝!這節省了我很多時間。 – Jayden 2008-12-15 23:49:28