深入浅出CChart 每日一课——红花当然配绿叶,CChart辅助图形绘制

news2025/1/25 1:45:54

各位同学,好久不见,我可想死你们了!!!咦,那位不是巩叔吗?不好意思,侵权了,请多担待@_@。

前面的课程呢,拓展的内容比较多,最近笨笨想聚焦在CChart本身的使用上,进行一些介绍。

本节课主要想介绍CChart的辅助图形绘制,主要包括三方面内容:1、页面注释(题注和脚注);2、标签注释;3、辅助图元(直线、矩形、椭圆、正圆)。

会用Microsoft Word的人,对题注和脚注应该不陌生,大体如下,也就是在文档的顶部和底部显示一些简单的信息。

有时候画曲线的时候可能也需要题注和脚注。实际上,CChart的题注和脚注功能是多年以前一位朋友提出的需求,当时就实现了这项功能。

标签注释是在图像中间显示一些信息,这些信息既可以是文字标签,也可以是图片标签。

辅助图元的用途很多。举个最简单的应用场景,一些测量数据需要标出关键位置,用一条直线标注一下就非常直观了。

如图,这是笨笨最近编写的一个小程序,里面既有标签注释,也画了辅助线,可见,利用这些小功能,可以把关注的信息清晰地呈现出来。

请注意,本节课的部分内容需要CChart 4.8.0.1以上版本才能使用,请同学们到QQ群里下载。

下面先简单介绍辅助图形绘制用到的API。

A60.1 页面注释编程API

页注相关的编程接口如下。

        // 设置是否显示题注
		void		SetHeadernoteShow(bool bShow, int nPlotIndex=0);
		// 设置题注信息
		void		SetHeadernoteString(TCHAR *note, int nPlotIndex=0);
		// 设置题注字体
		void		SetHeadernoteFont(LOGFONT &font, int nPlotIndex=0);
		// 设置题注颜色
		void		SetHeadernoteColor(COLORREF color, int nPlotIndex=0);
		// 设置题注对齐格式
		void		SetHeadernoteAlign(int align, int nPlotIndex=0);

		// 设置是否显示尾注
		void		SetFootnoteShow(bool bShow, int nPlotIndex=0);
		// 设置尾注信息
		void		SetFootnoteString(TCHAR *note, int nPlotIndex=0);
		// 设置尾注字体
		void		SetFootnoteFont(LOGFONT &font, int nPlotIndex=0);
		// 设置尾注颜色
		void		SetFootnoteColor(COLORREF color, int nPlotIndex=0);
		// 设置尾注对齐格式
		void		SetFootnoteAlign(int align, int nPlotIndex=0);

这些接口分两部分,就是题注(Headernote)和脚注(Footnote),其中题注位于图像顶部,脚注位于图像底部。两部分接口完全对应。

这些接口基本不需要进一步解释,很好理解,只有对齐函数的int align的含义需要稍微介绍一下。这个参数是Win32API的DrawText函数中的格式参数,可以是DT_LEFT、DT_RIGHT、DT_CENTER、DT_VCENTER等值以及它们的组合,具体请参考MSDN中DrawText的内容。

A60.2 标签注释编程API

标注相关的编程接口如下。

        // 获得备注的数量
		int			GetCommentsCount(int nPlotIndex=0);
		// 根据数据值添加备注
		int			AddComment(TCHAR *comment, double x, double y, int nPlotIndex=0);
		// 设置上一个函数参数中,x,y是否是相对值。相对值的定义,就是本身值减去范围最小值
		void		SetCommentPosRelative(bool relative, int nCommentIndex, int nPlotIndex=0);
		// 设置备注的位置,用于在AddComment后修改
		void		SetCommentPos(int nCommentIndex, double x, double y, int nPlotIndex=0);
		// 是指备注边或角的位置
		void		SetCommentCornerEdgePos(int nCommentIndex, double x, double y, int nWhere, int nPlotIndex=0);
		// 清除全部备注
		void		ClearComments(int nPlotIndex=0);
		// 清除单个备注
		void		ClearComment(int nCommentIndex, int nPlotIndex=0);

这些接口中,只有SetCommentCornerEdgePos中的nWhere参数需要解释一下。这个参数表示设置的是标签块哪一个边角的位置。具体如下。

    enum
	{
		kCommentSetLeftTop,
		kCommentSetLeftBottom,
		kCommentSetRightTop,
		kCommentSetRightBottom,

		kCommentLeftCenter,
		kCommentBottomCenter,
		kCommentRightCenter,
		kCommentTopCenter,

		kCommentCenterCE,

		kCommentSetCount
	};

