Извлечение системных значков в C# 1.0 и альфа-каналах

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

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

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

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

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


person Jayden    schedule 14.12.2008    source источник


Ответы (1)


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

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

person Eric Rosenberger    schedule 15.12.2008