MFC图形函数学习13——在图形界面输出文字
本篇是图形函数学习的最后一篇,相关内容暂告一段落。
在图形界面输出文字,涉及文字字体、大小、颜色、背景、显示等问题,完成这些需要系列函数的支持。下面做简要介绍。
一、输出文本函数
原型:virtual BOOL textOut(int x, int y, LPCTSTR lpszString, int nCount);
BOOL TextOut(int x, int y, const CString& string);
参数:(x,y)输出文本起点坐标
lpszString 字符串指针
int nCount 字符串长度(LPCTSTR类型获得字符串长度可用CString(str).GetLength())
string 指向CString对象的指针
返回值:显示成功返回非0数字,失败返回0。
说明:
a.这个函数属于CDC类成员函数,使用时需要CDC类对象指针调用。
b.关于文字字符串起始位置,若把字符串看做矩形的话,起始位置是左上角。
c.如果直接调用这个函数输出文字,则字体、大小、颜色等使用的都是缺省设置;如需改变这些设置,需要使用下面这些函数,且需要在输出文字前进行设置。
d.关于参数中的字符串:多字符集情况下,可以使用char*、LPCTSTR类型声明对象并用"="直接赋值,也可以使用CString声明对象,并用对象调用其成员函数Format完成赋值;UNICODE情况下,可以使用LPCTSTR类型声明对象并用"="赋值,也可以使用CString声明对象,并用对象调用其成员函数Format完成赋值,但在字符串引号前要加L。
二、定义字体函数
原型:BOOL CreateFontIndirect(const LOGFONT* lpLogFont);
参数:lpLogFont是字体属性结构体(LOGFONT)指针,该结构体的使用见下。
返回值:定义字体成功返回非0数,否则返回0。
说明:
a.这个函数时CFont的成员函数,使用时需要CFont对象(指针)调用。
b.字体属性结构体LOGFONT常用属性:
lfHeight; //字体高度、LONG类型
lfWidth; //字体宽度、LONG类型(取值0时系统自动与lfHeight匹配)
lfEscapement; //倾角、LONG类型(文本行与X轴夹角,1=1/10度,顺时针方向为正)
lfOrientation; //文本基准线、LONG类型
lfWeight; //字体笔画粗细、LONG类型(取值0-900)
lfItalic; //斜体标志、BYTE类型(0标准、1倾斜)
lfUnderline; //下划线、BYTE类型
lfStrikeOut; //删除线、BYTE类型
lfCharSet; //字符集、BYTE类型(一般取值GB2312_CHARSET,也可使用DEFAULT_CHARSET)
lfFaceName[LF_FACESIZE];//字体名、TCHAR类型、如"宋体"、"仿宋"等
c.声明LOGFONT结构体对象后,一般将其用memset函数全部初始化成0<缺省值>,然后再对需要的属性进行赋值,其它的就使用缺省值。为lfFaceName赋值时,不能使用“=”赋值,若是UNICODE模式,需要使用wcscpy_s函数赋值;多字符集模式,使用strcpy_s函数赋值。
d.调用CreateFontIndirect生成的字体后,也需要调用SelectObject函数选入CDC,并用CFont*接收其返回值用于恢复缺省字体。(和使用画刷相似)
三、设置文字颜色函数
原型:virtual COLORREF SetTextColor (COLORREF color);
参数:color COLORREF类型的颜色值(可直接使用16进制、也可调用RGB函数)
返回值:返回原来文本颜色的RGB值,设置失败返回CLR_INVALID(0xFFFFFFFF)
说明:
a.该函数是CDC类的成员函数,使用时需CDC类对象或指针调用。
b.通过该函数进行文字颜色的设置,应接收其返回值,并在完成文字显示后恢复缺省设置。
四、设置文字背景颜色函数
原型:virtual COLORREF SetBkColor(COLORREF color);
参数:color为COLORREF类型的颜色值
返回值:原有的背景色,设置失败返回CLR_INVALID(0xFFFFFFFF)
说明:
a.这个函数是CDC类的成员函数,使用是需CDC类对象或指针调用。
b.所谓背景色,仅是显示文字的背景色,不涉及其它。
五、设置背景模式函数
原型:int SetBkMode(int nBkMode);
参数:nBkMode有两个取值:OPAQUE(值=2),表示背景颜色设置生效(默认设置,不调用这个函数的效果);TRANSPARENT(值=1),表示背景透明,背景颜色不改变。
返回:返回原背景模式。
说明:这个函数的TRANSPARENT模式在实际使用时,更有用处。也就是:当我们设置了字体颜色,背景颜色随已有图形颜色时,就没必要在设置背景颜色,只要把背景模式设置为TRANSPARENT即可。
六、举例程序
使用红(0000FF)、橙(007FFF)、黄(00FFFF)、绿(00FF00)、青(FFFF00)、蓝(FF0000)、紫(FF008B)、黑(000000)八种颜色在自定义坐标系中绘制8个填充扇形;每个扇形占半个象限;在扇形中用文字标出颜色名。
步骤一:在CMFC2DGraphView.h中定义一个全局宏,代码:
#define PI 3.14159
步骤二:在CMFC2DGraphView.h中,找到CMFC2DGraphView类,在类内public:下声明自定义画扇形函数,代码:
public:
//声明自定义画扇形函数void myPie(double startRad, double endRad, COLORREF fillColor, LPCTSTR str, COLORREF strColor);//参数说明:startRad-扇形起点弧度、endRad-终点弧度、fillColor-填充颜色、// str-标识文字、strColor-表示文字颜色
步骤三:在CMFC2DGraphView.cpp中实现myPie函数,代码:
//实现自定义画扇形函数
void CMFC2DGraphView::myPie(double startRad, double endRad, COLORREF fillColor, LPCTSTR str, COLORREF strColor)
{//自定义坐标系CRect rect;GetClientRect(rect);CDC* pDC;pDC = GetDC();/*做一点说明:GetDC()函数是CWnd类成员函数,使用时需要CWind类对象或指针调用;但由于我们是在视图类中作图,而视图类的基类就是CWnd类,所以使用this指针就可以调用,而this指针可以省略,所以这个函数在视图类中可以直接使用,就像全局函数一样。*/pDC->SetMapMode(MM_ANISOTROPIC); pDC->SetWindowExt(rect.Width(), rect.Height()); pDC->SetViewportExt(rect.Width(), -rect.Height());pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);//以当前窗口宽、高最小者的35%为扇形半径int r = min(rect.Width(), rect.Height()) * 0.35;//定义扇形填充颜色画刷、同颜色画笔并选入CDCCBrush brush(fillColor);CBrush* oldBrush = pDC->SelectObject(&brush);CPen pen(PS_SOLID, 1, fillColor);CPen* oldPen=pDC->SelectObject(&pen);//绘制扇形pDC->Pie(-r,r,r,-r, r*cos(startRad),r*sin(startRad), r * cos(endRad), r * sin(endRad));//恢复缺省画刷、画笔pDC->SelectObject(oldBrush);pDC->SelectObject(oldPen);//定义字体、字体颜色、背景模式并选入CDCLOGFONT logfont; //字体属性结构体设置memset(&logfont, 0, sizeof(logfont));logfont.lfCharSet = DEFAULT_CHARSET;wcscpy_s(logfont.lfFaceName,L"仿宋");logfont.lfHeight = 35;logfont.lfEscapement = (startRad + (endRad - startRad) / 2) * (-180) / PI;CFont cfont; //字体生成cfont.CreateFontIndirectW(&logfont);CFont* oldFont=pDC->SelectObject(&cfont);COLORREF oldColor = pDC->SetTextColor(strColor); //字体颜色设置pDC->SetBkMode(TRANSPARENT);//显示文字pDC->TextOutW(r * 0.7 * cos(startRad + (endRad - startRad) / 2)-18,r * 0.7 * sin(startRad + (endRad - startRad) / 2)+18,str, CString(str).GetLength());//恢复字体、字体颜色、背景模式缺省设置pDC->SelectObject(oldFont);pDC->SetTextColor(oldColor);pDC->SetBkColor(OPAQUE);ReleaseDC(pDC); //前面用GetDC获取了pDC,这里要释放,函数性质同GetDC
}
步骤四:在OnDraw函数中调用myPie函数,画出要求的扇形,代码:
myPie(0 * PI / 4, 1 * PI / 4, 0x0000ff, L"红", 0x000000);//填充红、文字黑myPie(1 * PI / 4, 2 * PI / 4, 0x007fff, L"橙", 0x8b00ff);//填充橙、文字紫myPie(2 * PI / 4, 3 * PI / 4, 0x00ffff, L"黄", 0xff0000);//填充黄、文字蓝myPie(3 * PI / 4, 4 * PI / 4, 0x00ff00, L"绿", 0x000000);//填充绿、文字黑myPie(4 * PI / 4, 5 * PI / 4, 0xffff00, L"青", 0xff0000);//填充青、文字蓝myPie(5 * PI / 4, 6 * PI / 4, 0xff0000, L"蓝", 0x0000ff);//填充青、文字红myPie(6 * PI / 4, 7 * PI / 4, 0xff008B, L"紫", 0x00ffff);//填充青、文字黄myPie(7 * PI / 4, 8 * PI / 4, 0x000000, L"黑", 0x00ffff);//填充青、文字黄
(以上代码也可以写成循环,颜色定义成COLORREF数组)
七、程序运行效果截图
相关文章:

