Teechart动态设计方法
以前搞Qt或者MFC,不明白为何大牛做界面时不用工具箱生成和设计控件,反而要花大量的精力用代码动态生成。经过一段时间的编程体验后,会发现动态生成更好控制,更好的根据开发人员的意愿在代码修改属性,而且不容易出一些莫名其妙的bug。但是也并不就是说工具箱可不用,工具箱自然是最简单,最方便的使用方式,如果窗体的控件变化不大,大可以拖来拖去设置属性。
本篇笔记将总结Teechart绘图工具的动态创建和设计方法。介绍其中几个常见功能的动态设计方法,希望能达到举一反三的效果。
一、准备工作
1.新建一个MFC基于dialog的工程TeechartTest。
2.为工程添加一个类,选择来自Typelib的MFC 类,选择TeeChart ActiveX ControlV5,将下面左右的类全部添加进来。(本例中需要用哪个就Include哪个为了学习方便,这样会导致工程比较大。在实际开发时需要用哪个添加哪个。)
3.在TeechartTestDlg.cpp中的初始化函数OnInitDialog里新建个函数TeechartSetup,用来写我们的动态代码。
4.在TeechartTestDlg.h中声明该函数,在TeechartTestDlg.cpp中定义该函数TeechartSetup。
二、动态创建一个Tchart
1.右键工程添加类,与添加其他Teechart类不同,此处选择ActiveX控件中的MFC类。
2.选择TeeChart Pro ActiveXControl V5<1.0>,发现只有一个ITchart,将它添加进来,在工程中多了一个CTChart0类。
3.在Dlg.h中添加#include"CTChart0.h",声明一个对象该类的对象CTChart0 m_tchart;
4.在dlg.cpp中的TeechartSetup里调用Create函数创建表格。我们可以在.h文件中在定义一个CTChart0 m_tchart1,生成两个表格。
CRect rect;
GetClientRect(&rect);
m_tchart.Create(NULL,WS_CHILD|WS_VISIBLE,CRect(0,0,rect.Width(),rect.Height()/2),this,1000);
m_tchart1.Create(NULL,WS_CHILD|WS_VISIBLE,CRect(0,rect.Height()/2,rect.Width(),rect.Height()),this,1001);
三、表格属性设置
1.默认是三维的,想把它改成二维的。在.h文件中添加#include"CAspect.h",在TeechartSetup函数里获取该Aspect,设置View3D为False。
/*设置D/3D显示*/
CAspect m_aspect = m_tchart.get_Aspect(); //得到表体
m_aspect.put_View3D(FALSE); //设置D关闭
2.设置表格标题内容。获取标题需要用到Ctitles和CStrings这两个类。自然先Include这两个头文件。原理是先用chart的get_header获取一个Ctitles对象,再用其成员函数得到其CStrings,通过CStrings设置其内容。注意Add函数变量是variant类型,可以用_variant_t转化即可。
/*设置表格标题内容*/
CTitles m_title = m_tchart.get_Header(); //得到标题
CStrings m_titlestring = m_title.get_Text(); //得到标题内容
m_titlestring.Clear(); //先清除
m_titlestring.Add(_variant_t("MyTest")); //添加新标题
3.设置标题样式。获取其标题Font,用到CTeeFont类。
/*设置表格标题字体样式*/
CTeeFont m_titleFont = m_title.get_Font(); //得到样式
m_titleFont.put_Bold(TRUE); //加粗
m_titleFont.put_Color(RGB(0,0,255)); //颜色
m_titleFont.put_Size(14); //字号
四、动态添加曲线Series
1.添加Series类头文件#include"CSeries.h"
2.调用AddSeries添加曲线。其参数ESeriesClass是曲线类型,见sc宏定义
ESeriesClass
{
scLine = 0,
scBar = 1,
scHorizBar = 2,
scArea = 3,
scPoint = 4,
scPie = 5,
scFastLine = 6,
scShape = 7,
scGantt = 8,
scBubble = 9,
scArrow = 10,
scCandle = 11,
scPolar = 12,
scSurface = 13,
scVolume = 14,
scErrorBar = 15,
scBezier = 16,
scContour = 17,
scError = 18,
scPoint3D = 19,
scRadar = 20,
scClock = 21,
scWindRose = 22,
scBar3D = 23,
scImageBar = 24,
scDonut = 25,
scTriSurface = 26,
scBox = 27,
scHorizBox = 28,
scHistogram = 29,
scColorGrid = 30,
scBarJoin = 31,
scHighLow = 32,
scWaterfall = 33,
scSmith = 34,
scPyramid = 35,
scMap = 36,
scHorizLine = 37,
scFunnel = 38,
scCalendar = 39
3.用CSeries获取曲线对象,调用AddXY添加数据。
/*动态添加曲线Series,并添加数据源进行显示*/
m_teechart.AddSeries(scFastLine); //SC宏定义
CSeries m_series = m_teechart.Series(0);
for (int i=0; i<100; i++)
{
m_series.AddXY(i,rand()%50,NULL,RGB(255,0,0));
}
五、举一反三
是时候举一反三了。
如果你是新手,你应该不知道设置某一个控件需要获取哪些对象(句柄),怎么获得,获得了又该怎么设置。
一个很好的突破口就是Teechart自带的帮助文档,就像所有其他工具的帮助文档一样。打开开始菜单中的teechart tutorials.lnk,也即打开了Teechart的面纱。
那么帮助文档怎么用呢?举个例子:
目的:我们想设置下表格的坐标轴。
我们大概可以直到坐标轴应该累属于表格,也就是说表格类CTChart0应该有其对应的获取函数。模型一般都是get_hanshu。我们可以在CTChart0下找其成员函数,很快就会发现get_Axis,会点英文应该大概直到这跟获取坐标轴对象有关。
我们可以在帮助文档的索引中输入Axis,双击ITchart,可以看到一个鲜活的示例。
可以看到Tchart的确有个Axis对象,也就是有对应的类,而要获取纵轴,它还调用了Left。如果你有点好奇心你肯定点开了property Axis:IAxes看了。
这时,你应该明白了怎么写代码了。如果你还是不知道调用哪个函数。你可以在搜索中输入Axis,点开tutorial 15看看,应该很明确了吧。
按照这个思路,整理代码如下:
/*动态设置坐标轴*/
CAxes m_Axis = m_tchart.get_Axis(); //得到坐标轴
CAxis m_left = m_Axis.get_Left(); //得到纵轴
CAxis m_bottom = m_Axis.get_Bottom(); //得到横轴
m_left.put_Automatic(FALSE); //设置不自动适应
m_left.put_Minimum(0); //设置纵轴起始值
m_left.put_Maximum(100); //设置纵轴结束值
m_left.put_Increment(20); //设置增量
m_left.put_StartPosition(20); //设置起始位置%
m_left.put_EndPosition(80); //设置结束位置%
CAxisTitle m_AxisLeftTitle = m_left.get_Title(); //得到纵轴标题
m_AxisLeftTitle.put_Caption(_T("随机数"));//设置纵轴标题
CAxisTitle m_AxisBottomTitle = m_bottom.get_Title(); //得到横轴标题
m_AxisBottomTitle.put_Caption(_T("时刻")); //设置横轴标题
CTeeFont m_LeftTitleFont = m_AxisLeftTitle.get_Font(); //得到坐标轴样式
m_LeftTitleFont.put_Size(14);
m_LeftTitleFont.put_Bold(TRUE);
CTeeFont m_BottomTitleFont = m_AxisBottomTitle.get_Font(); //得到坐标轴样式
m_BottomTitleFont.put_Size(14);
m_BottomTitleFont.put_Bold(TRUE);
六、还有个方法
找到安装目录下的.\Utilities\New VC Classes文件夹,里面是对应的C++源码。只要把所有文件拷贝到建立的公工程下,并把这些文件添加到工程里,在应用的.h文件里添加你需要的头文件,如#include"tchart.h"。这样在具体设置时就可以直接用“.”了,而且成员函数比较好找。例如:
m_tchart.GetHeader().GetText().Clear();
m_tchart.GetHeader().GetText().Add(_variant_t("MyTest"));
m_tchart.GetHeader().GetFont().SetBold(TRUE);
m_tchart.GetHeader().GetFont().SetSize(20);
但是我觉得这样显得工程比较大。而且比如上面的getfont之后,如果须设置多项,还得重新从头“点”一遍,执行的时候也是从新获取一遍,觉得有点浪费资源。而且从代码长度看也没简便到哪去,可能好的一点就是不用去管get到的是个啥类型的变量了。
Teechart动态设计方法相关推荐
- 科技感的动态设计方法-1
科技感图形的动态表现手法极其多变和丰富.本文只列举常见的设计手法,并试图抽离一些普遍性的设计规律.希望能为大家在实践中提供帮助. 所谓的科技感的动效设计,就是基于科技感风格界面的动态设计.这类界面设计 ...
- 科技感的动态设计方法-2
利用到的方法可以简单的分成两个层次:基本层面上,利用科技感的基本动态形式闪烁和生长:第二个层面上,则要遵守动效设计的普遍规律,即根据控件的具体位置.功能和视觉特点去合理分配它的动态节奏以至于动态曲线设 ...
- mysql 设计动态字段_数据库设计中动态列的设计方法
问题提出: 在进行数据库开发过程中,我们往往会碰到这种情形: 如在劳资计算中,对每个人有很多薪酬项目需要汇总计算出工资,如基本工资,计件工资,计时工资,奖金,补贴,代扣等等,但我们在建表的过程中既不能 ...
- Qt修炼手册2_动态设计
1.去掉UI功能,直接进行设计 头文件:DynamicDialog.h #ifndef DYNAMICDIALOG_H #define DYNAMICDIALOG_H#include <QtWi ...
- Android布局动态化,一种基于堆积木思想的卡片式Android动态布局方法与流程
本发明涉及android界面布局,特别是一种基于堆积木思想的卡片式Android动态布局方法. 背景技术: 在Android流行的今天,android App在生活中使用日益广泛,相对PC,手机由于界 ...
- 计算机个性化定制服务课题,服务网络的构建与面向增量式需求的动态定制方法-计算机科学与技术专业论文.docx...
服务网络的构建与面向增量式需求的动态定制方法-计算机科学与技术专业论文 Classified Index: TP315 U.D.C: 681.3 Dissertation for the Master ...
- 界面设计方法 (1) — 5. 表单功能的设计
表单功能,是4大业务功能(活动.字典.看板和表单)中的最后一个,它是各类订货.收货的凭证,是企业月度.季度和年度统计.分析的重要参考资料,是国家.企业等指定要打印.盖章交付和保存的重要形式,同时也是企 ...
- 界面设计方法 (1) — 4. 看板功能的设计
看板功能,在系统中有非常多的应用,它是用界面做载体,利用数据.图标.曲线.图像等各类形式来展示已完成数据处理结果或是其他信息.常见的有如:系统的门户.导航菜单.各种各样的数据监控仪表盘.领导驾驶舱等. ...
- 新一代纯前端控件集 WijmoJS 2018V2发布,提供 Web 设计器,可动态设计页面并生成代码...
概述 作为一款纯前端控件集,WijmoJS 秉承"快如闪电,触控优先"的设计理念,在提供优质服务和产品的同时,专注于企业应用开发,不断优化产品架构,与时俱进.除在全球率先支持 An ...
最新文章
- 【项目管理】Project使用
- 微信tocken后台后台保存方法
- ITK:均值滤波的图像
- android BitMap回收
- 90年代人们使用计算机,上世纪90年代电脑走进普通家庭 你还记得长什么样吗?
- 导入导出oracle数据库表的dmp文件
- 11张图演进SeviceMesh服务网格
- php默认日志位置,Laravel 修改默认日志文件名称和位置的例子
- java 生成复杂的word_Java 动态生成复杂 Word
- 38. Model has-a or is-implemented-in-terms-of through composition
- mysql的启动脚本编写_老鸟带你开发专业规范的MySQL启动脚本
- 拼多多砍价小程序源码/流量主系列微信小程序源码
- 最著名的数学家一般也是最著名的力学家
- 【python】py课上机作业3「谢尔宾斯基三角形」「递归输出列表」
- 通过追女孩时的常见对话来看你会不会聊天
- 【2023年中国法定节假日的订阅链接】
- 第九章 亚瑟龙的召唤
- 北京大学肖臻老师《区块链技术与应用》公开课笔记-BTC
- mysql如何保证数据不丢失_MySQL如何在非“双一”时保证数据不丢失?
- vscode修改代码颜色
热门文章
- 南航里程每年清空吗_航空里程被盗用,多位明星中招!隐私保护真的这么难吗?...
- 20210903 惯性环节1/(s+1)的各种响应
- Django 执行 makemigrations 显示 No changes detected in app
- OI/ACM 刷题网站 人气OJ简介
- 树莓派-语音聊天机器人+语音控制引脚电平高低
- CodeForces 658C Bear and Forgotten Tree 3(构造)
- LR在安装和卸载问题上的一点总结(转帖)
- .ascx是什么文件?
- vuex modules 命名空间
- 华工软院17级“软件需求分析”课程大作业