首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

绘制菜单符号的技法

在上一篇文章中,我们了解了如何绘制主题化的和原始未主题化的单选按钮,我曾提到,绘制菜单符号会更加复杂一些。复杂之处在于,这些符号是通过单色位图实现的,而不是漂亮的全彩色位图。

首先,我们将通过一种错误的做法来看看实际的效果,然后我们将展示如何修复它。

请看下面的代码:

在上面的代码中,我们使用了 DrawFrameControl 这个 API 函数,往菜单项上绘制一个勾选符号。如果你正在运行的是 Windows XP 默认主题,你可能不会发现有什么问题,但是如果将主题切换至 Windows 经典,则你会发现,在经典主题下,菜单的背景色虽然是灰色,但是我们绘制的勾选符号是以黑白色来绘制的。

产生这种现象的原因已经明明白白地写在了 DrawFrameControl 的文档描述中,请看下文:

如果 uType 被设定为 DFC_MENU 或 DFC_BUTTON,且 uState 不为 DFCS_BUTTONPUSH,则框架控件将使用一个黑白色掩码(也就是说,一个白色背景下的黑色框架控件)。

我们从 DrawFrameControl 所能得到的全部,只是一个黑白色掩码。使用其他颜色来绘制它则是开发者的责任。具体如何做呢?

首先,我们绘制这个掩码到一个单色位图,然后使用 BitBlt 这个函数来为它涂上其他颜色。还记得吗?当将一张单色位图传送至一张彩色位图时,源位图中的黑色将会成为目标DC的文本颜色,且源位图中的白色将会变成目标DC的背景色。

上面代码中,有三个关键点:

1) 往一个单色位图中绘制,从而得到一个掩码。

2) 设置目标DC的文字颜色和背景色。

3) 使用 BitBlt 来实现颜色映射。

修改代码之后,我们可以观察到,绘制的勾选符号已经可以正确地反映系统菜单颜色了,因为我们将它们设置为单色到彩色传输的文本颜色和背景色了。

经过今天文章的讲解,我想你应该可以帮助这样一群人,他们绞尽脑汁想在菜单上绘制一个透明的勾选符号。我大概可以想到实现它的两种不同方案。

总结

希望各位对单色位图有进一步的理解。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。

本文来自:《Rendering menu glyphs is slightly trickier》

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20221226A044IF00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券