Windows图标:有一些你未必知道的东西

  有一天,我的程序在任务栏的应用程序中看起来是这样的

  
很奇怪,我的图标明明不是这样的,在资源管理器的文件夹里面,我的图标能够正常显示,在桌面的任务栏里,也能正常的显示,唯独在任务管理器里显示不正常。虽然不是什么大问题,但是如果是一个产品发布出去,会让人觉得很不专业,会产生一定的负面影响。 这个图标有点像是程序没有图标,使用的是系统缺省的图标,或者是程序无法响应的时候显示的图标。 应用程序图标是个很重要的UI元素,在很多地方会显示。这些位置大概可以分为两类:
  • 静态显示,就是程序没有运行。比如资源管理器的文件夹里、桌面快捷方式、开始菜单等。
  • 动态显示,就是程序运行后。比如:桌面任务栏、任务管理器、程序窗口标题栏等。
静态显示,由于程序没有运行,所以操作系统只能从文件信息中获取应用程序的图标。Windows程序有一个资源区,将资源以二进制的形式存放在文件中,而且exe可执行文件是一个格式化的文件,具有一定的格式,windows当然知道资源的位置,它从资源中找到图标资源,并且显示出来。这个功能可以使用SHGetFileInfo函数来实现。将任何一个其它文件,比如txt文件修改为exe扩展名,windows资源管理器也会尝试去查找图标资源,当然是找不到啦,所以一般都会显示系统缺省的图标,如上图显示的图标。所以很多dos程序,在windows里都显示缺省的图标。 动态显示,程序已经运行,可以接受窗口消息。而且桌面任务栏、任务管理器这两个地方,显示的是顶层窗口。每个窗口可以显示不同的图标和标题,所以这两个地方不可能是读取文件信息来获取图标显示。很显然,标题可以通过GetWindowText跨进程来获取。那么窗口图标呢?窗口图标也可以有很多方式跨进程获取。比如给窗口发送WM_GETICON,通过GetClassLong获取窗口类图标。也就是说,桌面和任务管理器这两个程序,可能是通过这些方式来获取图标进行显示。 也就是说,静态显示,显示的是应用程序图标;动态显示,显示的是窗口的图标。 我的程序在任务管理器里显示不正常,那应该是窗口的图标显示不正常。于是我尝试任务管理器可能采用的获取图标方式,逐一检查我的程序。WM_GETICON消息一般都是缺省处理,应该没问题。GetClassLong是获取窗口类信息,所以我检查我的窗口注册代码,发现没有设置窗口类图标。(由于采用了UI界面库,里面注册了一些缺省的窗口类,都是没有设置图标的,这个UI库,所有的UI都是自绘的,标题栏也不是真正的windows标题栏,是自己绘制的图标和标题,所以窗口显示图标正常)。 将窗口类图标补上后,任务管理器里显示正常。 虽然是个小问题,但是如果思路不正确,哪怕是有多年开发经验的老手,也可能会花费比较久的时间才能解决。尤其是现在大量使用各种库,各种框架,很多新人连注册窗口类都不知道。。。。 其实Windows图标还是很值得花点时间去全面了解一下,有一些关于Windows图标的技术实现还是比较有趣: 1、快捷方式是如何实现的? 2、图标上的数字是如何实现的?有些程序会在桌面应用程序图标上显示一个数字,比如软件管理程序,会以这种方式告诉你有几款软件有更新,用户体验非常好。 3、svn是如何在改变图标的?svn会改变文件夹,文件的图标,就是在原有图标上添加一些信息,比如更改后的、签出的。。 4、QQ推出的新功能,将经常聊天的人的头像弄到桌面上,点击就可以启动QQ进行聊天。
posted @ 2012-08-22 16:00 爱生活,爱编程 阅读(...) 评论(...) 编辑 收藏