C#中的图标让我好无语!!!!!

问题描述

我自己写个桌面上的app玩,搞了个图标,ico文件,里面有32,64,96,128,256等分辨率,约500KB程序在没图标的情况下,约200KB1.我先把程序图标设置下,去工程->属性->应用程序->图标上选择文件程序增加500K,到了700K!2.我把窗口的图标设置下,去窗口属性的Icon上选择文件程序又增加500K,到了1.2MB!3.我想是不是去资源那设置下,让他们共用就好了?又去工程->属性->资源->图标里添加现在文件,程序又增加了500K!,到了1.5MB!!!这微软的程序员写的东西,也有放水的时候啊,多个地方引用同一个图标,竟然不会管理?请位大神,我应该怎么设置,才让它只增加一个图标体积?另外,我的图标里是有高分辨率的,为啥exe在资源管理器中大图标模式下还是显示小图标,而且有很明显的锯齿现象?我一直是在win32的vc下开发的,c#没接触过多久,可视我的是好,但问题也多.......

解决方案

本帖最后由 sunbinjin 于 2014-11-15 19:56:53 编辑
解决方案二:
对了,我的开发工具是vs2013update3
解决方案三:
一般用40*40的ico就够用了,既可以作为应用程序的图标又可以作为窗体的图标,首先将应用程序的图标设置好,这个图标会自动加载到你的应用程序目录下,注意要在文件夹中看,解决方案中是看不到的,其它的窗体图标统一用这个位置下的图标。
解决方案四:
我们使用60x60的图标。因为在有些windows桌面上会选择“大图标”模式查看的。图标文件一般也就几k。你的问题,可以试试重新启动一下vs。
解决方案五:
引用2楼LanMangFeiGe的回复:

一般用40*40的ico就够用了,既可以作为应用程序的图标又可以作为窗体的图标,首先将应用程序的图标设置好,这个图标会自动加载到你的应用程序目录下,注意要在文件夹中看,解决方案中是看不到的,其它的窗体图标统一用这个位置下的图标。

40*40是严重不标准的图标啊?另大图时,40完全不够看,所以我才做了这么大的图标,得用起来啊,别浪费
解决方案六:
引用3楼sp1234的回复:

我们使用60x60的图标。因为在有些windows桌面上会选择“大图标”模式查看的。图标文件一般也就几k。你的问题,可以试试重新启动一下vs。

变成1.7MB这问题,重启vs肯定没用啦,当然我也确实重启了
解决方案七:
这不被视作一个图标。你可以不要设置窗体的图标,只设置项目的图标,在Form_Load中加载。不过要用API函数。
解决方案八:
引用6楼caozhy的回复:

这不被视作一个图标。你可以不要设置窗体的图标,只设置项目的图标,在Form_Load中加载。不过要用API函数。

请问如何设置?首先,既然资源不与程序图标合二为一,正确体积上来说,我不应该增加资源了,2倍大小明显是错误的在这种情况下,我应该怎么设置窗口的图标?程序图标如何传进去?你说的不视作一个图标是啥意思?同一个图标文件,被多次引用,竟然在exe里增加多倍体积,这还真是说不过去啊,我要是有100个窗口引用这个图标的话,这事可以判定为严重失误不?
解决方案九:
针对你的第3点,不重启就会累加,重启vs就能解决,这是我们实际遇到过的问题。重启之后对工程项目“清理”,或者再把bin目录下的内容删光。
解决方案十:
只有你描述的3,在我看来可能是个真的问题,需要解决。对于2,你可以打开每一个窗体的.resx文件,然后选择最左边的菜单下拉选择“图标”,可以看到图标资源。因此如果你不想设置图标,那么删除它就是了。你可以把图标放到项目的资源中(而不是窗体的),然后在程序启动时给窗体设置图标。
解决方案十一:
另外你的图标“32,64,96,128,256等分辨率,约500KB”,这实在没有必要。仅仅保留64尺寸的一个就够了!这样,它可能只有20k左右,而不是500k。
解决方案十二:
程序的图标是.exe的PE文件里的资源,在文件夹里看到的就是操作系统取的这个图标。另一个是.net的嵌入资源,所以是两份。然后.net的嵌入资源也是分Form和工程的,如果没有用工程公共的,每个Form设置一份,那就是多份了。可以用Icon.ExtractAssociatedIcon方法从一个PE文件中取图标,不过效果并不好,因为它给出的只是一个尺寸。一般给程序的图标很大,包含了多种尺寸,为了美观可能会做到256*256,而Form的图标包含32*32和16*16就够了。Form的Icon让人很无语的是不能直接通过设计器选择工程公共资源,通过设计器设置的Icon会被放在Form的资源里。所以我的方案是把图标多做一份小的,只包含32和16,放到工程公共资源,通过代码设置Form的Icon使用工程资源。这样多余的大小也就是那个小图标,并不大。
解决方案十三:
嗯,把你的3看成重新设置工程图标了。原来你是跑到工程的资源文件里由设置了一份。你的做法,本来就是在三个地方都设置图标,自然是3倍尺寸。
解决方案十四:
引用12楼sp1234的回复:

