【问题标题】:System Icons Retrieval in C# 1.0 and Alpha ChannelsC# 1.0 和 Alpha 通道中的系统图标检索
【发布时间】:2010-09-26 20:15:25
【问题描述】:

在 .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 通道?

【问题讨论】:

    标签: c# .net winapi api icons


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      • 2011-09-07
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      相关资源
      最近更新 更多