• MFC Teechart 绘图控件使用


            TeeChart作为一款强大好用的绘图控件,通过它可以绘制出各式各样的图表,包括2D的,还有3D的,绘制的图表美观实用。

            编写文章中也借用了以下几个博文,和自己研究后的分享:

            Teechart动态设计方法_bjtuwayne的博客-CSDN博客

            怎样在VS2013/MFC中使用TeeChart绘图控件 - Qiengo - 博客园

            MFC绘制图表《TeeChart安装、注册和使用》_qq_39851127的博客-CSDN博客_mfc图表控件 

            本文作者原创,转载请附上文章出处与本文链接。

            TeeChart 安装步骤参考:《TeeChart安装、注册和使用》_欧阳磊的博客-CSDN博客_teechart 该博客,该博客提供的TeeChart 版本为X86版本,在64位环境下会出现报错问题,需要大家找一下64位版本资源,可以先使用32位程序来测试,找到资源后在使用64位版本来发布开发版本;

    MFC Teechart 绘图控件使用目录

    1 3D控件

    1.1 3D标准常用控件

    ​编辑

    1.2 3D其它控件

    1.3 3D扩展控件

    1.4 3D金融控件

    1.5 3D 统计控件

    2 2D控件

    2.1 2D标准常用控件

     2.2 2D其它控件

    2.3 2D扩展控件

     2.4 2D金融控件

    ​编辑

    2.5 2D 统计控件

    3 2D曲线图开发实例

    3.1 MFCApplication1Dlg.h

    3.2 MFCApplication1Dlg.cpp

    4 下载链接


    1 3D控件

    1.1 3D标准常用控件

    1.2 3D其它控件

     

    1.3 3D扩展控件

    1.4 3D金融控件

    1.5 3D 统计控件

    2 2D控件

    2.1 2D标准常用控件

     

     2.2 2D其它控件

    2.3 2D扩展控件

     2.4 2D金融控件

    2.5 2D 统计控件

    3 2D曲线图开发实例

    3.1 MFCApplication1Dlg.h

    1. #pragma once
    2. #include "CSeries.h"
    3. #include "COCX.h"
    4. #include
    5. using namespace std;
    6. // CMFCApplication1Dlg 对话框
    7. class CMFCApplication1Dlg : public CDialogEx
    8. {
    9. // 构造
    10. public:
    11. CMFCApplication1Dlg(CWnd* pParent = nullptr); // 标准构造函数
    12. // 对话框数据
    13. #ifdef AFX_DESIGN_TIME
    14. enum { IDD = IDD_MFCAPPLICATION1_DIALOG };
    15. #endif
    16. protected:
    17. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
    18. // 实现
    19. protected:
    20. HICON m_hIcon;
    21. // 生成的消息映射函数
    22. virtual BOOL OnInitDialog();
    23. afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    24. afx_msg void OnPaint();
    25. afx_msg HCURSOR OnQueryDragIcon();
    26. DECLARE_MESSAGE_MAP()
    27. public:
    28. int i_test;
    29. vector<double> ViewDataRecordy;
    30. vector ViewDataRecordTime;
    31. double m_dataRecordx[10];
    32. double m_dataRecordY[10];
    33. CSeries data1;
    34. CSeries data2;
    35. CTChart1 m_Teechart;
    36. CTChart1 m_Teechart2;
    37. afx_msg void OnBnClickedButton1();
    38. void SetViewClear();
    39. afx_msg void OnBnClickedButton2();
    40. };

    3.2 MFCApplication1Dlg.cpp

    1. // MFCApplication1Dlg.cpp: 实现文件
    2. //
    3. #include "pch.h"
    4. #include "framework.h"
    5. #include "MFCApplication1.h"
    6. #include "MFCApplication1Dlg.h"
    7. #include "afxdialogex.h"
    8. #ifdef _DEBUG
    9. #define new DEBUG_NEW
    10. #endif
    11. // 用于应用程序“关于”菜单项的 CAboutDlg 对话框
    12. class CAboutDlg : public CDialogEx
    13. {
    14. public:
    15. CAboutDlg();
    16. // 对话框数据
    17. #ifdef AFX_DESIGN_TIME
    18. enum { IDD = IDD_ABOUTBOX };
    19. #endif
    20. protected:
    21. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
    22. // 实现
    23. protected:
    24. DECLARE_MESSAGE_MAP()
    25. };
    26. CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
    27. {
    28. }
    29. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    30. {
    31. CDialogEx::DoDataExchange(pDX);
    32. }
    33. BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
    34. END_MESSAGE_MAP()
    35. // CMFCApplication1Dlg 对话框
    36. CMFCApplication1Dlg::CMFCApplication1Dlg(CWnd* pParent /*=nullptr*/)
    37. : CDialogEx(IDD_MFCAPPLICATION1_DIALOG, pParent)
    38. {
    39. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    40. }
    41. void CMFCApplication1Dlg::DoDataExchange(CDataExchange* pDX)
    42. {
    43. CDialogEx::DoDataExchange(pDX);
    44. DDX_Control(pDX, IDC_TCHART1, m_Teechart);
    45. DDX_Control(pDX, IDC_TCHART2, m_Teechart2);
    46. }
    47. BEGIN_MESSAGE_MAP(CMFCApplication1Dlg, CDialogEx)
    48. ON_WM_SYSCOMMAND()
    49. ON_WM_PAINT()
    50. ON_WM_QUERYDRAGICON()
    51. ON_BN_CLICKED(IDC_BUTTON1, &CMFCApplication1Dlg::OnBnClickedButton1)
    52. ON_BN_CLICKED(IDC_BUTTON2, &CMFCApplication1Dlg::OnBnClickedButton2)
    53. END_MESSAGE_MAP()
    54. // CMFCApplication1Dlg 消息处理程序
    55. BOOL CMFCApplication1Dlg::OnInitDialog()
    56. {
    57. CDialogEx::OnInitDialog();
    58. // 将“关于...”菜单项添加到系统菜单中。
    59. // IDM_ABOUTBOX 必须在系统命令范围内。
    60. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    61. ASSERT(IDM_ABOUTBOX < 0xF000);
    62. CMenu* pSysMenu = GetSystemMenu(FALSE);
    63. if (pSysMenu != nullptr)
    64. {
    65. BOOL bNameValid;
    66. CString strAboutMenu;
    67. bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
    68. ASSERT(bNameValid);
    69. if (!strAboutMenu.IsEmpty())
    70. {
    71. pSysMenu->AppendMenu(MF_SEPARATOR);
    72. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    73. }
    74. }
    75. // 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
    76. // 执行此操作
    77. SetIcon(m_hIcon, TRUE); // 设置大图标
    78. SetIcon(m_hIcon, FALSE); // 设置小图标
    79. data1 = (CSeries)m_Teechart.Series(0);
    80. data2 = (CSeries)m_Teechart2.Series(0);
    81. return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
    82. }
    83. void CMFCApplication1Dlg::OnSysCommand(UINT nID, LPARAM lParam)
    84. {
    85. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    86. {
    87. CAboutDlg dlgAbout;
    88. dlgAbout.DoModal();
    89. }
    90. else
    91. {
    92. CDialogEx::OnSysCommand(nID, lParam);
    93. }
    94. }
    95. // 如果向对话框添加最小化按钮,则需要下面的代码
    96. // 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
    97. // 这将由框架自动完成。
    98. void CMFCApplication1Dlg::OnPaint()
    99. {
    100. if (IsIconic())
    101. {
    102. CPaintDC dc(this); // 用于绘制的设备上下文
    103. SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);
    104. // 使图标在工作区矩形中居中
    105. int cxIcon = GetSystemMetrics(SM_CXICON);
    106. int cyIcon = GetSystemMetrics(SM_CYICON);
    107. CRect rect;
    108. GetClientRect(&rect);
    109. int x = (rect.Width() - cxIcon + 1) / 2;
    110. int y = (rect.Height() - cyIcon + 1) / 2;
    111. // 绘制图标
    112. dc.DrawIcon(x, y, m_hIcon);
    113. }
    114. else
    115. {
    116. CDialogEx::OnPaint();
    117. }
    118. }
    119. //当用户拖动最小化窗口时系统调用此函数取得光标
    120. //显示。
    121. HCURSOR CMFCApplication1Dlg::OnQueryDragIcon()
    122. {
    123. return static_cast(m_hIcon);
    124. }
    125. void CMFCApplication1Dlg::OnBnClickedButton2()
    126. {
    127. CTime tim = CTime::GetCurrentTime(0);
    128. CString time = tim.Format("%H:%M:%S");
    129. if (ViewDataRecordTime.size() == 12)
    130. {
    131. vector::iterator iterTime;
    132. iterTime = ViewDataRecordTime.begin();
    133. ViewDataRecordTime.erase(iterTime);
    134. ViewDataRecordTime.push_back(time);
    135. }
    136. else if (ViewDataRecordTime.size() < 12)
    137. {
    138. ViewDataRecordTime.push_back(time);
    139. }
    140. else
    141. {
    142. ViewDataRecordTime.clear();
    143. }
    144. if (ViewDataRecordy.size() == 12)
    145. {
    146. vector<double>::iterator iter;
    147. iter = ViewDataRecordy.begin();
    148. ViewDataRecordy.erase(iter);
    149. ViewDataRecordy.push_back(i_test);
    150. }
    151. else if (ViewDataRecordy.size() < 12)
    152. {
    153. ViewDataRecordy.push_back(i_test);
    154. }
    155. else {
    156. ViewDataRecordy.clear();
    157. }
    158. i_test++;
    159. }
    160. void CMFCApplication1Dlg::OnBnClickedButton1()
    161. {
    162. SetViewClear();
    163. int jx = 0;
    164. int jy = 0;
    165. if (ViewDataRecordy.size() != 0 && ViewDataRecordTime.size() !=0)
    166. {
    167. int itestx = ViewDataRecordy.size() + 1;
    168. for (jx = 0; jx < itestx; jx++)
    169. {
    170. if (jx == 0)
    171. {
    172. data1.AddXY(0, 0, "0:0:0", NULL);
    173. }
    174. else
    175. {
    176. data1.AddXY((double)jx, (ViewDataRecordy[jx-1] + ViewDataRecordy[jx-1] * 0.1), ViewDataRecordTime[jx-1], NULL);
    177. }
    178. }
    179. for (jy = 0; jy < 24; jy++)
    180. {
    181. data2.AddXY((double)jy, (jy + jy * 0.1), NULL, NULL);
    182. }
    183. }
    184. }
    185. void CMFCApplication1Dlg::SetViewClear()
    186. {
    187. int count_line = 0;
    188. int count_line2 = 0;
    189. //在画线之前把图形清除一下,否则会覆盖,清除可用CSeries的函数Clear();
    190. //但是当添加多个Series后要对所有Series都clear,这是很蛋疼的,
    191. //因为你有时都不知道有多少个Series,这样可以先获得Series的总数在clear代码如下
    192. count_line = m_Teechart.get_SeriesCount();
    193. count_line2 = m_Teechart2.get_SeriesCount();
    194. for (long i = 0; i < count_line; i++)
    195. {
    196. ((CSeries)m_Teechart.Series(0)).Clear();
    197. }
    198. for (long i = 0; i < count_line; i++)
    199. {
    200. ((CSeries)m_Teechart2.Series(0)).Clear();
    201. }
    202. }

    4 下载链接

    出自《TeeChart安装、注册和使用》_欧阳磊的博客-CSDN博客_teechart 一文

    百度网盘链接:百度网盘 请输入提取码
    提取码:6k74 

     本文Demo下载地址: MFCTeechart绘图控件使用-C++文档类资源-CSDN下载

  • 相关阅读:
    Win7批量执行Python文件
    计算机毕业设计选题推荐-个人健康微信小程序/安卓APP-项目实战
    ICC2: keepout、spacing_rules、clock_cell_spacing
    Java图片验证码的实现方法
    Log4j日志框架多种日志级别
    弘辽科技:100块的直通车,怎么开?电商运营新手篇
    智慧公厕助力数字强市建设,打造善感知新型信息化公共厕所
    力扣leetcode算法-二分查找
    JUC下的常用类
    computed计算属性和watch侦听属性
  • 原文地址:https://blog.csdn.net/qq_37529913/article/details/125902226