【MFC】模拟采集系统——数据绘制(19)

news2024/9/28 9:27:14

完成界面设计后,数据绘制也可以按照对MFC类派生来完成,值得注意的是这里的数据绘制仅仅是通过随机产生的数据来显示,并且显示的方法也有很多。

数据绘制

在主对话框中添加两个 Picture Control 位置大小任意,可以设置一下外观(加边框等)

修改两个控件的ID ,如:IDC_SHOW1 、  IDC_SHOW2 

添加对CStatic的派生类:

为了简化,所有数据显示等操作都在该类中完成,也就是说,主对话只负责两个显示控件位置大小的设置,左对话框中的启动、停止等按钮控制控件的显示和隐藏,以及动态数据的产生。而所有的绘制和动态显示的功能都在该类中完成,代码如下:

#pragma once


// CDataShowStatic

class CDataShowStatic : public CStatic
{
	DECLARE_DYNAMIC(CDataShowStatic)

public:
	CDataShowStatic();
	virtual ~CDataShowStatic();
	CBitmap m_tempBitmap;
	CDC *tempDC;
	CRect rect;
	
	int Data[250];
	int cx;
	CPen *oldPen,*redPen,*greenPen;
	void Init();
	void DrawLoc();
	void DrawData();
    void Show(bool flag = true);
protected:
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnPaint();
	afx_msg void OnTimer(UINT_PTR nIDEvent);
};


 

// DataShowStatic.cpp : 实现文件
//

#include "stdafx.h"
#include "MFC09.h"
#include "DataShowStatic.h"


// CDataShowStatic

IMPLEMENT_DYNAMIC(CDataShowStatic, CStatic)

CDataShowStatic::CDataShowStatic()
{
	redPen = new CPen;
	redPen->CreatePen(PS_SOLID,1,RGB(255,0,0));
	greenPen = new CPen;
	greenPen->CreatePen(PS_DOT,1,RGB(0,255,255));
}

CDataShowStatic::~CDataShowStatic()
{
}


BEGIN_MESSAGE_MAP(CDataShowStatic, CStatic)
	ON_WM_PAINT()
	ON_WM_TIMER()
END_MESSAGE_MAP()



// CDataShowStatic 消息处理程序




void CDataShowStatic::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	// TODO: 在此处添加消息处理程序代码
	// 不为绘图消息调用 CStatic::OnPaint()
}
void CDataShowStatic::Init()
{	
	::srand(::time(0));
	CClientDC dc(this);	
	this->GetClientRect(&rect);	
	m_tempBitmap.CreateCompatibleBitmap(&dc,rect.right,rect.bottom);
	tempDC = new CDC;
	tempDC->CreateCompatibleDC(&dc);
	tempDC->SelectObject(&m_tempBitmap);
	cx = 0;
}
void CDataShowStatic::DrawLoc()
{	
    this->GetClientRect(&rect);
	int cx = 100;
	tempDC->PatBlt(0,0,rect.right,rect.bottom,BLACKNESS);
    oldPen = tempDC->SelectObject(greenPen);
	tempDC->MoveTo(0,100);
	tempDC->LineTo(rect.right,100);
	 tempDC->SelectObject(oldPen);
}
void CDataShowStatic::DrawData()
{
	int d = rand() % 150 - 75;
	int i;
	if(cx < 249) Data[cx++] = d;
	else
	{
		for(i = 0; i < 249; i++)
		{
			Data[i]=Data[i+1];
		}
		Data[249]=d;
		cx = 250;
	}
	oldPen = tempDC->SelectObject(redPen);
	tempDC->MoveTo(0,100);
	for(i = 0; i < 249; i++)
	{
       tempDC->LineTo(i * 2,100 - Data[i]);
	}
	 tempDC->SelectObject(oldPen);
}
void CDataShowStatic::Show(bool flag)
{
	if(flag)
		this->SetTimer(1,50,NULL);
	else
		this->KillTimer(1);
}

void CDataShowStatic::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	DrawLoc();
	DrawData();
    CClientDC dc(this); 
	this->GetClientRect(&rect);
	
    dc.BitBlt(0,0,rect.right,rect.bottom,tempDC,0,0,SRCCOPY);
	CStatic::OnTimer(nIDEvent);
}

其中 OnPaint 和 OnTimer 是在类向导中对重绘和定时消息的相应函数。

主对话框中添加控件,手动修改为上面的类:

 初始化函数中添加对两个控制位置大小以及初始化处理:

BOOL CMFC09Dlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
    ......  //前面范例处理代码
	
	m_show1.MoveWindow(210, 80,cx-215,220,0);
	m_show1.Init();
	m_show1.ShowWindow(SW_HIDE);
	m_show1.UpdateData();
	
	
	m_show2.MoveWindow(210,320,cx-215,220,0);
	m_show2.Init();
	m_show2.ShowWindow(SW_HIDE);
	m_show2.UpdateData();

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