这个枚举类型在头文件Chart.h的头部,但被注释掉了,但可以到里面查看nWhere的含义。例如nWhere==0表示设置的是标签块的左上角,nWhere==4表示设置的是标签块坐标中点。

A60.3 辅助图元编程API

辅助图元指的是图像上附加的直线、矩形、椭圆、正圆图形。在此功能推出之前,可以在图像上加曲线来模拟这些图形,但总归不太方便。

辅助图元相关的编程接口如下。

        // 设置是否显示图元对象
		void	SetMetaGraphShow(bool bShow, int nPlotIndex=0);
		// 获得图元对象数目
		int		GetMetaGraphCount(int nPlotIndex=0);
		// 清除所有图元对象
		void	ClearMetaGraphs(int nPlotIndex=0);
		// 清除单个图元对象
		void	ClearMetaGraph(int nIndex, int nPlotIndex=0);
		// 添加图元直线
		bool	AddMetaLine(double x1, double y1, double x2, double y2, bool bInf = false, int endAxis = 0, int nLineStyle = PS_SOLID, int nLineWidth = 1, COLORREF crLineColor = RGB(240, 0, 0), int nPlotIndex=0);
		// 添加矩形图元
		bool	AddMetaRect(double left, double top, double right, double bottom, int nLineStyle = PS_SOLID, int nLineWidth = 1, COLORREF crLineColor = RGB(240, 0, 0), bool bFill = false, COLORREF crFillColor = RGB(228, 228, 0), int nFillAlpha = 255, int nPlotIndex=0 );
		// 添加椭圆图元
		bool	AddMetaEllipse(double ctx, double cty, double a, double b, int nLineStyle = PS_SOLID, int nLineWidth = 1, COLORREF crLineColor = RGB(240, 0, 0), bool bFill = false, COLORREF crFillColor = RGB(228, 228, 0), int nFillAlpha = 255, int nPlotIndex=0 );
		// 添加正圆图元
		bool	AddMetaCircle(double ctx, double cty, double radius, bool xdir, int nLineStyle = PS_SOLID, int nLineWidth = 1, COLORREF crLineColor = RGB(240, 0, 0), bool bFill = false, COLORREF crFillColor = RGB(228, 228, 0), int nFillAlpha = 255, int nPlotIndex=0 );

这些接口,有几个参数需要解释一下。

1. AddMetaLine()函数中,bInf和endAxis的含义。

如果bInf为false,表示从数据点(x1,y1)到(x2,y2)画一条直线,这里x1、y1、x2、y2都是数据坐标,并非屏幕坐标。

如果bInf为true,表示从数据点(x1,y1)画一条到坐标轴的直线,此时(x2,y2)不起任何作用。endAxis表示往哪条坐标轴画线,其中0、1、2、3分别表示左轴、下轴、右轴、上轴,另外endAxis还可以是4或5,分别表示过(x1,y1)从左轴画到右轴,从上轴画到下轴。

2. 椭圆和正圆都可以填充,nFillAlpha是不透明度,默认为255,填充色不透明。

3. AddMetaCircle()中有一个参数xdir,表示圆半径radius根据哪个方向的数据进行计算。因X和Y两个方向的比例尺不同,即使两个方向的半径按数据计算一样,画出来的也是椭圆。当xdir为true时,表示按X方向数据来计算半径radius实际是多少像素;当xdir为false时,表示按Y方向数据来计算半径radius实际是多少像素。

A60.4 编程Demo

按照惯例,我们还是编写一个实例程序,演示一些这些功能。

1. 框架程序编写

我们先编写一个利用CChartWnd的简单程序。具体过程不再赘述,前面的课程中已经多次反复讲述。这里还是使用Win32 Application向导生成的框架。

这里本节课最主要的代码如下。

        case WM_CREATE:
			chartWnd.Attach(hWnd);
			int hl;
			int i;
			hl = 50;
			for(i=-hl; i<=50; ++i)
			{
				chartWnd.GetChart()->AddPoint2D(i, i*i*i/double(hl*hl*hl));
			}
			chartWnd.GetChart()->SetTitle(_T("测试辅助图形"));
			chartWnd.GetChart()->SetBLAxis();
			break;

这里就添加了一条曲线。

