1

在 .NET 1.0 C# 应用程序中,我希望在列表视图控件中显示文件和文件夹列表。我想以编程方式从 Windows 检索文件或文件夹的图标,以便在列表视图中适当地显示它们。

目前,我使用的是 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 通道吗?

4

1 回答 1

2

.NET 1.x 中有一个错误,在KB822488中记录(某种程度) ,其中图标中的 alpha 通道在转换为图像期间丢失(就像将它们加载到 ImageList 时一样)。不幸的是,文章中的解决方法对 ListViews 并不是特别有用。

您可以使用 Windows API 直接将图标加载到列表视图的图像列表中,绕过错误的 .NET 代码。本文讨论了从系统图像列表中获取图标并通过 Windows API 将它们加载到 ListView 中,以便您可以从那里获得所需的内容。

于 2008-12-15T05:22:04.047 回答