翻译《The Old New Thing》- Rendering menu glyphs is slightly trickier

Rendering menu glyphs is slightly trickier - The Old New Thing (microsoft.com)icon-default.png?t=N7T8https://devblogs.microsoft.com/oldnewthing/20050802-13/?p=34743

 

Raymond Chen 2005年08月02日


        上次,我们看到了如何绘制有主题和无主题的单选按钮,我提到菜单位图更加棘手。它们之所以棘手,是因为它们是以原始单色位图提供的,而不是完全形成的颜色协调位图。

        首先,我们做个错误的示范看看会得到什么。然后将尝试修复它。

        从一个干净的新初始程序开始。

class RootWindow : public Window
{…
protected:void PaintContent(PAINTSTRUCT *pps);BOOL WinRegisterClass(WNDCLASS *pwc){pwc->hbrBackground = (HBRUSH)(COLOR_MENU + 1);return __super::WinRegisterClass(pwc);}…
};void RootWindow::PaintContent(PAINTSTRUCT *pps)
{int cxCheck = GetSystemMetrics(SM_CXMENUCHECK);int cyCheck = GetSystemMetrics(SM_CYMENUCHECK);RECT rc = { 0, 0, cxCheck, cyCheck };DrawFrameControl(pps->hdc, &rc, DFC_MENU, DFCS_MENUCHECK);
}

        这段代码天真地使用 DrawFrameControl 函数直接在绘制 DC 中绘制菜单勾选标记。如果你使用默认的 Windows XP 主题,你可能不会注意到任何问题,但切换到 Windows 经典主题,你将看到勾选标记是以黑白方式绘制的,即使经典菜单背景颜色是灰色。

        原因在于 DrawFrameControl 的文档中指出:

如果 uType 是 DFC_MENU 或 DFC_BUTTON 并且 uState 不是 DFCS_BUTTONPUSH,框架控件是黑白掩码(即,在白色背景上的黑色框架控件)。

        我们从 DrawFrameControl 得到的所有东西就是一个单色掩码。将其着色是我们要作的工作。

        为此,我们将掩码绘制到单色位图中,然后使用 BitBlt 函数对其进行着色。

        回想一下,当从单色位图复制到彩色位图时,源位图中的黑色变成目标 DC 的文本颜色,源位图中的白色变成目标 DC 的背景颜色。

void RootWindow::PaintContent(PAINTSTRUCT *pps)
{HDC hdcMem = CreateCompatibleDC(pps->hdc);if (hdcMem) {int cxCheck = GetSystemMetrics(SM_CXMENUCHECK);int cyCheck = GetSystemMetrics(SM_CYMENUCHECK);HBITMAP hbmMono = CreateBitmap(cxCheck, cyCheck, 1, 1, NULL);if (hbmMono) {HBITMAP hbmPrev = SelectBitmap(hdcMem, hbmMono);if (hbmPrev) {RECT rc = { 0, 0, cxCheck, cyCheck };DrawFrameControl(hdcMem, &rc, DFC_MENU, DFCS_MENUCHECK);COLORREF clrTextPrev = SetTextColor(pps->hdc,GetSysColor(COLOR_MENUTEXT));COLORREF clrBkPrev = SetBkColor(pps->hdc,GetSysColor(COLOR_MENU));BitBlt(pps->hdc, 0, 0, cxCheck, cyCheck,hdcMem, 0, 0, SRCCOPY);SetBkColor(pps->hdc, clrBkPrev);SetTextColor(pps->hdc, clrTextPrev);SelectBitmap(hdcMem, hbmPrev);}DeleteObject(hbmMono);}DeleteDC(hdcMem);}
}

这里的关键是:

  1. 在临时单色位图中绘制以生成掩码,
  2. 设置目标 DC 的文本和背景颜色,
  3. 使用 BitBlt 进行颜色映射。

        函数的其余部分只是无聊的流水账。

        观察到勾选标记的颜色现在与系统菜单颜色相匹配,因为我们将它们设置为单色到彩色复制的文本和背景颜色。

        掌握了这些知识,你或许就能帮助那位尝试透明绘制菜单勾选标记的人。我立刻便能想到两种不同的解决方案。

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

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

相关文章

Centos 7.9 配置VNCServer实现远程vnc连接

文章目录 1、Centos安装图形界面1.1、安装X Windows System图形界面1.2、安装GNOME图形界面 2、VNC SERVER配置2.1、VNC SERVER安装2.2、VNC SERVER配置1)创建vnc配置文件2)修改配置文件内容3)完整配置文件参考 2.3、设置vnc密码2.4、配置防火…

PyQt5中重要的概念:信号与槽

PyQt中信号与槽概念定义如下(网络上引用的): 信号(signal)和槽(slot)是Qt的核心机制,也是在PyQt编程中对象之间进行通信的机制。在创建事件循环之后,通过建立信号和槽的…

postcss-px-to-viewport 从入坑到放弃 (nuxt3搭建响应式官网解决方案 )

前沿 什么是 postcss-px-to-viewport 将px单位转换为视口单位的 (vw, vh, vmin, vmax) 的 PostCSS 插件。 为什么使用 postcss-px-to-viewport 在pc端盛行的时代 ,如果你不想去适配更多的pc端代码,可以采用它。 由于nuxt3本身已带postcss,所…

六西格玛项目的核心要素:理论学习、实践应用与项目经验

许多朋友担心,没有项目经验是否就意味着无法考取六西格玛证书。针对这一疑问,张驰咨询为大家详细解答。 首先,需要明确的是,六西格玛项目不仅仅是一种管理工具或方法,更是一种追求卓越、持续改进的思维方式。它强调通…