左对话框中进行简单控制:

 

 代码如下:


void CLeftDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	if(IS_Start) return;
	CMFC09Dlg *wnd =(CMFC09Dlg *) this->GetParent();
	wnd->m_show1.ShowWindow(SW_SHOW);
	wnd->m_show1.Show();
	wnd->m_show2.ShowWindow(SW_SHOW);
	wnd->m_show2.Show();
	IS_Start = true;
}


void CLeftDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	if(!IS_Start) return;
	CMFC09Dlg *wnd =(CMFC09Dlg *) this->GetParent();
	wnd->m_show1.Show(false);
	wnd->m_show2.Show(false);
	IS_Start = false;
}


void CLeftDlg::OnBnClickedButton4()
{
	// TODO: 在此添加控件通知处理程序代码
	CMFC09Dlg *wnd =(CMFC09Dlg *) this->GetParent();
	wnd->PostMessage(WM_CLOSE,0,0);
}


void CLeftDlg::OnBnClickedButton3()
{
	// TODO: 在此添加控件通知处理程序代码
}

获取主对话框指针,从而对显示控件的控制(隐藏、显示、停止动态产生数据等)。

运行如下:

 完成该系统的目的:

1、熟悉MFC的图形操作,GDI 和CDC;

2、掌握对MFC提供的图形控件的派生,拓展MFC控件的功能;

3、掌握MFC的界面设计以及消息响应,解决 “ 在哪里写代码 “ (消息响应)的问题,以及锻炼界面设计的能力。

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

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

相关文章

Python3 数据结构实例及演示

本章节主要结合前面所学的知识点来介绍Python数据结构。 列表 Python中列表是可变的&#xff0c;这是它区别于字符串和元组的最重要的特点&#xff0c;1句话概括即&#xff1a;列表可以修改&#xff0c;而字符串和元组不能。 以下是 Python 中列表的方法&#xff1a; 下面示…

阿里云服务器部署前后端分离项目

阿里云服务器部署 【若依】 前后端分离项目 文章目录一、域名解析二、服务器操作系统置空三、部署方式四、需安装环境配置五、Linux服务器安装相应内容&#xff08;具体安装步骤&#xff09;&#xff08;一&#xff09;安装JDK&#xff08;3种方式&#xff09;使用Yum安装&…

Assignment写作各个部分怎么衔接完美?

Assignment格式很简单&#xff0c;就只有四个部分&#xff0c;按着通用的套路来&#xff0c;发现也没什么难度。不过这4个部分自己需要衔接完美&#xff0c;下面就给大家分享一下写Assignment最简单的方法。 如果没有目录可以放在第一页的开头&#xff0c;用“标题字体”加重显…

互联网大厂Java岗最全八股文面试1100道真题汇总,堪称2023年面试天花板

2023 年的互联网行业竞争越来越严峻&#xff0c;面试也是越来越难&#xff0c;一直以来我都想整理一套完美的面试宝典&#xff0c;奈何难抽出时间&#xff0c;这套 1100道的 Java 面试手册是行业内各大神联合总结出来的&#xff0c;上传到 Git 上目前 star 数达到了 30K 这套互…

POE指数积公式的简单matlab实现

参考现代机器人学 及机器人工程师进阶之路&#xff08;八&#xff09;指数积&#xff08;PoE&#xff09;建立机械臂模型及正运动 1.使用Robotics在matlab中建立一个简单的机械臂&#xff0c;方便验证后面的代码写的对不对 %Robotics 工具箱介绍&#xff1a; https://blog.csd…

【使用secureCRT管理Linux系统】

使用secureCRT管理Linux系统 进入secureCRT快速连接虚拟机 默认是SSH2类型&#xff0c;红线是虚拟机的ip地址&#xff0c;绿线是虚拟机的用户名称 如果之后的页面出现了需要输入用户密码&#xff0c;那就是成功了&#xff0c;如果出现了Connection timed out 可能原因是电脑…

Spring如何整合MyBatis框架?使用XML及java类的配置方式

前言 Spring文章链接: 从头到尾Spring概念&#xff0c;家族&#xff0c;核心技术使用&#xff0c;事务这一篇就够了&#xff01;&#xff01;&#xff01;_千小半的博客-CSDN博客_spring最新技术 mybatis文章链接: MyBatis框架入门(含实例)_mybatis sqlsession创建和关闭_千小…

文华财经期货日内多空金叉波段彩带幅图指标公式,震荡区间决策预警信号指标公式

