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…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
