MFC画折线图,基于x64系统

由于项目的需要,需要画一个折线图。

传统的Teechart、MSChart、HighSpeedChart一般是只能配置在x86系统下,等到使用x64系统下运行就是会报出不知名的错误,这个地方让人很苦恼。

我在进行配置的过程之中,使用Teechart将x86配置好了,可以正常使用,但是嫁接到x64系统下就不可以使用了。HighSpeedChart也是同样在x64系统下使用会出现如下错误,并且在进行设置x轴的时候,x轴类型只能是int类型,贼其难用。配置了半天结果x64位用不了,x64系统真的不建议使用上述控件方式。

经过长时间的思索,还是直接用代码画一个吧,配置环境过于困难。

首先拉出一个Picture Control控件,然后将其ID进行更改为IDC_PIC_CTRL

在自己的.h文件之中进行定义变量

    CStatic m_PicCtrl2;CRect m_rect;

然后在相应的按钮下进行功能的定义(以依次修改按钮为例)

// TODO: 在此添加控件通知处理程序代码
int click = 6;
std::vector<CString> use;
std::vector<std::string> xAxisLabels = { "0"};
std::vector<double> yAxisValues = { 0 };void CMFCApplication2Dlg::OnBnClickedButton5()
{CPaintDC dc(this); // 使用设备上下文绘制// 清空窗口CRect rect;GetClientRect(&rect); // 获取绘制区域大小dc.FillSolidRect(rect, RGB(255, 255, 255)); // 填充白色背景// 绘制图形的代码// ...CWnd* pWnd = GetDlgItem(IDC_PIC_CTRL); // 获取Picture Control的指针pWnd->GetClientRect(&rect); // 获取绘制区域大小CDC* pDC = pWnd->GetDC(); // 获取绘图设备上下文// 绘制背景pDC->FillSolidRect(rect, RGB(255, 255, 255));// 设置坐标轴参数int marginX = rect.Width() / 8.0;int marginY = rect.Height() / 8.0;time_t now = time(0);tm* localTime = localtime(&now);char buffer[80];strftime(buffer, 80, "%Y-%m-%d 仰角角度测量试验", localTime);CString cstringTime(buffer);CString chartTitle = (cstringTime) ;CString xAxisTitle = _T("时间(时:分:秒)");CString yAxisTitle = _T("角度(°)");// 绘制横轴线和纵轴线pDC->MoveTo(rect.left + marginX + 3, rect.bottom - marginY * 1.5);pDC->LineTo(rect.right - marginX, rect.bottom - marginY * 1.5);pDC->MoveTo(rect.left + marginX, rect.top + marginY * 1.5);pDC->LineTo(rect.left + marginX, rect.bottom - marginY * 1.5 - 3);// 绘制箭头线/*pDC->MoveTo(rect.right - marginX, rect.bottom - marginY * 1.5);pDC->LineTo(rect.right - marginX - 6.0, rect.bottom - marginY * 1.5 - 6.0);pDC->MoveTo(rect.right - marginX, rect.bottom - marginY * 1.5);pDC->LineTo(rect.right - marginX - 6.0, rect.bottom - marginY * 1.5 + 6.0 );*/// 绘制坐标轴标题pDC->SetBkMode(TRANSPARENT);// 设置大标题文本颜色pDC->SetTextColor(RGB(0, 0, 255)); // 深蓝色// 设置大标题文本粗细CFont font;font.CreateFont(16, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, _T("Arial")); // 创建一个16像素的粗体Arial字体pDC->SelectObject(&font); // 设置字体pDC->TextOut(rect.Width() / 2, rect.bottom - marginY * 0.5, chartTitle);//大标题// 设置大标题文本颜色pDC->SetTextColor(RGB(0, 0, 0)); // 黑色pDC->TextOut(rect.left + (double)marginX * 7.2, rect.bottom - marginY * 1.6, xAxisTitle);//x轴标题pDC->TextOut(rect.left + marginX - 30, rect.top + marginY / 2, yAxisTitle);//Y轴标题//std::vector<std::string> xAxisLabels = { "0","北京", "上海", "南京" };//std::vector<double> yAxisValues = { 0,0.2, 0.5, 1.8 };std::string currentTime = getCurrentTimeAsString();//点击次数增加if (yAxisValues.size() == 1){xAxisLabels.push_back(currentTime);yAxisValues.push_back(2.2);}else if (yAxisValues.size() == 2){xAxisLabels.push_back(currentTime);yAxisValues.push_back(4.2);}else if (yAxisValues.size() == 3){xAxisLabels.push_back(currentTime);yAxisValues.push_back(1.2);}else if (yAxisValues.size() == 4){xAxisLabels.push_back(currentTime);yAxisValues.push_back(2.2);}else if (yAxisValues.size() == 5){xAxisLabels.push_back(currentTime);yAxisValues.push_back(6.2);}else if (yAxisValues.size() == 6){xAxisLabels.push_back(currentTime);yAxisValues.push_back(5.2);}else{//当点击次数大于六次xAxisLabels.erase(xAxisLabels.begin());yAxisValues.erase(yAxisValues.begin());xAxisLabels.push_back(currentTime);yAxisValues.push_back(8.2);}int numPoints = yAxisValues.size();int xInterval = (rect.Width() - 2 * marginX) / (numPoints - 1);//x轴间隔int yInterval = (rect.Height() - 2 * marginY) / (13 - 1);//y轴间隔   这个地方的是纵轴的最大数量// 绘制横轴标签刻度for (int i = 0; i < numPoints; i++){int x = rect.left + marginX + i * xInterval;CPen pen;pen.CreatePen(PS_SOLID, 1, RGB(0, 0, 210)); // 创建一个红色的实线画笔pDC->SelectObject(&pen); // 设置画笔pDC->MoveTo(x, rect.bottom - marginY * 1.5); //横轴小标记pDC->LineTo(x, rect.bottom - marginY * 1.5 + 5);pDC->TextOut(x - 10, rect.bottom - marginY * 1.5 + 10, CString(xAxisLabels[i].c_str()));}//将最大的值进行/12操作,for (int i = 0; i < 13; i++)//重新绘制纵轴  这个地方的8是最大值{// 寻找最大值的迭代器auto maxIt = std::max_element(yAxisValues.begin(), yAxisValues.end());double maxValue;// 如果找到了最大值,则打印它if (maxIt != yAxisValues.end()){maxValue = *maxIt;}CPen pen;pen.CreatePen(PS_SOLID, 1, RGB(0, 0, 210)); // 创建一个红色的实线画笔pDC->SelectObject(&pen); // 设置画笔double y = (double)(rect.bottom) - (double)marginY * 1.5 - ((double)10.0 / (double)12.0 * (double)i) * (double)yInterval; //根据实际大小进行设定  这个地方需要注意yInterval变量与pDC->MoveTo(rect.left + marginX, y);     //纵轴小标记pDC->LineTo(rect.left + marginX - 5, y);double value = (maxValue / (double)12.0) * (double)i; // 假设i是一个整数变量std::stringstream ss;ss << std::fixed << std::setprecision(4) << value;std::string strValue = ss.str();CString cstrValue(strValue.c_str());pDC->TextOut(rect.left + marginX * 0.8 - 30, y - 5, cstrValue);}// 绘制折线for (int i = 0; i < numPoints - 1; i++){int x1 = rect.left + marginX + i * xInterval;int y1 = rect.bottom - marginY * 1.5 - (yAxisValues[i]*12.0/10.0) * yInterval;int x2 = rect.left + marginX + (i + 1) * xInterval;int y2 = rect.bottom - marginY * 1.5 - (yAxisValues[i + 1]*12.0/10.0) * yInterval;CPen pen;pen.CreatePen(PS_SOLID, 1, RGB(125, 0, 0)); // 创建一个红色的实线画笔pDC->SelectObject(&pen); // 设置画笔pDC->MoveTo(x1, y1);pDC->LineTo(x2, y2);pDC->SetTextColor(RGB(255, 0, 0)); // 深蓝色//绘制数值pDC->TextOut(x2 - 8, y2 - 20, CString(std::to_string(yAxisValues[i+1]).c_str()));//这个地方的标记需要变成4个小数点}pWnd->ReleaseDC(pDC);
}

