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

news/2024/8/25 15:08:17
  有一天,我的程序在任务栏的应用程序中看起来是这样的

  
很奇怪,我的图标明明不是这样的,在资源管理器的文件夹里面,我的图标能够正常显示,在桌面的任务栏里,也能正常的显示,唯独在任务管理器里显示不正常。虽然不是什么大问题,但是如果是一个产品发布出去,会让人觉得很不专业,会产生一定的负面影响。 这个图标有点像是程序没有图标,使用的是系统缺省的图标,或者是程序无法响应的时候显示的图标。 应用程序图标是个很重要的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进行聊天。

转载于:https://www.cnblogs.com/snake-hand/archive/2012/08/22/2650988.html


http://www.niftyadmin.cn/n/3842930.html

相关文章

工具篇-Java中的设计模式积累(二)

------------------------------------------行为型设计模式 1. 模版模式 为什么有模版模式: 定义一个算法的骨架,而将一些步骤的实现延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中某些步骤的具体实现&#xf…

64位2003与ASP.NET 1.1

去客户现场布署系统。 服务器是64位的2003,可系统是.net 1.1的, 新建网站后,网站的ASP.NET版本里面没有1.1的选项。 安装并注册.net 1.1后,网站属性里没有ASP.NET的选项了。 服务器上以前的一个2.0的网站和这个新系统都可以运行。…

fatal: remote origin already exists.

解决方法: 先删除, 再添加 1. git remote rm origin 2. git remote add origin https://github.com/zjulanjian/eshop.git 3. git push -u origin master转载于:https://www.cnblogs.com/zjulanjian/p/11118915.html

C语言实验作业9

实验目的&#xff1a;1、掌握二维数组的使用方法。 2、掌握用二维数组表示杨辉三角的方法。 实验题目&#xff1a;输出杨辉三角。 实验代码&#xff1a; /*杨辉三角*/#include<stdio.h>int main(){ int i,j,n; int a[100][100]; printf("输入n行:"); /*输入杨辉…

python 进程池2 - Pool相关函数

python自2.6开始提供了多进程模块multiprocessing&#xff0c;进程池使用multiprocessing.pool&#xff0c;pool的构造如下&#xff1a; multiprocessing.Pool([processes[, initializer[, initargs[, maxtasksperchild]]]]) processes表示pool中进程的数目&#xff0c;默认地…

python 爬虫之requests爬取页面图片的url,并将图片下载到本地

大家好我叫hardy 需求&#xff1a;爬取某个页面&#xff0c;并把该页面的图片下载到本地 思考&#xff1a; img标签一个有多少种类型的src值&#xff1f;四种&#xff1a;1、以http开头的网络链接。2、以“//”开头网络地址。3、以“/”开头绝对路径。4、以“./”开头相对路径。…

CF232E Quick Tortoise , Fzoj 3118

这一题由于数据较多&#xff0c;我们考虑离线处理。 分治。对于两个点s&#xff0c;t&#xff0c;如果起点在mid这条横线上方&#xff0c;终点在下方&#xff0c;那么它必定会穿过mid这条线。所以只要s可以到mid上一点x&#xff0c;x可以到t&#xff0c;st就是安全的。 用bitse…

杭电2050

此题思路&#xff1a;先求直线最多能把平面分成多少个部分设为m个&#xff01;&#xff08;ma[i-1]i&#xff1b;&#xff09; 再求折线把平面分的个数n&#xff08;na[2*m]-2*m;) *注意&#xff1a;一个折线两条直线&#xff01;&#xff01;&#xff01; #include<iostrea…