系统托盘图标色深的问题

lqbn 2005-06-28 02:40:39
我们知道在Win2k下系统托盘区只能显示16色的图标(当然打了第三方补丁的除外),而在WinXP和Win2k3下则没有这个限制。如果图标只包含一个256色的图像,那么系统就会按照一定的算法自动把这个图像转换成16色,然后再进行显示。有些图标经过这样的转换之后,就变得非常难看了。于是有些程序,比如说MSN Messenger,就专门作了16色的图标,用来在系统托盘无法显示256色图标的时候显示。这样就有一个问题,如何才能判断系统托盘最多可以显示多少位色的图标呢?

我自己写了一个测试程序,其中一个图标包含有两个图像,一个为16x16 256色的,一个为16x16 16色的。可问题是不管用何种方式(LoadImage和LoadIcon)加载,在Win2k下,系统好像加载的仍然是256色的图标。看了MSDN中的一篇文档,http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/icons/abouticons.asp,其中有这样一句话:

Note The system treats all color depths of 8 or more bpp as equal. Therefore, there is no advantage of including a 16x16 256-color image and a 16x16 16-color image in the same resource — the system will simply choose the first one it encounters. When the display is in 8-bpp mode, the system will choose a 16-color icon over a 256-color icon, and will display all icons using the system default palette.

就是说,如果让系统自己处理的话,它是不会区分16色和256色的图像的。但我如何才能达到MSN Messenger那样的效果呢?最好不要判断系统版本,然后再手动加载。因为最开头也说过了,在Win2k下,可以通过打第三方补丁的方法支持在系统托盘显示256色的图标。我试过了,打了这个补丁之后,MSN Messenger就会自动在系统托盘显示256色的图标了,也就是说,它不是通过判断系统版本来进行加载的。
...全文
114 点赞 收藏 11
写回复
11 条回复
lqbn 2005年07月01日
自己顶一下,希望哪位大虾能够指点一下……
回复 点赞
lqbn 2005年06月29日
嗯,跟操作系统和当前分辨率应该是没有关系的。

对操作系统而言,同样是Win2k的操作系统,应用了那个第三方补丁之后(见http://www.dr-hoiby.com/TrayIconIn256Color/index.html),还是可以正常显示256色图标的。

对分辨率来说,好像跟显示颜色的色深没有什么直接关系吧。

颜色质量我就不知道是什么概念了,有没有什么可以量化的API函数?
回复 点赞
CodeKey 2005年06月29日
操作系统 && 当前分辨率 && 颜色质量 可以不??
回复 点赞
lqbn 2005年06月29日
现在的关键问题是,我如何才能够判断系统托盘的“显示能力”呢?
回复 点赞
lqbn 2005年06月29日
唉,我都准备放弃了。搞了两天,没有任何实质性的进展。

其实如果没有那个第三方的补丁,完全可以先判断系统的版本,然后加载相应的图标就可以了。可现在就是有点不甘心,MSN Messenger明明做到了,可我就是不知道它是如何做到的……
回复 点赞
lqbn 2005年06月29日
可现在的问题不是如何加载ICON,而是如何判断系统托盘最多可以显示多少位色图标。
回复 点赞
xing_xing_xing 2005年06月29日
hIcon
Handle to the icon to be added, modified, or deleted. To avoid icon distortion, be aware that notification area icons have different levels of support under different versions of Microsoft Windows. Windows 95, Windows 98, and Microsoft Windows NT 4.0 support icons of up to 4 bits per pixel (BPP). Windows Millennium Edition (Windows Me) and Windows 2000 support icons of a color depth up to the current display mode. Windows XP supports icons of up to 32 BPP.

来自MSDN
回复 点赞
lqbn 2005年06月29日
唉,这个方法不行……

获取桌面的“颜色质量”可以用下面的方法:
HWND hWndDTop = ::GetDesktopWindow();
HDC hDCDTop = ::GetDC(hWndDTop);
int nBitsPerPixel = ::GetDeviceCaps(hDCDTop, BITSPIXEL);

然后我照葫芦画瓢,找到System Tray的窗口(类似于AnimateToTray的步骤,很多文章有介绍),结果发现得到的值跟用上面的方法得到的桌面的“颜色质量”的值是一样的。然后在显示属性中进行修改,这两个值也一起发生变化。很明显,如果这种方法有作用的话,在Win2k下获取的系统托盘的色深值应该永远是4才对。
回复 点赞
lqbn 2005年06月29日
不过我还是要提醒一下,系统托盘区的“颜色质量”跟桌面的“颜色质量”好像没有直接的关系。Win2k在系统托盘区只能显示16色的图标,而不管显示属性中是如何设置的。

当然,如果有方法获取桌面这个“窗口”的“颜色质量”设定值,说不定就有办法获取系统托盘区“颜色质量”的设定值。
回复 点赞
CodeKey 2005年06月29日
呵呵,颜色质量 是在 显示属性-》设置-》里面是这样写的.

刚刚我把它调成800×600 256色 时,很明显 所有图标都很难看了,说明跟 颜色质量有点关系,但是在没有补丁的2000和xp下都用1024×768 32位 显示时,xp下的托盘图标能显示效果比2000下好的多

至于定量,我也在期待中...
回复 点赞
CodeKey 2005年06月28日
imagelist ?
回复 点赞
发动态
发帖子
界面
创建于2007-09-28

7973

社区成员

11.5w+

社区内容

VC/MFC 界面
社区公告
暂无公告