2008-12-14 1 views
1

В приложении .NET 1.0 C# я хочу отобразить список файлов и папок в элементе управления listview. Я хочу программно извлекать из окон значки для файлов или папок, чтобы отображать их соответственно в виде списка.Иконки системы Получение в C# 1.0 и альфа-каналах

В настоящее время я использую Windows Shell Shell32.dll, но у меня проблемы с альфа-каналом в значках (фон значков отображается как черный, а не белый/прозрачный).

Ниже приведены два вывода кода, показывающие 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(); 

Является ли это правильный подход?

Есть ли лучший способ достичь этого?

Или, есть что-то, что мне нужно, чтобы правильно установить альфа-канал в иконке?

ответ

2

Существует ошибка в .NET 1.x, документально подтвержденная (вид) в KB822488, в результате чего альфа-каналы в значках теряются при преобразовании в изображение (как это происходит при загрузке их в ImageList). К сожалению, обходной путь в статье не особенно полезен для ListViews.

Возможно, вы можете использовать Windows API для непосредственной загрузки значков в список изображений списка, минуя ошибочный код .NET. This article обсуждает получение значков из списка системных изображений и их загрузку в ListView через Windows API, поэтому вы сможете получить то, что вам нужно оттуда.

+0

Спасибо! Это сэкономило мне много времени. – Jayden

Смежные вопросы