C#1.0和Alpha通道中的系统图标检索

时间:2008-12-14 06:09:34

标签: c# .net winapi api icons

在.NET 1.0 C#应用程序中,我希望在listview控件中显示文件和文件夹列表。我想以编程方式从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通道吗?

1 个答案:

答案 0 :(得分:2)

.NET 1.x中存在一个错误,在KB822488中记录(有点),其中图标中的alpha通道在转换为图像时会丢失(就像将它们加载到ImageList中时一样)。不幸的是,本文中的解决方法对ListViews没有特别的帮助。

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