本帖最后由 sunbinjin 于 2014-11-15 19:56:53 编辑

解决方案 »

  1.   

    对了,我的开发工具是vs2013 update3
      

  2.   

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

  3.   

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

  4.   


    变成1.7MB这问题,重启vs肯定没用啦,当然我也确实重启了
      

  5.   

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

  6.   


    请问如何设置?
    首先,既然资源不与程序图标合二为一,正确体积上来说,我不应该增加资源了,2倍大小明显是错误的
    在这种情况下,我应该怎么设置窗口的图标?程序图标如何传进去?你说的不视作一个图标是啥意思?
    同一个图标文件,被多次引用,竟然在exe里增加多倍体积,这还真是说不过去啊,我要是有100个窗口引用这个图标的话,这事可以判定为严重失误不?
      

  7.   

    针对你的第3点,不重启就会累加,重启vs就能解决,这是我们实际遇到过的问题。重启之后对工程项目“清理”,或者再把 bin 目录下的内容删光。
      

  8.   

    只有你描述的3,在我看来可能是个真的问题,需要解决。对于2,你可以打开每一个窗体的 .resx 文件,然后选择最左边的菜单下拉选择“图标”,可以看到图标资源。因此如果你不想设置图标,那么删除它就是了。你可以把图标放到项目的资源中(而不是窗体的),然后在程序启动时给窗体设置图标。
      

  9.   

    另外你的图标“32,64,96,128,256等分辨率,约500KB”,这实在没有必要。仅仅保留64尺寸的一个就够了!这样,它可能只有20k左右,而不是500k。
      

  10.   

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

  11.   


    是啊,我希望窗口和程序共用一份图标,正如楼上说的,c#让人无语的地主是form的icon不能在设计器里选公共资源
      

  12.   

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

  13.   


    第1个程序图标貌似没有办法使用资源,vs并没有地方设置从资源使用exe图标啊
      

  14.   


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

  15.   

    设置一下进程图标。然后 http://blog.csdn.net/jia_xiaoxin/article/details/2992892 这里面有获取进程图标的。
    再动态设置一下窗口的图标。
      

  16.   


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

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

  17.   

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

  18.   

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

  19.   

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

  20.   

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

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

  21.   


    这明显是不可能的,ide做出来,就是方便人的,这种明显的缺陷,应该修改掉就好了
    问题是.net出来10多年了,这种设计上的问题都还有,就不解了
      

  22.   


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

  23.   


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

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

  24.   


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

  25.   

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

  26.   

    所谓的资源都是编译成exe时生成的数据,我疑问的是为啥不对多处引用的资源进行合并?
    我这100个窗口设置的图标,给我存100份500K的图标,是人都受不了啊
    那你100个窗口图标都手动设置过去?编译器优化代码,还有帮你优化引用的资源?如果你引用的资源太大,要不要帮你压缩一下?
      

  27.   

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

  28.   


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

  29.   

    那你100个窗口图标都手动设置过去?编译器优化代码,还有帮你优化引用的资源?如果你引用的资源太大,要不要帮你压缩一下?为什么不能优化引用资源?只是因为现在没做,你才这样说,做了不是更合理吗?
    按你这么说,为啥http传输要压缩?按你的都别做了,全给开发者自己来做好了
      

  30.   


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

  31.   

    那你100个窗口图标都手动设置过去?编译器优化代码,还有帮你优化引用的资源?如果你引用的资源太大,要不要帮你压缩一下?为什么不能优化引用资源?只是因为现在没做,你才这样说,做了不是更合理吗?
    按你这么说,为啥http传输要压缩?按你的都别做了,全给开发者自己来做好了
    哥们,优化不是没有代价的,要想编译器帮你优化,那你在调试的时候就要等它完成这个工作。时间这么宝贵,也许一两个资源优化很快,但是数量大了之后能?我没有说编译器不能做这些,但是现在这个技术条件下,将这个事情交给编程人员自己决定更好。你要想实现你的优化,其实你可以去派生窗口,然后自己添加这部分逻辑。甚至像我说的压缩和解压资源都可以实现。
    也许在将来,编译器真能像你说的那样完成,但是至少现在不现实。
      

  32.   


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

  33.   


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