Поиск системных иконок в C # 1.0 и альфа-каналах - PullRequest
1 голос
/ 14 декабря 2008

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

В настоящее время я использую 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();

Это правильный подход?

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

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

1 Ответ

2 голосов
/ 15 декабря 2008

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

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

...