在使用上述代码的时候需要进行头文件的引入


#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
#include <atlstr.h>#include <iostream>
#include <ctime>
#include <cstring>#include <iostream>
#include <sstream>
#include <chrono>
using namespace std;

最后测试的展示情况是如下所示:

上述的依次添加按钮是按下一次,添加一个折现,只是个示例的过程,也可以改为实时动态的过程,只要添加个定时器就可以了,比较简单。关于界面部分,自己进行修改修改,进行美化一下就可以使用了。上述代码比较通俗易懂,按照自己的逻辑写的。

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

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

相关文章

【Qt5】ui文件最后会变成头文件

2023年12月14日&#xff0c;周四下午 我也是今天下午偶然间发现这个的 在使用Qt的uic&#xff08;User Interface Compiler&#xff09;工具编译ui文件时&#xff0c;会生成对应的头文件。 在Qt中&#xff0c;ui文件是用于描述用户界面的XML文件&#xff0c;而头文件是用于在…

【C语言(十二)】

数据在内存中的存储 一、整数在内存中的存储 整数的2进制表示方法有三种&#xff0c;即 原码、反码和补码 有符号的整数&#xff0c;三种表示方法均有符号位和数值位两部分&#xff0c;符号位都是用0表示“正”&#xff0c;用1表示“负”&#xff0c;最高位的⼀位是被当做符号…