嗯,把你的3看成重新设置工程图标了。原来你是跑到工程的资源文件里由设置了一份。你的做法,本来就是在三个地方都设置图标,自然是3倍尺寸。

是啊,我希望窗口和程序共用一份图标,正如楼上说的,c#让人无语的地主是form的icon不能在设计器里选公共资源
解决方案十五:
引用11楼github_22161131的回复:

程序的图标是.exe的PE文件里的资源,在文件夹里看到的就是操作系统取的这个图标。另一个是.net的嵌入资源,所以是两份。然后.net的嵌入资源也是分Form和工程的,如果没有用工程公共的,每个Form设置一份,那就是多份了。可以用Icon.ExtractAssociatedIcon方法从一个PE文件中取图标,不过效果并不好,因为它给出的只是一个尺寸。一般给程序的图标很大,包含了多种尺寸,为了美观可能会做到256*256,而Form的图标包含32*32和16*16就够了。Form的Icon让人很无语的是不能直接通过设计器选择工程公共资源,通过设计器设置的Icon会被放在Form的资源里。所以我的方案是把图标多做一份小的,只包含32和16,放到工程公共资源,通过代码设置Form的Icon使用工程资源。这样多余的大小也就是那个小图标,并不大。

看样子你也是在c#设计不合理的情况下,只能委屈求全了...如果真没有更好的办法,这让我感觉c#对图标这块设计是有缺陷的了...
其他方案:
引用14楼sunbinjin的回复:

Quote: 引用11楼github_22161131的回复:
程序的图标是.exe的PE文件里的资源,在文件夹里看到的就是操作系统取的这个图标。另一个是.net的嵌入资源,所以是两份。然后.net的嵌入资源也是分Form和工程的,如果没有用工程公共的,每个Form设置一份,那就是多份了。可以用Icon.ExtractAssociatedIcon方法从一个PE文件中取图标,不过效果并不好,因为它给出的只是一个尺寸。一般给程序的图标很大,包含了多种尺寸,为了美观可能会做到256*256,而Form的图标包含32*32和16*16就够了。Form的Icon让人很无语的是不能直接通过设计器选择工程公共资源,通过设计器设置的Icon会被放在Form的资源里。所以我的方案是把图标多做一份小的,只包含32和16,放到工程公共资源,通过代码设置Form的Icon使用工程资源。这样多余的大小也就是那个小图标,并不大。

看样子你也是在c#设计不合理的情况下,只能委屈求全了...如果真没有更好的办法,这让我感觉c#对图标这块设计是有缺陷的了...

在我看来这不是设计缺陷。而是出于效率的考虑。要是按照你说的办法,那就意味着每次运行时,程序都要去你指定的图标位置拷贝图标放入窗体。同时编译器需要保存你的路径,再加上要做文件是否存在判断,已经编译时预览加载的问题。与其这样不如浪费一些存储空间,直接将图片加载到窗体中,既保证安全,又能提高效率
其他方案:
放在资源内放一次就够了编写代码导入至Icon
其他方案:
引用16楼Windowsvipcuvs的回复:

放在资源内放一次就够了编写代码导入至Icon

第1个程序图标貌似没有办法使用资源,vs并没有地方设置从资源使用exe图标啊
其他方案:
引用15楼wow818wow的回复:

在我看来这不是设计缺陷。而是出于效率的考虑。要是按照你说的办法,那就意味着每次运行时,程序都要去你指定的图标位置拷贝图标放入窗体。同时编译器需要保存你的路径,再加上要做文件是否存在判断,已经编译时预览加载的问题。与其这样不如浪费一些存储空间,直接将图片加载到窗体中,既保证安全,又能提高效率

图标在form里或在资源里,我感觉加载速度不会有区别啊,资源安全性判断带来的成本你不可能感觉得到嘛
其他方案:
设置一下进程图标。然后http://blog.csdn.net/jia_xiaoxin/article/details/2992892这里面有获取进程图标的。再动态设置一下窗口的图标。
其他方案:
引用18楼sunbinjin的回复:

Quote: 引用15楼wow818wow的回复:
在我看来这不是设计缺陷。而是出于效率的考虑。要是按照你说的办法,那就意味着每次运行时,程序都要去你指定的图标位置拷贝图标放入窗体。同时编译器需要保存你的路径,再加上要做文件是否存在判断,已经编译时预览加载的问题。与其这样不如浪费一些存储空间,直接将图片加载到窗体中,既保证安全,又能提高效率

图标在form里或在资源里,我感觉加载速度不会有区别啊,资源安全性判断带来的成本你不可能感觉得到嘛

简单的项目你当然看不出来了,但是当数量大了之后呢,因为图标不是一两的啊。而且如果都是代码写。那窗体的设计器有什么用?不就是想让你看到效果么?难道为了省空间,每次开设计器都去加载?还有关键不是安全判断,而是文件不见了接下来怎么处理。如果你写了一个软件,忘记发布图标,结果界面丑死。你会不会骂微软?
其他方案:
引用20楼wow818wow的回复:

简单的项目你当然看不出来了,但是当数量大了之后呢,因为图标不是一两的啊。而且如果都是代码写。那窗体的设计器有什么用?不就是想让你看到效果么?难道为了省空间,每次开设计器都去加载?还有关键不是安全判断,而是文件不见了接下来怎么处理。如果你写了一个软件,忘记发布图标,结果界面丑死。你会不会骂微软?

你就没明白我的意思,我说的资源感觉我都没理解……我是说ms可以设计为form设计器里选图标时,是从资源里选,而不是去指定新文件,这样,资源文件即可用于文件图标,又可以用于所有窗口图标,明白了不?现在ms的结果是,exe图标一份,100个form要100份!你理解资源后,你后面说的,文件不存在、忘记发布图标根本都不存在
其他方案:
引用21楼sunbinjin的回复:

Quote: 引用20楼wow818wow的回复:
简单的项目你当然看不出来了,但是当数量大了之后呢,因为图标不是一两的啊。而且如果都是代码写。那窗体的设计器有什么用?不就是想让你看到效果么?难道为了省空间,每次开设计器都去加载?还有关键不是安全判断,而是文件不见了接下来怎么处理。如果你写了一个软件,忘记发布图标,结果界面丑死。你会不会骂微软?

你就没明白我的意思,我说的资源感觉我都没理解……我是说ms可以设计为form设计器里选图标时,是从资源里选,而不是去指定新文件,这样,资源文件即可用于文件图标,又可以用于所有窗口图标,明白了不?现在ms的结果是,exe图标一份,100个form要100份!你理解资源后,你后面说的,文件不存在、忘记发布图标根本都不存在

本来就可以用资源啊,是你自己没配置好罢了。导入图标时你没看到么?
其他方案:
引用22楼wow818wow的回复:

本来就可以用资源啊,是你自己没配置好罢了。导入图标时你没看到么?

那请回答我一楼的问题,无图标exe200k,1份图标500K,程序图标+窗口图标,如何配置,让程序只有700K?以你说的所谓的配置这种操作,而不是楼上的用ExtracIcon
其他方案:
引用23楼sunbinjin的回复:

Quote: 引用22楼wow818wow的回复:
本来就可以用资源啊,是你自己没配置好罢了。导入图标时你没看到么?

那请回答我一楼的问题,无图标exe200k,1份图标500K,程序图标+窗口图标,如何配置,让程序只有700K?以你说的所谓的配置这种操作,而不是楼上的用ExtracIcon

难道配置就只能是界面操作的方式,写config文件就不算配置?那你有没有想过为什么你编译完之后,删掉图标还是一样可以看到图标是为什么?或者说你为什么不把图标当成一个控件来理解?
其他方案:
图标只能选文件,估计是微软偷懒。VS可以自定义设计器,觉得不爽,可以自己写一个啊
其他方案:
引用25楼assky124的回复:

图标只能选文件,估计是微软偷懒。VS可以自定义设计器,觉得不爽,可以自己写一个啊

这明显是不可能的,ide做出来,就是方便人的,这种明显的缺陷,应该修改掉就好了问题是.net出来10多年了,这种设计上的问题都还有,就不解了
其他方案:
引用24楼wow818wow的回复:

难道配置就只能是界面操作的方式,写config文件就不算配置?那你有没有想过为什么你编译完之后,删掉图标还是一样可以看到图标是为什么?或者说你为什么不把图标当成一个控件来理解?

我们讨论的配置当然是指vs中的可视化开发,你如果有办法解决楼上的问题也算行啊别写代码再去load就行,那不是可视化的本意
其他方案:
引用27楼sunbinjin的回复:

Quote: 引用24楼wow818wow的回复:
难道配置就只能是界面操作的方式,写config文件就不算配置?那你有没有想过为什么你编译完之后,删掉图标还是一样可以看到图标是为什么?或者说你为什么不把图标当成一个控件来理解?

我们讨论的配置当然是指vs中的可视化开发,你如果有办法解决楼上的问题也算行啊别写代码再去load就行,那不是可视化的本意

正确,就是因为可视化,所以图片在你引用到窗口图标时,已经拷贝进去了,所以其实图片已经在代码里,就好像你放个控件上去,这个控件也会影响这个exe的大小
其他方案:
引用28楼wow818wow的回复:

正确,就是因为可视化,所以图片在你引用到窗口图标时,已经拷贝进去了,所以其实图片已经在代码里,就好像你放个控件上去,这个控件也会影响这个exe的大小

所谓的资源都是编译成exe时生成的数据,我疑问的是为啥不对多处引用的资源进行合并?我这100个窗口设置的图标,给我存100份500K的图标,是人都受不了啊
其他方案:
估计一张图标分别进入了:Resources——资源文件;Form.Desinger.resx——窗体资源文件;还有一个不知道。————————————————————删除Form.Desinger.resx中的一串乱码,在Load中,手动指定Icon=Resources.MyIcon;
其他方案:
所谓的资源都是编译成exe时生成的数据,我疑问的是为啥不对多处引用的资源进行合并?我这100个窗口设置的图标,给我存100份500K的图标,是人都受不了啊

那你100个窗口图标都手动设置过去?编译器优化代码,还有帮你优化引用的资源?如果你引用的资源太大,要不要帮你压缩一下?
其他方案:
还有如果你在一个界面上要弄100个不同的Button难道也手动放过去?我不相信会有人傻傻的把100个窗口的属性一个个配置过去
其他方案:
引用32楼wow818wow的回复:

还有如果你在一个界面上要弄100个不同的Button难道也手动放过去?我不相信会有人傻傻的把100个窗口的属性一个个配置过去

我界面上有约50多个button,上面的文字就是一个个手敲的100个窗口的大型软件应该也有吧,对于图标,就应该用引用资源更好
其他方案:
引用31楼wow818wow的回复:

所谓的资源都是编译成exe时生成的数据,我疑问的是为啥不对多处引用的资源进行合并?我这100个窗口设置的图标,给我存100份500K的图标,是人都受不了啊

那你100个窗口图标都手动设置过去?编译器优化代码,还有帮你优化引用的资源?如果你引用的资源太大,要不要帮你压缩一下?

