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

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

前面的课程呢,拓展的内容比较多,最近笨笨想聚焦在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.mzph.cn/news/679735.shtml

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

相关文章

车载电子电器架构 —— 电子电气系统功能开发

车载电子电器架构 —— 电子电气系统功能开发 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣扎,出门靠自己,四海皆…

C++三剑客之std::optional(一) : 使用详解

相关文章系列 C三剑客之std::optional(一) : 使用详解 C三剑客之std::any(一) : 使用 C之std::tuple(一) : 使用精讲(全) C三剑客之std::variant(一) : 使用 C三剑客之std::variant(二)&#xff1a;深入剖析 目录 1.概述 2.构建方式 2.1.默认构造 2.2.移动构造 2.3.拷贝构…

C#计算矩形面积:通过定义结构 vs 通过继承类

目录 一、涉及到的知识点 1.结构 2.结构和类的区别 3.继承 4.使用类继承提高程序的开发效率 5.属性 &#xff08;1&#xff09;属性定义 &#xff08;2&#xff09;get访问器 &#xff08;3&#xff09;set访问器 6. 属性和字段的区别 二、实例&#xff1a;通过定义…

[word] word表格表头怎么取消重复出现? #媒体#笔记#职场发展

word表格表头怎么取消重复出现&#xff1f; word表格表头怎么取消重复出现&#xff1f;在Word中的表格如果过长的话&#xff0c;会跨行显示在另一页&#xff0c;如果想要在其它页面上也显示表头&#xff0c;更直观的查看数据。难道要一个个复制表头吗&#xff1f;当然不是&…

idea:如何连接数据库

1、在idea中打开database: 2、点击 ‘’ ---> Data Source ---> MySQL 3、输入自己的账号和密码其他空白处可以不填&#xff0c;用户和密码可以在自己的mysql数据库中查看 4、最后选择自己需要用的数据库&#xff0c;点击运用ok&#xff0c;等待刷新即可 最后&#xff1a…

springboot179基于javaweb的流浪宠物管理系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

disql备份还原

disql备份还原 前言 本文档根据官方文档&#xff0c;进行整理。 一、概述 在 disql 工具中使用 BACKUP 语句你可以备份整个数据库。通常情况下&#xff0c;在数据库实例配置归档后输入以下语句即可备份数据库&#xff1a; BACKUP DATABASE BACKUPSET db_bak_01;语句执行完…

C++进阶(十四)智能指针

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、为什么需要智能指针&#xff1f;二、内存泄漏1、 什么是内存泄漏&#xff0c;内存泄漏的危…

量子位 | 2024年AI还能帮你干什么?这十个趋势必须关注

本文来源公众号“量子位”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;2024年AI还能帮你干什么&#xff1f;这十个趋势必须关注 大年初三&#xff0c;也不要忘记学习&#xff01;新的一年里&#xff0c;怎样能让AI多给自己帮帮…

【数据结构】13:表达式转换(中缀表达式转成后缀表达式)

思想&#xff1a; 从头到尾依次读取中缀表达式里的每个对象&#xff0c;对不同对象按照不同的情况处理。 如果遇到空格&#xff0c;跳过如果遇到运算数字&#xff0c;直接输出如果遇到左括号&#xff0c;压栈如果遇到右括号&#xff0c;表示括号里的中缀表达式已经扫描完毕&a…

每日一练:LeeCode-654、最大二叉树【二叉树+DFS+分治】

本文是力扣LeeCode-654、最大二叉树【二叉树DFS分治】 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其…

python安装cv2失败

问题:安装cv2包失败 解决方法&#xff1a; pip install opencv-python或在Anaconda中conda install opencv-python

蓝牙BLE学习-蓝牙广播

1.概念 什么叫做广播&#xff0c;顾名思义就像广场上的大喇叭一样&#xff0c;不停的向外传输着信号。不同的是&#xff0c;大喇叭传输的是音频信号&#xff0c;而蓝牙传输的是射频信号。 BLE使用的是无线电波传递信息&#xff0c;就是将数据编码&#xff0c;调制到射频信号中发…

基于Robei EDA--实现串口通信

一、串口简介 串口作为常用的三大低速总线&#xff08;UART、SPI、IIC&#xff09;之一&#xff0c;在设计众多通信接口和调试时占有重要地位。但UART和SPI、IIC不同的是&#xff0c;它是异步通信接口&#xff0c;异步通信中的接收方并不知道数据什么时候会到达&#xff0c;所…

【后端高频面试题--SpringBoot篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;后端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 这里写目录标题 1.什么是SpringBoot&#xff1f;它的主要特点是什么&#xff1f;2.列举一些Spri…

《CSS 简易速速上手小册》第4章:视觉美学(2024 最新版)

文章目录 4.1 颜色理论在 CSS 设计中的应用&#xff1a;网页的调色盘4.1.1 基础知识4.1.2 重点案例&#xff1a;创建一个具有情感设计的登录页面4.1.3 拓展案例 1&#xff1a;使用颜色增强信息的可视化表示4.1.4 拓展案例 2&#xff1a;利用颜色创建网站的品牌身份 4.2 字体与文…

书生·浦语大模型第四课作业

基础作业&#xff1a; 构建数据集&#xff0c;使用 XTuner 微调 InternLM-Chat-7B 模型, 让模型学习到它是你的智能小助手&#xff0c;效果如下图所示&#xff0c;本作业训练出来的模型的输出需要将不要葱姜蒜大佬替换成自己名字或昵称&#xff01; 1.安装 # 如果你是在 Int…

Java是如何实现的平台无关?

&#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是小徐&#x1f947;☁️博客首页&#xff1a;CSDN主页小徐的博客&#x1f304;每日一句&#xff1a;好学而不勤非真好学者 &#x1f4dc; 欢迎大家关注&#xff01; ❤️ 1、什么是平台无关性 平台无关性就是一种语言在…

寒假作业

手写盗版微信登入界面 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);this->resize(421,575);this->setFixedSize(421,575);th…