MFC图形函数学习13——在图形界面输出文字
本篇是图形函数学习的最后一篇,相关内容暂告一段落。 在图形界面输出文字,涉及文字字体、大小、颜色、背景、显示等问题,完成这些需要系列函数的支持。下面做简要介绍。 一、输出文本函数 原型:virtual BOOL te…...

【Canvas与雷达】点鼠标可暂停金边蓝屏雷达显示屏
【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>点鼠标可暂停金边蓝屏雷达显示屏 Draft1</title><style typ…...

React第十二节组件之间通讯之发布订阅模式(使用pubsub-js插件)
组件之间通讯常用方案 1、通过props 2、通过context 3、通过发布订阅模式 4、通过Redux 后面会有专栏介绍 1、安装 pubsub-js 插件 yarn add pubsub-js 常用的事件 a、发布事件:传入一个自定义事件名称(name),以及要发布的消息内…...

Vue3安装 运行教程
本文是综合了所有vue安装教程而成 更细化 更简略 希望对各位读者有所帮助! Vue安装 1. Vue-cli脚手架安装 安装vue的方式有很多 我们这里选择npm方式安装vue npm方式 npm方式安装vue,详细介绍见下文。 1.node.js安装和配置 安装npm 需要安装note.js&…...

MySQL:约束constraint
约束就是表中数据的限制条件. 表在设计的时候加入约束的目的是为了保证表中记录的完整性和有效性,如用户表有些列的值(手机号)不能为空,有些列的值(身份证号)不能重复。 主键约束(primary key) PK MySQL主…...