为什么不能优化引用资源?只是因为现在没做,你才这样说,做了不是更合理吗?按你这么说,为啥http传输要压缩?按你的都别做了,全给开发者自己来做好了
其他方案:
引用30楼sxl514286339的回复:

估计一张图标分别进入了:Resources——资源文件;Form.Desinger.resx——窗体资源文件;还有一个不知道。————————————————————删除Form.Desinger.resx中的一串乱码,在Load中,手动指定Icon=Resources.MyIcon;

求这句话怎么写?this.Icon=xxxx这个不会写,我来说下,其实3个重复的图标是存在这样的:1.exe的图标,不知道是放哪,理论上放资源更合理,但我不确定2.资源里放了一个,这个好理解3.窗口资源里还有一个所以,你这个是解决I窗口图标指向资源图标,但程序图标貌似还是会多一份?
其他方案:
引用34楼sunbinjin的回复:

Quote: 引用31楼wow818wow的回复:
所谓的资源都是编译成exe时生成的数据,我疑问的是为啥不对多处引用的资源进行合并?我这100个窗口设置的图标,给我存100份500K的图标,是人都受不了啊

那你100个窗口图标都手动设置过去?编译器优化代码,还有帮你优化引用的资源?如果你引用的资源太大,要不要帮你压缩一下?

为什么不能优化引用资源?只是因为现在没做,你才这样说,做了不是更合理吗?按你这么说,为啥http传输要压缩?按你的都别做了,全给开发者自己来做好了

哥们,优化不是没有代价的,要想编译器帮你优化,那你在调试的时候就要等它完成这个工作。时间这么宝贵,也许一两个资源优化很快,但是数量大了之后能?我没有说编译器不能做这些,但是现在这个技术条件下,将这个事情交给编程人员自己决定更好。你要想实现你的优化,其实你可以去派生窗口,然后自己添加这部分逻辑。甚至像我说的压缩和解压资源都可以实现。也许在将来,编译器真能像你说的那样完成,但是至少现在不现实。
其他方案:
都用了C#,还纠结内存,大不大干嘛,那么纠结就C++好了,只要没有泄漏就可以了。
其他方案:
notifyIcon1.Icon=System.Drawing.Icon.ExtractAssociatedIcon(Application.StartupPath+"\Resource\Images\favicon.ico");

LZ的问题我也遇到到了一个exe本身30K图标30K那么如果把ico扔到notifyIcon1.Icon居然exe变成了1MB以上.因为Form1.resx变大了所以exe也大了...来回复制粘贴到服务器太忙了..所以我用了上面的一句话....就好了把原来的资源文件删了..
其他方案:
引用38楼diaodiaop的回复:

notifyIcon1.Icon=System.Drawing.Icon.ExtractAssociatedIcon(Application.StartupPath+"\Resource\Images\favicon.ico");

LZ的问题我也遇到到了一个exe本身30K图标30K那么如果把ico扔到notifyIcon1.Icon居然exe变成了1MB以上.因为Form1.resx变大了所以exe也大了...来回复制粘贴到服务器太忙了..所以我用了上面的一句话....就好了把原来的资源文件删了..

终极代码,一句话搞定(11楼的改进版),大家以后都可以这么用:publicMain(){Icon=Icon.ExtractAssociatedIcon(Application.ExecutablePath);}

时间: 2024-08-01 05:42:47

C#中的图标让我好无语!!!!!的相关文章

网页设计中使用图标支持内容的最佳做法

在做视觉设计时,如何高效地使用图标是一门学问:该使用什么样的图标?图标该放在哪里?大小如何?图标的使用是否帮助用户更好更快的理解内容,亦或是增加了他们的理解负担甚至产生误导?今天恰好看到了一篇很好的文章,可以帮助我们了解该如何使用图标来支持内容,故翻译如下: 为什么使用图标?设计就是传达信息:如果你的网站不能吸引用户,这个问题不在于你分享的信息有多重要.有多刺激.在访问一个网站的最初,大多数用户首先扫描页面来寻找视觉上看着有趣的内容,只有某些事物引起了他们的注意力,他们才真正开始阅读.图标是一个

Win7中快捷方式图标丢失问题的解决方法