git与gitlab

目录 gitlab 下载与安装 重置管理员密码 gitlab命令 git远程gitlab相关命令 认证 补充 git git 分布式版本控制 安装 git的四个区域与文件的四个状态 使用git 常用命令 git 分布式管理系统 gitlab 企业私有库 github 公网共享库,全球…

PHP基础教程

🐌博主主页:🐌​倔强的大蜗牛🐌​ 📚专栏分类:PHP 📚参考教程:菜鸟\编程网❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、PHP语法 基本的 PHP 语法 PHP 注释 PHP空白不敏…

环保访谈|浙江双视专注红外机器视觉及智能化应用,保障安全生产

近期,中联环保圈希姐采访了浙江双视科技股份有限公司环保行业销售总监孙波,深入了解了双视科技的发展历程、产品和解决方案、合作流程、核心竞争力以及未来规划。 双视于2014年创立,专注于红外机器视觉、人工智能技术与应用开发,…

JuiceFS v1.2-beta1,Gateway 升级,多用户场景权限管理更灵活

JuiceFS v1.2-beta1 今天正式发布。在这个版本中,除了进行了大量使用体验优化和 bug 修复外,新增三个特性: Gateway 功能扩展:新增了“身份和访问管理(Identity and Access Management,IAM)” 与…

系统如何做好安全加固?

一、Windows系统 Windows系统出厂时,微软为了兼容性,默认并未对系统安全做严格的限制,因此还需要做一些基本的安全加固,方可防止黑客入侵。 1、系统补丁更新 为什么要更新系统补丁?很多人感觉漏洞更新没必要&#x…

TC6291C 是一款电流模式升压型DC-DC转换器芯片

一般概述 TC6291C是一款电流模式升压型DC-DC转换器。其脉宽调制电路,内置0.2Q功率场效应管使这个调节器具有高功率效率。内部补偿网络也减少了多达6个的外部元件。误差信号放大器的同相输入端连接到0.6V精密基准电压,内部软启动功能可以减小瞬间突…

划重点!PMP报考条件、报考步骤、考试内容、适合人群

参加PMP认证的好处,可以从几个方面来认识: 一、参加PMP认证与考试的过程,同时是一个系统学习和巩固项目管理知识的过程 二、参加PMP认证,您可以获得由PMI颁发的PMP证书 而拥有PMP认证表示你已经成为一个项目管理方面的专业人员…

Azide-PEG-Azide,82055-94-5可以用于制备抗体、蛋白质、多肽等生物分子的标记物

【试剂详情】 英文名称 Azide-PEG-Azide,N3-PEG-N3 中文名称 叠氮-聚乙二醇-叠氮,聚氧乙烯二叠氮化物 CAS号 82055-94-5 外观性状 由分子量决定,粘稠液体或者固体。 分子量 0.4k,0.6k,1k,2k&#…

基于springboot+vue+Mysql的影城管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

Ansible简介版

目录 架构 环境部署 一、Ansible安装部署 1.yum安装Ansible 2.修改主机清单文件 3.配置密钥对验证 4.ansible-doc 5.看被控主机 二、常用模块 1.Command模块 2.Shell模块 3.Cron模块 1.添加 2.删除 4.User模块 5.Group模块 1.创建组 ​编辑 ​编辑 ​编辑…

java+jsp+Oracle+Tomcat 记账管理系统论文(完整版)

⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️⬇️ ➡️点击免费下载全套资料:源码、数据库、部署教程、论文、答辩ppt一条龙服务 ➡️有部署问题可私信联系 ⬆️⬆️⬆️​​​​​​​⬆️…

基于POSIX标准库的读者-写者问题的简单实现

文章目录 实验要求分析保证读写、写写互斥保证多个读者同时进行读操作 读者优先实例代码分析 写者优先示例代码分析 实验要求 创建一个控制台进程,此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件的要求进行读写操作。用信号量机制…

贪吃蛇游戏(C语言实现)

目录 游戏效果展示文件代码的展示test.cSnake.cSnake.h 下一个坐标不是食物 游戏效果展示 QQ录屏20240507163633 文件 代码的展示 test.c #define _CRT_SECURE_NO_WARNINGS#include<locale.h> //设置本地化 #include"Snake.h"//游戏的测试逻辑 void test() {…

【how2j Vue部分】两种在Vue的Ajax框架——fetch axios

fetch.js 和 axios.js 都是 Vue 中比较常见的两种ajax框架 1. fetch.js 一般说来 Vue 不会直接使用原生的 Ajax 而是使用 ajax 框架。 而 fetch.js 就是眼下比较流行的一种 ajax 框架 1. 准备 json数据&#xff1a;var url "https://gitee.com/api/v5/users/liyangyf&…

STM32F407VET6 学习笔记1:GPIO引脚认识分类与开发板原理图

今日学习STM32F407VET6 &#xff0c;首先从基本原理图、引脚方面开始做个初步理解并整理&#xff1a; 这里使用的学习开发板是在嘉立创购买的 立创梁山派天空星&#xff0c;芯片是 STM32F407VET6 主要对这个芯片的引脚做一些归纳认识、对开发学习板原理图设计进行认识理解:最…

新的字符设备注册方式和自动创建节点

文章目录 前言一、设备号的申请1.自动申请设备号2.用户指定设备号 二、获取设备号的程序格式1.格式 三、字符设备注册1.新的字符设备注册方法 四、节点的自动创建1.mdev机制2.mdev机制实现流程①创建一个类②创建一个设备 五、总结流程六、文件私有数据 前言 &#x1f4a6; re…