使用Rufus制作Ubuntu需要注意
在使用Rufus制作Ubuntu启动盘并进行BIOS设置时,需要注意以下几点: 关闭RST(英特尔 快速存储技术):在BIOS设置中,如果电脑启用了RST功能,需要将其关闭。因为Ubuntu可能无法检测到硬盘&a…...

探索Go语言的高级特性:性能分析与安全性
Go语言性能分析与安全性 引言 Go语言因其高效的并发特性、简洁的语法和强大的工具链而受到广泛欢迎。在实际开发中,性能分析和安全性是需要特别关注的两个方面。本文将深入探讨Go语言中的性能分析工具和安全性考虑,帮助开发者编写高效、安全的Go应用程…...

SearchSploit配合gcc的使用
渗透测试中,SearchSploit是一个非常有用的工具,用于在Exploit数据库中搜索漏洞利用代码。其使用方法如下: 安装SearchSploit:首先确保你的系统中已经安装了Kali Linux,因为SearchSploit是Kali Linux的一部分。如果没有…...

无人机设计:云台挂载!
一、无人机云台挂载设置 安装与固定 将云台固定到无人机的挂载点上,通常需要使用专用的固定架和螺丝等工具。 确保云台与无人机之间的连接牢固,避免在飞行过程中出现松动或脱落的情况。 连接与调试 将云台与无人机之间的连接线缆(如电源…...

Spring Native适用场景、代理使用及测试部署策略
文章目录 1. Spring Native 适用的应用程序2. 在 Spring Native 中使用代理3. 测试和部署 Spring Native 应用测试部署 1. Spring Native 适用的应用程序 微服务:微服务架构中每个服务都相对独立,快速启动时间和较低的资源消耗对于提高部署效率和服务响…...

LeetCode—11. 盛最多水的容器(中等)
题目描述: 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明:…...

第一部分:入门准备 1.欢迎来到新手村 --[JavaScript 新手村:开启编程之旅的第一步]
为什么学习 JavaScript? 学习 JavaScript 有多个重要的理由,它在现代 Web 开发中扮演着不可或缺的角色。以下是几个关键原因: 1. 广泛的应用 JavaScript 是唯一可以在浏览器端直接运行的编程语言,几乎所有的网站和Web应用都使用…...

BERT的中文问答系统50
我们将对BERT的中文问答系统48-1代码进行以下改进: 1.增加时间日期和日历功能:在GUI中增加显示当前时间和日期的功能,并提供一个日历组件。 2.增加更多模型类型:增加娱乐、电脑、军事、汽车、植物、科技、历史(朝代、皇帝)、名人、生活(出行、菜品、菜谱、居家),法律、…...

深入解析CMake中的find_package命令:用法、特性及版本依赖问题
深入解析CMake中的find_package命令:用法、特性及版本依赖问题 在现代软件开发中,CMake作为一个强大的构建系统,广泛应用于跨平台项目的管理与编译。find_package是CMake中一个核心命令,用于查找并配置项目所依赖的外部库或包。本…...

【OpenDRIVE_Python】使用python脚本输出OpenDRIVE数据中含有隧道tunnel的道路ID和隧道信息
示例代码说明: 遍历OpenDRIVE数据中每条道路Road,若Road中存在隧道tunnel属性,则将该道路ID和包含的所有隧道信息输出到xml文件中。 import xml.dom.minidom from xml.dom.minidom import parse from xml.dom import Node import sys import os # 读取…...

SIP系列五:HTTP(SIP)鉴权
我的音视频/流媒体开源项目(github) SIP系列目录 目录 一、基本认证(basic) 二、摘要认证(digest) 1、摘要认证(digest) RFC 2069 2、摘要认证(digest) RFC 2617 2.1、未定义qop字段或值为"(空) 2.2、qop值为"auth" 2.3、qop值为"auth-int&quo…...

mysql json整数数组去重 整数数组精确查找并删除相应数据
都是针对整数数组 。低版本可用。懒得去查找资料的可以参考下。 json整数数组查找具体数据修改或者删除: update saas_new_tms.eda_logistics_limit set service_attribute json_remove(service_attribute,json_unquote(json_search(replace(service_attribute,…...

【5G】技术组件 Technology Components
5G的目标设置非常高,不仅在数据速率上要求达到20Gbps,在容量提升上要达到1000倍,还要为诸如大规模物联网(IoT, Internet of Things)和关键通信等新服务提供灵活的平台。这些高目标要求5G网络采用多种新技术…...

数据结构4——栈和队列
目录 1.栈 1.1.栈的概念及结构 1.2栈的实现 2.队列 2.1队列的概念及结构 2.2队列的实现 1.栈 1.1.栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一段称为栈顶,另一端称为…...

PHP SM4 加密
PHP SM4 加密 sm4基类 class Sm4 {private $ck [0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269,0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9,0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249,0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9,0xc0c7ced5, 0xdce3ea…...

leetcode - 2825. Make String a Subsequence Using Cyclic Increments
Description You are given two 0-indexed strings str1 and str2. In an operation, you select a set of indices in str1, and for each index i in the set, increment str1[i] to the next character cyclically. That is ‘a’ becomes ‘b’, ‘b’ becomes ‘c’, an…...

工业—使用Flink处理Kafka中的数据_ChangeRecord1
使用 Flink 消费 Kafka 中 ChangeRecord 主题的数据,当某设备 30 秒状态连续为 “ 预警 ” ,输出预警 信息。当前预警信息输出后,最近30...

探索嵌入式硬件设计:揭秘智能设备的心脏
目录 引言 嵌入式系统简介 嵌入式硬件设计的组成部分 设计流程 微控制器选择 原理图设计 PCB布局 编程与调试 系统集成与测试 深入理解微控制器 存储器管理 输入/输出接口 通信接口 电源管理 硬件抽象层(HAL) 操作系统(OS&am…...

数据结构-最小生成树
一.最小生成树的定义 从V个顶点的图里生成的一颗树,这颗树有V个顶点是连通的,有V-1条边,并且边的权值和是最小的,而且不能有回路 二.Prim算法 Prim算法又叫加点法,算法比较适合稠密图 每次把边权最小的顶点加入到树中࿰…...

mac启动jmeter
// 设置使用java8,使用21版本会有问题 export JAVA_HOME/Library/Java/JavaVirtualMachines/jdk1.8.0_221.jdk/Contents/Home/ export PATH$JAVA_HOME/bin:$PATH cd /Users/user/software/apache-jmeter-5.1.1 //设置不使用代理 sh jmeter -Jhttp.proxyHost -J…...

spring学习笔记之静态代理和动态代理
在 Spring 开发中,静态代理和动态代理是实现面向切面编程(AOP)的两种常见方式。两者的主要区别在于代理类的生成时间和方式。 静态代理 定义 静态代理是由开发者或工具在编译期明确创建代理类的方式,代理类和目标类在程序运行前就已经存在。 特点 代理类明确存在:需要…...

qemu搭建aarch64
qemu工具搭建aarch64系统 下载准备 下载qemu: https://qemu.weilnetz.de/w64/2022/qemu-w64-setup-20220831.exe 下载固件:https://publishing-ie-linaro-org.s3.amazonaws.com/releases/components/kernel/uefi-linaro/16.02/release/qemu64/QEMU_EFI.fd?Signat…...

delphi IDE 插件DelphiIDEPlugin_SearchProject,用于从项目组中查找项目
delphi IDE 插件DelphiIDEPlugin_SearchProject,用于从项目组中查找项目 安装后在菜单Tools下第一个子菜单项查找项目 delphiIDE插件DelphiIDEPlugin-SearchProject,用于从项目组中查找项目资源-CSDN文库...

【Vue】Scoped、组件间通信、Props检验
目录 Scoped 作用 *原理 组件通信 前置知识 什么是组件通信 为什么需要组件通信 如何进行组件通信 如何辨别两个组件的关系 父子组件通信 父传子 子传父 非父子组件通信 祖先传后代 语法 任意两个组件通信 步骤 Props校验 props是什么 作用 语法 组件的…...

openbmc dbus架构简析(二)
1.说明 以前看内核代码觉得难,是因为内核代码涉及到硬件原理与算法结构和层次递进的代码逻辑,现在的应用层因为业务的复杂与代码和内核的交互接口复杂,也变得有些难度了。 这篇文章是继:openbmc dbus架构简析的第二篇文章。 首先贴出来前篇…...