结果如下。

这里同学们随便画点啥都是可以的。

2. 添加题注和脚注

我们在图像的左上角和右下角,分别加上题注和脚注。

在上述代码的最后,添加如下代码:

            chartWnd.GetChart()->SetHeadernoteShow(true);
			chartWnd.GetChart()->SetHeadernoteString(_T("CChart的题注,2024/02/12"));
			chartWnd.GetChart()->SetHeadernoteAlign(DT_LEFT);
			chartWnd.GetChart()->SetFootnoteShow(true);
			chartWnd.GetChart()->SetFootnoteString(_T("CChart的脚注"));

结果如图。

3. 添加标签注释

我们在数据(0.0, 0.0)位置添加一条标注,注意,这里默认指标签的左上角在(0.0, 0.0)位置。如果想换成其它边角在该位置,可以在添加后,利用SetCommentCornerEdgePos进行修改。

代码如下。

    chartWnd.GetChart()->AddComment(_T("这个标注左上角在(0,0)位置"), 0.0, 0.0);

结果如图。

4. 添加辅助图形

我们直接添加直线、矩形、椭圆、正圆各一个,不再详细阐述, 代码如下。

            chartWnd.GetChart()->SetMetaGraphShow(true);
			chartWnd.GetChart()->AddMetaLine(-20.0, (-20.0)*(-20.0)*(-20.0)/double(hl*hl*hl), 0.0, 0.0, true, 1, PS_DASH, 2);
			chartWnd.GetChart()->AddMetaRect(-40.0, 0.5, -30.0, -0.5);
			chartWnd.GetChart()->AddMetaEllipse(0.0, 0.0, 10.0, 0.15, PS_SOLID, 2, RGB(240, 240, 0), true, RGB(128, 0, 128), 128);
			chartWnd.GetChart()->AddMetaCircle(30.0, 0.0, 0.1, false);

结果如图。

由于辅助图形的绘制功能比较简单,上述代码已经较清楚地展示了使用方法。

好了,谢谢同学们的关注。

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

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

相关文章

微服务多级缓存

多级缓存 1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如果未命中则查询数据库&#xff0c;如图&#xff1a; 存在下面的问题&#xff1a; •请求要经过Tomcat处理&#xff0c;Tomcat的性能成为整个系统的瓶颈 •Redis缓存…

Structured Streaming

目录 一、概述 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;两种处理模型 &#xff08;三&#xff09;Structured Streaming和Spark SQL、Spark Streaming关系 二、编写Structured Streaming程序的基本步骤 &#xff08;一&#xff09;实现步骤 &…

jsp计算机线上教学系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 计算机线上教学系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5…

WebSocketServer方法里注入不了其他类

请直接看原文: WebSocketServer无法注入其他对象的问题 - 知乎 (zhihu.com) WebSocket服务无法使用自动注入解决方法_websocket sever不可以直接注入吧-CSDN博客 ------------------------------------------------------------------------------------------------------…

2.11日学习打卡----初学RocketMQ(二)

2.11日学习打卡 一. RocketMQ整合springboot 首先配置pom.xml文件 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>annotationProcessor</scope></dependency><dependency>…

Java图形化界面编程——处理位图 笔记

2.8.3 处理位图 ​ 如果仅仅绘制一些简单的几何图形&#xff0c;程序的图形效果依然比较单调 。 AWT 也允许在组件上绘制位图&#xff0c; Graphics 提供了 drawlmage() 方法用于绘制位图&#xff0c;该方法需要一个Image参数一一代表位图&#xff0c;通过该方法就可 以绘制出…

苹果Mac键盘如何将 F1 到 F12 取消按Fn

苹果电脑安装了Win10操作系统之后&#xff0c;F1到F12用不了怎么办的解决方法。本文将介绍一些解决方法&#xff0c;帮助您解决无法使用F1到F12功能键的问题。 使用 Mac系统的人都知道&#xff0c;Mac系统默认是没有开启 F1-F12 的使用的&#xff0c;平时我们使用的系统都可以使…

【C语言】实现双向链表

目录 &#xff08;一&#xff09;头文件 &#xff08;二&#xff09; 功能实现 &#xff08;1&#xff09;初始化 &#xff08;2&#xff09;打印链表 &#xff08;3&#xff09; 头插与头删 &#xff08;4&#xff09;尾插与尾删 &#xff08;5&#xff09;指定位置之后…

