聊聊绘制菜单符号的技法,你学会了吗?

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

我们了解了如何绘制主题化的和原始未主题化的单选按钮,我曾提到,绘制菜单符号会更加复杂一些。复杂之处在于,这些符号是通过单色位图实现的,而不是漂亮的全彩色位图。首先,我们将通过一种错误的做法来看看实际的效果,然后我们将展示如何修复它。请看下面的代码:

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

产生这种现象的原因已经明明白白地写在了 DrawFrameControl 的文档描述中,请看下文:如果 uType 被设定为 DFC_MENU 或 DFC_BUTTON,且 uState 不为 DFCS_BUTTONPUSH,则框架控件将使用一个黑白色掩码(也就是说,一个白色背景下的黑色框架控件)。

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

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

上面代码中,有三个关键点:1) 往一个单色位图中绘制,从而得到一个掩码。2) 设置目标DC的文字颜色和背景色。3) 使用 BitBlt 来实现颜色映射。

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

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

总结

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

责任编辑:武晓燕 来源: 今日头条
相关推荐

2024-03-05 10:09:16

restfulHTTPAPI

2022-12-26 07:48:04

敏捷项目

2024-06-12 08:36:25

2024-08-19 10:24:14

2023-07-10 08:36:21

工具pptword

2023-01-29 08:08:34

并发库conc通用库

2022-12-08 10:49:43

2022-09-26 08:49:11

Java架构CPU

2022-07-11 09:00:37

依赖配置文件Mybati

2022-04-13 09:01:45

SASSCSS处理器

2024-03-04 07:41:18

SpringAOPOOP​

2022-03-05 23:29:18

LibuvwatchdogNode.js

2023-06-05 08:36:04

SQL函数RANK()

2022-12-14 08:31:43

#error编译命令

2023-03-07 07:50:15

Transactio事务代码

2024-11-08 08:56:01

2023-12-05 17:57:13

nginx参数

2022-10-11 08:48:08

HTTP状态码浏览器

2023-04-04 08:14:45

2024-10-17 10:00:59

点赞
收藏

51CTO技术栈公众号