绘制菜单符号的技法

news2024/12/23 11:19:16

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

>> 请移步至 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》

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/115819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux内核调度子系统随笔(一)

调度子系统组件(1) 调度类用于判断接下来运行哪个进程&#xff0c;内核支持不同的调度策略(完全公平调度,实时调度)&#xff1b;调度类使得能够以模块化方法实现这些策略; (2) 在选中将要选择的进程后&#xff0c;必须执行底层任务切换&#xff1b;需要与cpu的紧密交互&#x…

信息安全管理体系

环境迁移 Platfor m Ops for AI 作为整合了 DataOps、MLOps、ModelOps 的复杂技术平台&#xff0c;在项目开发时仅使用一套系统无法支撑平台的稳定搭建&#xff0c;往往需要开发系统、集成测试系统、正式 环境系统在项目生命周期 中协作配合。将表、索引、并发程序、配置内容等…

HTML5 新增属性

文章目录HTML5 新增属性公共属性hidden属性draggable属性contenteditable属性data-*属性input元素新增属性autocomplete属性autofocus属性placeholder属性required属性pattern属性form元素新增属性novalidate属性HTML5 新增属性 公共属性 HTML5新增的常见公共属性有4个&#…

在今年的数字生态大会上,云原生数据库前进了一大步

云计算时代&#xff0c;数据库上云已成为产业数字化转型的重要动力。近期&#xff0c;在2022腾讯全球数字生态大会云原生数据库技术探索专场上&#xff0c;腾讯云分享了在云原生数据库领域的技术演进与探索&#xff0c;并就其在不同行业场景中的最佳实践进行了详细讲解&#xf…

【C++初阶】stack、queue和priority_queue的模拟实现

文章目录简介stackqueuepriority_queuestack的模拟实现成员变量emptysizetoppushpopqueue的模拟实现成员变量emptysizetoppushpoppriority_queue的模拟实现成员变量emptysizetoppushpop仿函数完整版代码stack.hqueue.hpriority_queue.htest.cpp简介 stack、queue和priority_qu…

四、SpringBoot Starter组件详解

starter组件实际上就是能够实现自动装配的jar包。 1.starter组件创建流程 假设我现在要集成redis,要拿到redisTemplate对象,怎么做呢? 1.引springboot包; 2.创建RedisTemplate类; 3.写配置类; 4.创建spring.factories文件; 5.打成jar包。 示例如下: 1.创建maven项目…

我的世界MOD制作(2)|| 你的第一个MOD

正文&#xff1a;I. 开发环境配置 我们需要一个带mixin的forge开发环境&#xff0c;这一步相当折磨人&#xff0c;网络不好的话半天时间都得砸这上面&#xff0c;但是不要灰心&#xff0c;过了这个坎接下来基本是顺风顺水。 1. 下载资源 & 修改build.gradle 首先去forge官网…

从三万英尺看全链路灰度

作者&#xff1a;卜比 全链路灰度是微服务领域&#xff0c;很实用的企业级场景下的技术能力。 从本期开始&#xff0c;我们将通过《全链路灰度&#xff1a;自顶向下的方法》的系列文章&#xff0c;由远及近的剖析全链路灰度全貌&#xff0c;系列文章分为 4 篇&#xff1a; 《…

无需数据库的笔记flatnotes

本文完成于 10 月底&#xff1b; 什么是 flatnotes&#xff1f; flatnotes 是一个自托管的、无数据库的笔记 Web 应用程序&#xff0c;它利用文件夹存储 Markdown 文件。 官方演示站点&#xff1a;https://demo.flatnotes.io/ 前言 本文介绍的软件很简单&#xff0c;但是有两…

保姆级教学——Python+Pygame怎么实现吃豆豆游戏

耽搁十几天的时间&#xff0c;我顺利的从阳转阴啦&#xff0c; 以后的日子一切恢复正常&#xff0c;好好工作&#xff0c;积极分享。希望在座的小伙伴阳了的全部健康转阴&#xff0c;没阳的全部不会变阳&#xff0c;新的一年&#xff0c;一切顺顺利利。 不知道最近大家学习得怎…

