系统托盘图标色深的问题

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色的图标了,也就是说,它不是通过判断系统版本来进行加载的。
...全文
181 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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 ?
使老板键能让你在上班时间玩游戏,看电影,淘宝购物,当老板突然出现时,不必手忙脚乱,你只要按预先设置好的热键,就能快速将游戏界面,淘宝网页瞬间隐藏,再也不用担心老板的处罚了。 天使老板键无任何插件,纯净绿,仅1个文件,无需任何驱动或者文件注入操作就能完美隐藏全部微软的32位和64位系统的任何窗口和托盘图标。 天使老板键功能说明: 1.永不收费的天使老板键!无任何弹窗广告!无任何功能限制!无任何锁主页! 2.能隐藏QQ、QQ游戏、浏览器等窗口界面,能隐藏32位和64位系统的任何软件的托盘图标,隐藏的时候能执行静音操作。 3.鼠标控制,自定义热键和加强的热键,能够解决热键冲突问题。 4.支持虚拟机中运行,支持修改为任何名称运行。 5.鼠标和键盘无操作,天使老板键可以自动隐藏。 6.可以按QQ号隐藏QQ,支持微信隐藏,支持多窗口隐藏设置。 7.虚拟桌面功能,大型游戏窗口也能快速隐藏。 8.软件支持任何微软操作系统,支持任何系统的开机启动: winXP win7 win8 win10系统.... 键盘热键说明 :隐藏软件热键,隐藏自身热键,虚拟桌面热键,全部的隐藏和显示都是同一个热键,按下就会隐藏,再次按下就会显示。 如果杀毒软件误报,请在安全软件中添加天使老板键为可信任程序
如何设置让一个窗口总在最前(Exaware OnTop和PushPin)软件下载 Windows中打开一个新窗口或切换任务时,原有的活动窗口就会被它所覆盖。不过,像Winamp等软件,却有一个能让自己的操作窗口总在最前的功能,非常实用。其实,只要你安装了像ExaWare OnTop和PushPin这样的免费小软件,也一样可以让任意Windows操作窗口总在最前面,不让其他的窗口挡住它! 1.好用的ExaWare OnTop 下载并安装该软件后,双击桌面上的ExaWare OnTop 图标启动程序,我们看不到它的任何窗口界面,但在系统托盘上可以发现它的图标。单击该图标会弹出一个菜单,在这里列出了当前系统中所有窗口的标题。要想让某个窗口总在最前面,只要将鼠标移到相应的窗口标题项并点击鼠标(左右键均可)即可,如图所示。单击后该窗口标题前面的图标也相应地多了一个方框(如果没有图标则会显示一个对勾),表明该窗口已经设置成功。这时打开该窗口,再打开其他程序窗口,看看它是否一直总在其他窗口的前面而不被遮住?怎么样,是不是有种高高在上的感觉?要想取消 OnTop 状态,只要重复一遍上面的操作就可以了。 看到这里你是不是有一个疑问:如果同时将两个窗口设置为总在最前(Always OnTop)的状态,那将会发生什么事情呢?其实也很简单,如果两个(或多个)窗口同时处于总在最前的状态,那说明它们的地位平等,这时先激活谁谁就在最上面(和设置前一样看待)。另外还有一个问题需要注意:如果需要退出该软件,建议点击系统托盘上的软件图标并选择菜单中的“Exit and Restore”命令,这样在退出软件的同时可以恢复各个窗口的原始状态,以免给使用带来不便。 2.小巧的PushPin 相对于ExaWare OnTop 来说,PushPin 的体积更为小巧,只有区区的22KB 下载得到的是一个压缩包,由于它是一款绿软件,我们只要直接将该压缩包解压缩到某个指定的目录下即可运行(主程序文件名为Pushpin.exe),同样看不到主程序窗口,只会发现系统托盘处多了一个图标。要想让某个操作窗口总在最前面,只要在其标题栏上(在任务栏按钮上也可)单击鼠标右键并从弹出的菜单中选择“Always on top”命令即可。要退出程序只需用鼠标右击系统托盘上的软件图标,并从弹出的菜单中选择“Remove”命令即可

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