​期货指标公式不是交易的圣杯&#xff0c;也不是期货亏损后的救命稻草。请理性运用指标公式&#xff0c;独立决策&#xff0c;盈亏自负。 1.在期货交易中&#xff0c;大部分品种&#xff0c;大部分时间都是在走一个趋势行情。即使是形态内的震荡行情&#xff0c;也是在走一个…

redis 实现延迟队列及其他实现延迟队列

1、 前言 1.1、什么是延迟队列&#xff1f; 延时队列相比于普通队列最大的区别就体现在其延时的属性上&#xff0c;普通队列的元素是先进先出&#xff0c;按入队顺序进行处理&#xff0c;而延时队列中的元素在入队时会指定一个延迟时间&#xff0c;表示其希望能够在经过该指定…

虹科新品|HK-Edgility敏捷边缘计算套件

敏捷、经济高效且易于管理大规模IT服务基础设施 业务动态和数字化转型将业务资源和业务用户都推到了传统 IT 边界之外。业务资源和服务被虚拟化并迁移到云端。随着数字工作空间的发展和业务用户需要随时随地访问业务资源&#xff0c;越来越多的业务资源被推向网络边缘。 由于…

研报精选230216

目录 【行业230216东吴证券】环保行业月报&#xff1a;2023M1环卫新能源渗透率大增至11.91%&#xff0c;上海地区渗透率高达77%【行业230216国元证券】国元新食饮&#xff1a;一图君&#xff1a;22年白酒产量&#xff1a;同降6.2%【行业230216浙商证券】农林牧渔点评报告&#…

认识数据库

今天为大家带来数据库的知识 &#x1f680;1.什么是数据库 &#x1f680;2.数据库的分类 &#x1f680;3.数据库的存储 1.首先来聊一聊MySQL数据库的定义 已经学习了数据结构 数据结构是一门研究数据如何存储的学科&#xff0c;当数据是少量的时候&#xff0c;用数据结构…

在vue2使用百度脑图的kityminder-core进行二次开发思维导图,给节点绑定数据后添加新的图标

需求说明&#xff1a;在给某个节点绑定文件数据后&#xff0c;用户并不能一眼看出哪个节点上绑定了数据&#xff0c;因此需要在绑定文件数据后给节点上加一个图标用于标识。 添加图标 1、在kityminder-core/src/module/file.js文件中添加代码 &#xff08;file.js文件如何添加…

ChatGPT国内镜像站初体验:聊天、Python代码生成等

ChatGPT国内镜像站试用&#xff0c;聊天、Python代码生成。 (本文获得CSDN质量评分【92】)【学习的细节是欢悦的历程】Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单…… …

基于离散时间频率增益传感器的P级至M级PMU模型的实现(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…

[足式机器人]Part3机构运动微分几何学分析与综合Ch01-4 平面运动微分几何学——【读书笔记】

本文仅供学习使用 本文参考&#xff1a; 《机构运动微分几何学分析与综合》-王德伦、汪伟 《微分几何》吴大任 Ch01-4 平面运动微分几何学1.2.3-2 点轨迹的Euler-Savary公式1.2.4 高阶曲率理论1.2.3-2 点轨迹的Euler-Savary公式 例1-7&#xff1a; 平面曲柄摇杆机构的 Euler-Sa…

VS中scanf为什么会报错

简单来讲&#xff0c;scanf会强行输入内容&#xff0c;所以是不安全的。 我们来看这样的例子&#xff1a; #include <iostream> using namespace std;int main() {char demo[3];scanf("%s", demo);return 0; }对于以上代码&#xff0c;当我们输入字符不超过3时…

联合身份验证与Cognito

Hello大家好&#xff0c;我们接下来讨论AWS联合身份验证的内容。 AWS联合身份验证 对于考试&#xff0c;联合身份验证部分是一块非常重要的内容。那什么是联合身份验证&#xff0c;它是做什么用的呢&#xff1f; 联合身份验证&#xff0c;是用来允许AWS外部用户&#xff0c;如…

vue2中使用 Tinymce 5.1.0使用过程举例

一、背景 vue-cli 版本 &#xff1a;vue/cli 4.5.15 查看脚手架版本的方法&#xff1a;Win R 打开运行输入&#xff1a; cmd &#xff0c;打开控制台输入 vue -V vue 版本&#xff1a;"vue": "^2.6.11", 二、安装 Tinymce 1、 --no-fund 是因为提示你…

C语言(表达式,语句和副作用和序列号)

目录 一.表达式 二.语句 三.副作用和序列点 一.表达式 由运算符和运算对象组合。最简单得表达式是一个单独的运算对象&#xff0c;以次为基础可以建立复杂的表达式 4 421 a*&#xff08;b c/d)/20 运算对象可以是常量&#xff0c;变量或二者得组合。一些表达式由子表达…