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

发布于 2024-07-11 00:48:25 字数 1202 浏览 7 评论 0原文

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

目前,我正在使用 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 通道?

In a .NET 1.0 C# application, I wish to display a list of files and folders in a listview control. I want to programmatically retrieve from windows the icons for the files or folders to display them appropriately in the list view.

At present, I am using the Windows API Shell32.dll, but am having problems with the alpha channel in the icons (the backgrounds of the icons are showing up as black, rather than white / transparent).

Below are two code extracts showing the API I'm trying to use, and the implemented code to retrieve the system icon for a folder (the code for the file is similar).

    [DllImport("Shell32.dll")]
    public static extern IntPtr SHGetFileInfo(
        string pszPath,
        uint dwFileAttributes,
        ref SHFILEINFO psfi,
        uint cbFileInfo,
        uint uFlags
        );

... (note : Shell32 is a wrapper class for the above 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();

Is this the right approach?

Is there a better way to accomplish this?

Or, is there something I need to do to correctly set the alpha channel in the icon?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

溺渁∝ 2024-07-18 00:48:25

.NET 1.x 中有一个错误,记录在 KB822488 中,其中图标中的 Alpha 通道在转换为图像的过程中会丢失(就像将它们加载到 ImageList 中时会发生的情况一样)。 不幸的是,本文中的解决方法对于 ListView 并不是特别有帮助。

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

There is a bug in .NET 1.x, documented (sort of) in KB822488, whereby alpha channels in icons are lost during conversion into an Image (as would happen when loading them into an ImageList). Unfortunately, the workaround in the article is not particularly helpful for ListViews.

You may be able to use the Windows API to directly load the icons into the list view's image list, bypassing the faulty .NET code. This article discusses getting icons from the System Image List and loading them into a ListView via the Windows API, so you might be able to derive what you need from there.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文