NNDL 作业10 BPTT

习题6-1P 推导RNN反向传播算法BPTT. 我的推导 和PPT结果对比&#xff0c;可得答案没问题 习题6-2 推导公式(6.40)和公式(6.41)中的梯度&#xff0e; 习题6-3 当使用公式(6.50)作为循环神经网络的状态更新公式时&#xff0c; 分析其可能存在梯度爆炸的原因并给出解决方法&…

【Spring的AOP】Spring的简介、案例与工作流程

文章目录 1. 什么是AOP2. AOP的核心概念3. AOP的入门案例原始代码思路分析第一步&#xff1a;导入坐标第二步&#xff1a;制作连接点&#xff08;原始操作&#xff0c;Dao接口与实现类&#xff09;第三步&#xff1a;制作共性功能&#xff08;通知类与通知&#xff09;第四步&a…

继续看回溯问题

关卡名 继续看回溯问题 我会了✔️ 内容 1.复习递归和N叉树&#xff0c;理解相关代码是如何实现的 ✔️ 2.理解回溯到底怎么回事 ✔️ 3.掌握如何使用回溯来解决二叉树的路径问题 ✔️ 1 复原IP地址 这也是一个经典的分割类型的回溯问题。LeetCode93.有效IP地址正好由四…

TrustZone之完成器:外围设备和内存

到目前为止,在本指南中,我们集中讨论了处理器,但TrustZone远不止是一组处理器功能。要充分利用TrustZone功能,我们还需要系统其余部分的支持。以下是一个启用了TrustZone的系统示例: 本节探讨了该系统中的关键组件以及它们在TrustZone中的作用。 完成器:外围设备…

概念解读稳定性保障

什么是稳定 百度百科关于稳定的定义&#xff1a; “稳恒固定&#xff1b;没有变动。” 很明显这里的“稳定”是相对的&#xff0c;通常会有参照物&#xff0c;例如 A 车和 B 车保持相同速度同方向行驶&#xff0c;达到相对平衡相对稳定的状态。 那么软件质量的稳定是指什么…

PhotoMaker——通过堆叠 ID 嵌入定制逼真的人像照片

论文网址链接&#xff1a;https://arxiv.org/abs/2312.04461 详情网址链接&#xff1a;PhotoMaker 开源代码网址链接&#xff1a;GitHub - TencentARC/PhotoMaker: PhotoMaker 文本到图像AI生成的最新进展在根据给定文本提示合成逼真的人类照片方面取得了显着进展。然而&#…

UDS DTC老化机制

文章目录 简介基本概念1、操作周期(Operation Cyle)2、错误计数(FDC, Fault Detection Counter)3、确认阈值(Confirmation Threshold)4、老化计数(Aging Counter)5、老化阈值(Aging Threshold) 老化条件非排放 DTC 示例参考 简介 当某个DTC在一定次数的操作循环内&#xff0c;…

蓝桥杯专题-真题版含答案-【扑克牌排列】【放麦子】【纵横放火柴游戏】【顺时针螺旋填入】

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

mac电脑html文件 局域网访问

windows html文件 局域网访问 参考 https://blog.csdn.net/qq_38935512/article/details/103271291mac电脑html文件 局域网访问 开发工具vscode 安装vscode插件 Live Server 完成后打开项目的html 右键使用Live Server打开页面 效果如下&#xff0c;使用本地ip替换http://12…

湖农大邀请赛shell_rce漏洞复现

湖农大邀请赛 shell_rce 复现 在 2023 年湖南农业大学邀请赛的线上初赛中&#xff0c;有一道 shell_rce 题&#xff0c;本文将复现该题。 题目内容&#xff0c;打开即是代码&#xff1a; <?phpclass shell{public $exp;public function __destruct(){$str preg_replace…