有时在我们安装程序后或使用一些优化清理软件后,win7会突然出现软件快捷图标丢失问题,但是,如果你双击此丢失快捷图标仍然可以启动程序,虽然不影响我们的正常操作,但是却大跌我们的眼球,让人感觉很是不爽.- 有人也许会尝试在快捷方式属性里更改图标,但结果也是无济于事,但个别图标在我们重装了程序后能够解决修正过来,但是有些重装后也没用.出现这个问题最多的软件是360安全卫士.QQ等等~~!好吧!下面是小编整理的几种解决方法,需要的同学就试试吧~!Windows7系统中快捷图标丢失问题解决办法: 解决方

win7系统中桌面图标不能拖动怎么办?

  win7系统中桌面图标不能拖动怎么办? 1.右击桌面空白处,选择查看,取消自动排列图标. 2.如果有和桌面图标有关的软件,尽量去除掉. 3.注销或者重启电脑即可.

win7系统中我的电脑图标没了怎么办

  win7系统中我的电脑图标没了怎么办          首先右键点击桌面空白处,打开个性化窗口. 接着在个性化窗口中点击更改桌面图标. 勾选计算机,点击确定,接着我的电脑图标就回来了.

让网页设计中的图标更具吸引力的几大要素

图标在网页设计中的作用 图标在网页设计中用途广泛,几乎每个网站中都存在着图标.通过这些小小的图标,可以方便的实现视觉引导和功能划分.如果选用恰当,图标能和页面 中的 图片有机融合,保持视觉上的一致性,同时也能够和整个网站的风格相契合.图标并不是华而不实的小玩意儿,小图标有大用处.在网页设计中,如果设计师并不擅 长图标设计,那么就需要在图标选择上下功夫了. 一般来说,根据使用手法.使用场合的不同,一张图像可以有多种解读,图标亦如此.图标不但能够吸引用户的注意力,还能分割页面中的区域,最为重要的事,

win7系统中音量图标找不到了该怎么办

对于win7系统相信很多人都是再熟悉不过的了,目前还仍然有很多用户都在使用w7系统.在操作的过程中,可能会遇到各种各样的问题,不少用户反应的问题是在上网的时候发现系统里面的音量图标找不到了,这时候不知道该怎么办.下面就来看看win7系统中音量图标找不到的解决方法吧. 1.桌面空白地方用鼠标右键点击,选择里面的属性,然后直接打开"任务栏和[开始]菜单属性"窗口. 2.打开窗口之后,在里面找到"自定义"按键,通常在通知区域的周围,然后单击. 3.打开通知区域图标窗口之后

Win7电脑菜单中的图标拖不到桌面怎么办

  第一种方法: 1.首先,返回到win7电脑的桌面位置,之后,在桌面找到一个空白处,点击鼠标右键,在下滑菜单中选择个性化,之后,在打开的个性化窗口中,点击选择左上角的更改桌面图标,然后选择要显示的图标.如果大家在右键菜单中没有发现个性化选项的话,可以尝试去控制面板中寻找. 第二种方法: 2.单击打开win7电脑的开始菜单,然后在搜索窗口中输入"ICO"可调用"显示或隐藏桌面上的通用图标"在此界面根据需要选择需要桌面显示的图标即可. 以上就是小编带来的Win7电脑菜

请问在谷歌地图中google图标标签怎么显示?

问题描述 请问在谷歌地图中google图标标签怎么显示? google map默认的标示Marker,只能使用图片不能使用文字,label属性也只能显示首字符,怎么将一行文字显示在图标下边呢?请指教 解决方案 看一下官方文档上面应该有详细的介绍

MFC对话框中的图标怎么编辑?可不可以使用下载的BMP的图标?

问题描述 MFC对话框中的图标怎么编辑?可不可以使用下载的BMP的图标? 谢谢,如题,MFC对话框中的图标怎么编辑?可不可以使用下载的BMP的图标? 解决方案 推荐你使用Axialis IconWorkshop,它功能比VC++自带的强很多. 解决方案二: 不可以,需要先转换成ico,有网站提供在线转换,也可以用一些软件转换