В приложении .NET 1.0 C# я хочу отображать список файлов и папок в элементе управления listview. Я хочу программно извлекать из окон значки файлов или папок, чтобы отображать их соответствующим образом в виде списка.
В настоящее время я использую Windows API 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();
Это правильный подход?
Есть ли лучший способ добиться этого?
Или мне нужно что-то сделать, чтобы правильно установить альфа-канал в значке?





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