在上一篇文章中,我们了解了如何绘制主题化的和原始未主题化的单选按钮,我曾提到,绘制菜单符号会更加复杂一些。复杂之处在于,这些符号是通过单色位图实现的,而不是漂亮的全彩色位图。
首先,我们将通过一种错误的做法来看看实际的效果,然后我们将展示如何修复它。
请看下面的代码:
>> 请移步至 topomel.com 以查看图片 <<
在上面的代码中,我们使用了 DrawFrameControl 这个 API 函数,往菜单项上绘制一个勾选符号。如果你正在运行的是 Windows XP 默认主题,你可能不会发现有什么问题,但是如果将主题切换至 Windows 经典,则你会发现,在经典主题下,菜单的背景色虽然是灰色,但是我们绘制的勾选符号是以黑白色来绘制的。
产生这种现象的原因已经明明白白地写在了 DrawFrameControl 的文档描述中,请看下文:
如果 uType 被设定为 DFC_MENU 或 DFC_BUTTON,且 uState 不为 DFCS_BUTTONPUSH,则框架控件将使用一个黑白色掩码(也就是说,一个白色背景下的黑色框架控件)。
我们从 DrawFrameControl 所能得到的全部,只是一个黑白色掩码。使用其他颜色来绘制它则是开发者的责任。具体如何做呢?
首先,我们绘制这个掩码到一个单色位图,然后使用 BitBlt 这个函数来为它涂上其他颜色。还记得吗?当将一张单色位图传送至一张彩色位图时,源位图中的黑色将会成为目标DC的文本颜色,且源位图中的白色将会变成目标DC的背景色。
>> 请移步至 topomel.com 以查看图片 <<
上面代码中,有三个关键点:
1) 往一个单色位图中绘制,从而得到一个掩码。
2) 设置目标DC的文字颜色和背景色。
3) 使用 BitBlt 来实现颜色映射。
修改代码之后,我们可以观察到,绘制的勾选符号已经可以正确地反映系统菜单颜色了,因为我们将它们设置为单色到彩色传输的文本颜色和背景色了。
经过今天文章的讲解,我想你应该可以帮助这样一批人,他们绞尽脑汁想在菜单上绘制一个透明的勾选符号。我大概可以想到实现它的两种不同方案。
总结
希望各位对单色位图有进一步的理解。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Rendering menu glyphs is slightly trickier》