前端大屏常用的几种适配方案

方 案实现方式优点缺点vm vh1.按照设计稿的尺寸&#xff0c;将px按比例计算转为vw和vh1.可以动态计算图表的宽高&#xff0c;字体等&#xff0c;灵活性较高 2.当屏幕比例跟 ui 稿不一致时&#xff0c;不会出现两边留白情况1.每个图表都需要单独做字体、间距、位移的适配&#x…

磨金石教育摄影技能干货分享|看看大师们如何把“树”拍成艺术品

树&#xff0c;可以说是我们生活中最为常见的物种了。 在不同的地域&#xff0c;不同的气候环境下&#xff0c;生长着不同的树种。 北方的白桦树、杨树、梅花&#xff1b;南方的凤凰花、榕树、梧桐等等。 无论哪个地方的树&#xff0c;都有别样的姿态。 1、相机作画 白雪没有覆…

python实验实践【2】深度学习的python包

python包的管理是使用python进行实验过程中最为重要的一环&#xff0c;很多时候运行他人代码失败的原因是没能按照对方的要求配置python包库。本篇博客重点介绍深度学习场景中python包的管理。 目录python包版本选择python包安装python包版本选择 使用pytorch进行深度学习训练…

AndroidRN的混合集成 下载不了RN的依赖可以看看 好使

一、混合开发 App 混合开发&#xff0c;指的是一个 App 部分功能用 Native 构建&#xff0c;其他功能使用跨端框架进行构建&#xff0c;最常见的场景是&#xff0c;Native 作为一个可工程&#xff0c;其实业务开发使用垮端框架进行开发。目前&#xff0c;比较流行的跨端框架有…

ORB-SLAM3算法学习—双目和单目初始化

0总述 ORB-SLAM3算法中视觉的初始化依旧放在tracking线程中&#xff0c;因此在tracking中没有为imu模式设置单独的初始化函数&#xff0c;而IMU的初始化是在localMapping中实现的。 很有用的参考链接&#xff1a;https://cloud.tencent.com/developer/article/1761043 1双目…

Python 基础教程(1)

1.翻转字符串 def reverseWords(input):# 通过空格将字符串分隔符&#xff0c;把各个单词分隔为列表inputWords input.split(" ")# 翻转字符串# 假设列表 list [1,2,3,4], # list[0]1, list[1]2 &#xff0c;而 -1 表示最后一个元素 list[-1]4 ( 与 list[3]4 一样…

C++ 使用CLion + LibTorch 调用Python训练的PyTorch模型-MNIST

C++ 使用CLion + LibTorch 调用Python训练的PyTorch模型-MNIST 安装LibTorch 进入pytorch官网地址,选则LibTorch版本将LibTorch安装包解压到libtorch-path目录中,libtorch-path是自定义的LibTorch安装目录。

【SpringCloud Alibaba】Sentinel持久化结合Nacos

在前面学习完Sentinel的流控规则以及Nacos时&#xff0c;就是最后的Sentinel持久化了。需要持久化的原因是因为每次启动Sentinel都会使之前配置的规则就清空了&#xff0c;这样每次都要再去设定规则显得非常的麻烦。 思路就是&#xff1a;将流控规则配置进Nacos服务注册中心中&…

【实时数仓】DWS层之关键词主题表(FlinkSQL)、数据可视化接口、Sugar数据大屏、总成交金额接口实现

文章目录一 DWS层-关键词主题表(FlinkSQL)1 过滤数据2 利用UDTF进行拆分&#xff08;1&#xff09;拆分结果&#xff08;2&#xff09;Join 表函数 (UDTF)&#xff08;3&#xff09;代码3 分组、开窗、聚合计算4 转换为流并写入ClickHouse&#xff08;1&#xff09;在ClickHous…

大数据网站攻击实时项目架构

随着互联网的流行&#xff0c;网站安全问题就日益突出&#xff0c;但绝大多数的网站开发与建设公司只考虑正常用户的稳定使用&#xff0c;而对于网站安全方面了解甚少&#xff0c;发现网站安全存在问题和漏洞&#xff0c;其修补方式只能停留在页面代码的删除或者是恢复网站备份…