MFC图形函数学习13——在图形界面输出文字

news2024/12/27 1:23:41

       本篇是图形函数学习的最后一篇,相关内容暂告一段落。   
       在图形界面输出文字,涉及文字字体、大小、颜色、背景、显示等问题,完成这些需要系列函数的支持。下面做简要介绍。
 一、输出文本函数
       原型: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;
	//定义扇形填充颜色画刷、同颜色画笔并选入CDC
	CBrush 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);
	//定义字体、字体颜色、背景模式并选入CDC
	LOGFONT 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数组)
 七、程序运行效果截图

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

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

相关文章

Mysql如何实现原子性(MVCC实现原理)

Mysql如何实现原子性(MVCC实现原理) Mysql实现原子性主要通过一下机制 锁MVCC多版本并发控制 MVCC的实现原理 在介绍MVCC的实现原理之前需要先介绍一下Mysql表中的隐藏字段 , 以及undo_log版本链以及readview 1. Mysql中的隐藏字段 Mysql在创建表的时候除了我们所定义的字…

遇到问题:hive中的数据库和sparksql 操作的数据库不是同一个。

遇到的问题&#xff1a; 1、hive中的数据库和sparksql 操作的数据库不同步。 观察上面的数据库看是否同步 &#xff01;&#xff01;&#xff01; 2、查询服务器中MySQL中hive的数据库&#xff0c;发现创建的位置没有在hdfs上&#xff0c;而是在本地。 这个错误产生的原因是&…

Leetcode - 周赛426

目录 一&#xff0c;3370. 仅含置位位的最小整数 二&#xff0c;3371. 识别数组中的最大异常值 三&#xff0c;3372. 连接两棵树后最大目标节点数目 I 四&#xff0c;3373. 连接两棵树后最大目标节点数目 II 一&#xff0c;3370. 仅含置位位的最小整数 两种做法&#xff1a…

用 Python 从零开始创建神经网络(十四):L1 和 L2 正则化(L1 and L2 Regularization)

L1 和 L2 正则化&#xff08;L1 and L2 Regularization&#xff09; 引言1. Forward Pass2. Backward pass到此为止的全部代码&#xff1a; 引言 正则化方法旨在降低泛化误差。我们首先讨论的正则化形式是L1正则化和L2正则化。L1和L2正则化用于计算一个数值&#xff08;称为惩…

浅谈网络 | 应用层之流媒体与P2P协议

目录 流媒体名词系列视频的本质视频压缩编码过程如何在直播中看到帅哥美女&#xff1f;RTMP 协议 P2PP2P 文件下载种子文件 (.torrent)去中心化网络&#xff08;DHT&#xff09;哈希值与 DHT 网络DHT 网络是如何查找 流媒体 直播系统组成与协议 近几年直播比较火&#xff0c;…

云计算介绍_3(计算虚拟化——cpu虚拟化、内存虚拟化、io虚拟化、常见集群策略、华为FC)

计算虚拟化 1.计算虚拟化介绍1.1 计算虚拟化 分类&#xff08;cpu虚拟化、内存虚拟化、IO虚拟化&#xff09;1.1.1 cpu虚拟化 一级目录 一级目录 一级目录 一级目录 1.计算虚拟化介绍 1.1 计算虚拟化 分类&#xff08;cpu虚拟化、内存虚拟化、IO虚拟化&#xff09; 1.1.1 cpu虚…

关于 Qt编译遇到fatal error C1189: #error: “No Target Architecture的 解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/144205902 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

基于python的某音乐网站热门歌曲的采集与分析,包括聚类和Lda主题分析

一项目背景 在当前竞争激烈的市场环境下&#xff0c;分析酷狗音乐上的热门歌曲及其用户行为趋势&#xff0c;对平台运营、歌曲推荐和音乐创作具有重要意义。尤其是通过对酷狗音乐平台热门歌曲的数据采集与分析&#xff0c;可以深入理解用户偏好、歌曲流行的规律以及市场需求的…

React 路由与组件通信:如何实现路由参数、查询参数、state和上下文的使用

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

掌握排序艺术:Java 中常见排序算法的深度解析与实战