降噪和音频修复 iZotope RX 7 Advanced

iZotope RX 7 Advanced 是一款功能强大的音频修复和增强软件&#xff0c;它能够帮助用户轻松应对各种音频问题&#xff0c;提供全面的工具和技术来优化和改善音频质量。 首先&#xff0c;iZotope RX 7 Advanced 具有出色的降噪功能。无论是背景噪音、杂音还是其他干扰因素&…

【Java EE初阶十二】网络编程TCP/IP协议(二)

1. 关于TCP 1.1 TCP 的socket api tcp的socket api和U大片的socket api差异很大&#xff0c;但是和前面所讲的文件操作很密切的联系 下面主要讲解两个关键的类&#xff1a; 1、ServerSocket&#xff1a;给服务器使用的类&#xff0c;使用这个类来绑定端口号 2、Socket&#xf…

服务治理中间件-Eureka

目录 简介 搭建Eureka服务 注册服务到Eureka 简介 Eureka是Spring团队开发的服务治理中间件&#xff0c;可以轻松在项目中&#xff0c;实现服务的注册与发现&#xff0c;相比于阿里巴巴的Nacos、Apache基金会的Zookeeper&#xff0c;更加契合Spring项目&#xff0c;缺点就是…

论文阅读:《Deep Learning-Based Human Pose Estimation: A Survey》——Part 1:2D HPE

目录 人体姿态识别概述 论文框架 HPE分类 人体建模模型 二维单人姿态估计 回归方法 目前发展 优化 基于热图的方法 基于CNN的几个网络 利用身体结构信息提供构建HPE网络 视频序列中的人体姿态估计 2D多人姿态识别 方法 自上而下 自下而上 2D HPE 总结 数据集…

GEE:最小距离(minimumDistance)回归教程(样本点、特征添加、训练、精度、参数优化)

作者:CSDN @ _养乐多_ 对于分类问题,这个输出通常是一个类别标签 ,而对于回归问题,输出通常是一个连续的数值。回归可以应用于多种场景,包括预测土壤PH值、土壤有机碳、土壤水分、碳密度、生物量、气温、海冰厚度、不透水面积百分比、植被覆盖度等。 本文将介绍在Google…

位运算+leetcode(1)

基础 1.基础知识 以下都是针对数字的二进制进行操作 >> 右移操作符<< 左移操作符~ 取反操作符 & 有0就是0&#xff0c;全一才一 | 有一才一 &#xff0c;全0才0^ 相同为0&#xff0c;相异为1 异或( ^ )运算的规律 a ^ 0 a a ^ a 0a ^ b ^ c a ^ (b …

2本对微服务拆分有帮助的书

迁移到云原生应用架构 可在线观看的免费书籍 https://pivotal.io/platform-as-a-service/migrating-to-cloud-native-application-architectures-ebook 微服务架构设计模式 世界十大架构师之一&#xff1a;克里斯理查森著

【51单片机】LED点阵屏(江科大)

9.1LED点阵屏 1.LED点阵屏介绍 LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。 2.LED点阵屏工作原理 LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以“8”字型排列而已。原理图如下 每一行的阳极连在一起,每一列…

如何在C# Windows Forms应用程序中实现控件之间的连接线

帮我实现绘图工具多个控件连接线&#xff0c;请用c#代码实现 实现绘图工具中多个控件之间的连接线功能&#xff0c;可以通过以下几个步骤来进行&#xff1a; 定义连接线的数据模型&#xff1a;首先需要定义一个模型来表示连接线&#xff0c;这个模型应该包含起点和终点的坐标。…

【Effective Objective - C 2.0】——读书笔记(四)

文章目录 二十三、通过委托与数据源协议进行对象间通信二十四、将类的实现代码分散到便于管理的数个分类之中二十五、总是为第三方的分类名称加前缀二十六、切勿在分类里面声明属性二十七、使用“class-continuation分类”隐藏实现细节二十八、通过协议提供匿名对象 二十三、通…

【Chrono Engine学习总结】4-vehicle-4.1-vehicle的基本概念

由于Chrono的官方教程在一些细节方面解释的并不清楚&#xff0c;自己做了一些尝试&#xff0c;做学习总结。 1、基本介绍 Vehicle Overview Vehicle Mannel Vehicle的官方demo 1.1 Vehicle的构型 一个车辆由许多子系统构成&#xff1a;悬挂、转向、轮子/履带、刹车/油门、动…