问题描述
我自己写个桌面上的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);}