排序是计算机科学中的一个基本问题&#xff0c;它在数据处理、搜索和分析中扮演着重要角色。Java提供了多种内置的排序方法&#xff0c;但了解不同排序算法的工作原理及其优缺点对于优化性能和选择合适的解决方案至关重要。本文将详细介绍几种常见的排序算法&#xff0c;包括它…

html+css网页设计马林旅行社移动端4个页面

htmlcss网页设计马林旅行社移动端4个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#…

Linux系统编程之进程控制

概述 在Linux系统中&#xff0c;创建一个新的进程后&#xff0c;如何对该进程进行有效的控制&#xff0c;是一项非常重要的操作。控制进程状态的操作主要包括&#xff1a;进程的执行、进程的等待、进程的终止等。下面&#xff0c;我们将逐个进行介绍。 进程的执行 创建进程后&a…

猜数字的趣味小游戏——rand函数、srand函数、time函数的使用

文章目录 前言一、随机数的生成1.1. rand函数1.2. srand函数1.3. time函数 二、设置随机数的范围三、猜数字游戏的代码实现总结 前言 上一篇博客我们写了一个电脑关机的小游戏&#xff0c;我篇博客我们写一个猜数字的小游戏&#xff0c;学习rand函数、srand函数、time函数的使…

ScratchLLMStepByStep:一步一步构建大语言模型教程

前言 在学习大语言模型的时候&#xff0c;总会遇到各种各样的名词&#xff0c;像自注意力、多头、因果、自回归、掩码、残差连接、归一化等等。这些名词会让学习者听的云里雾里&#xff0c;觉得门槛太高而放弃。 本教程将会带你从零开始&#xff0c;一步一步的去构建每一个组…

从0开始学PHP面向对象内容之常用设计模式(享元)

二、结构型设计模式 7、享元模式&#xff08;Flyweight Pattern&#xff09; 这里是引用享元模式&#xff08;Flyweight Pattern&#xff09; 是一种结构型设计模式&#xff0c;旨在通过共享对象来减少内存使用&#xff0c;尤其适用于大量相似对象的场景。通过共享和重用对象的…

时钟约束在STA中的作用

时钟约束在STA中的作用 1.约束作为声明2.约束作为断言3.约束作为指令4.约束作为异常5. 约束的角色变化 简介&#xff1a; STA工具从相应的设计描述中获取电路描述&#xff0c;HDL是最常用的形式。它还接受库输入–主要用来了解依赖技术的特性&#xff0c;如通过特定门的延迟值。…

Springboot 修改post请求接口入参或重新赋值

前言 很久之前写过一篇就是自动填充接口参数的&#xff0c;利用的 HandlerMethodArgumentResolver 自定义注解 Springboot Controller接口默认自动填充 业务实体参数值_springboot设置入参默认值-CSDN博客 现在这一篇也差不多&#xff0c;达到的目的就是重新去给post请求的参数…

机器学习:精确率与召回率的权衡

高精度意味着如果诊断得了那种罕见病的病人&#xff0c;可能病人确实有&#xff0c;这是一个准确的诊断&#xff0c;高召回率意味着如果有一个还有这种罕见疾病的病人&#xff0c;也许算法会正确的识别他们确实患有这种疾病&#xff0c;事实中&#xff0c;在精确与召回之间往往…

海盗王用golang重写的AccountServer功能

自从用golang重写了海盗王的网关gateserver以来&#xff0c;一直想把accountserver也重写了&#xff0c;但是一直没有进行。 趁上次刚写好那个golang版的更新器&#xff0c;还有些熟悉&#xff0c;于是把原来AccountServer的C代码重写读了个大概。它原版的写得太过于复杂&#…

【动态规划】小S的货船租赁冒险

文章目录 一、问题描述输入格式输出格式 问题背景二、动态规划思想三、代码实现细节初始化二维数组遍历每种货船遍历预算并更新状态提前剪枝优化 四、代码实现算法复杂度分析优化思路 一、问题描述 李华在码头租货船&#xff0c;有 Q 种货船可以租赁。第 i 种货船的数量为 m[i…