当前位置:  开发笔记 > 编程语言 > 正文

避免在.NET(C#)项目中重复的图标资源

如何解决《避免在.NET(C#)项目中重复的图标资源》经验,为你挑选了3个好方法。

我正在使用Visual C#2008 Express.我想为应用程序使用相同的图标(即.exe显示的图标),以及主窗体.不幸的是,VC#似乎并不是很聪明,并且坚持要复制图标数据.

似乎没有办法选择"已嵌入"的图标用于表单或项目图标(仅选择文件),并且对两个图标使用相同的文件只是将文件嵌入两次尽可能远看到.这不是什么大不了的事(现在硬盘空间很便宜,对吧?),但这让我很烦恼.

知道怎么避免这个吗?有没有办法以编程方式加载可执行文件的图标,以便在构建表单时使用,比如说?一些关于类似事情的论坛帖子似乎暗示.NET资源不使用普通的旧Windows资源系统 - 在获取旧式资源的框架内有没有办法?或者我是否必须绑定Win32 API函数才能执行此操作?



1> lc...:

你是对的,而且很烦人.

您必须自己加载图标,而不是依赖设计器生成的代码.将图标保存为项目资源,然后将资源加载到Icon窗体构造函数中的窗体属性中:

this.Icon = Properties.Resources.myIconResourceName;


与可执行文件关联的图标存储为正常的win32图标资源.这是您在XN资源编辑器中查看时看到的资源.这与.NET资源系统*不同*****存储可执行文件中的资源,但不是以相同的格式存储资源.

2> 小智..:

你在找Icon.ExtractAssociatedIcon.调用传递可执行文件:

var icon = Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location);


请解释为什么这么慢?如果是因为它使用的是反射,可以通过使用Application.ExecutablePath而不是Assembly.GetExecutingAssembly()来轻松解决.

3> vanmelle..:

是的,这很烦人.但是Icon.ExtractAssociatedIcon的建议答案的问题是它将检索32x32图标,然后在表单窗口或任务栏上下采样到16x16图标,除非你的32x32图标构造得非常巧妙,否则看起来很糟糕.

我正在做的方式是使用interop(将第一行放在表单构造函数中):

this.Icon = ExtractSmallIconFromLibrary(Application.ExecutablePath);
...

public static Icon ExtractSmallIconFromLibrary(string file) {
    IntPtr[] reficon = new IntPtr[1];
    int nextracted = ExtractIconEx(file, 0, null, reficon, 1);
    if (nextracted < 1)
        return null;
    Icon unmanaged_icon = Icon.FromHandle(reficon[0]);
    Icon icon = (Icon)unmanaged_icon.Clone();
    DestroyIcon(unmanaged_icon.Handle);
    return icon;
}

[DllImport("Shell32", CharSet = CharSet.Auto)]
extern static int ExtractIconEx(
    [MarshalAs(UnmanagedType.LPTStr)] 
    string lpszFile,
    int nIconIndex,
    IntPtr[] phIconLarge,
    IntPtr[] phIconSmall,
    int nIcons
    );

[DllImport("user32.dll", CharSet = CharSet.Auto)]
extern static bool DestroyIcon(IntPtr handle);

但这也不是很好,因为你确实需要像Alt-Tab图标列表那样的32x32图标.所以你真的需要提取整个图标,这是一个更大的工作.也许有一种直接的方法将两个图标合二为一.或者你可以像这个codeproject程序一样,它首先用大量的代码提取整个图标.

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有