求助-关于如何创建时间坐标可移动的画图窗口

mmmm_baby 2017-09-17 08:47:01
加精
各位前辈:

大家好!现在想创建一个画实时曲线的画图窗口,希望有如下功能:
1 窗体一开始可以显示60秒的实时曲线数据
2 到了60秒后时间轴左移,来绘制60秒以后的实时数据
3 在实现2的同时,以前的数据不移出窗口,也就是数据随着时间推进向左压缩

由于是新手,大家能否指点一下,多谢!!!!!!!
...全文
6138 44 打赏 收藏 转发到动态 举报
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿源是少年 2017-11-22
  • 打赏
  • 举报
回复
要做双缓冲,需要把逻辑坐标系和设备坐标系的关系理解清楚,否则一头雾水
nettman 2017-11-07
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
lwh15510508673 2017-10-26
  • 打赏
  • 举报
回复
找一个插件 自己做的话,把窗口尺寸坐标弄清楚,把你的数据进行变换处理 XY画直线就可以了
lwh15510508673 2017-10-26
  • 打赏
  • 举报
回复
网页授权域名和JS接口安全域名相关的域名是否配置正确
qq_40715583 2017-10-20
  • 打赏
  • 举报
回复
5555555555555555555555555555
_Inky 2017-10-20
  • 打赏
  • 举报
回复
@XuJacket
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
3589671 2017-10-09
  • 打赏
  • 举报
回复
学习了学习了
schlafenhamster 2017-10-09
  • 打赏
  • 举报
回复
60秒以后,窗口移动的 代码
1 初始化
// TODO: Add extra initialization here
m_Start=0;
// 1st point 0 for painting
m_yInfo.push_back(0);
// set timer for late point
CRect rc;
GetClientRect(rc);
int tm=60000/rc.Width();// 83 ms
SetTimer(1,tm,0);
2 定时器
void CScrollMemDCDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CRect rc;
GetClientRect(rc);
int y;
UINT all=m_yInfo.size();// all=1
y=-rc.Height()/3 * sin(all*PI/180);
m_yInfo.push_back(y);
//
if(all >=rc.Width()) m_Start++;
//
Invalidate();
// CDialog::OnTimer(nIDEvent);
}
3 绘制
else
{
// CDialog::OnPaint();
CPaintDC dc(this); // device context for painting
// prepare bmp;br
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CRect rc;
GetClientRect(rc);
CBitmap bmp;
bmp.CreateCompatibleBitmap(&dc,rc.Width(),rc.Height());
memDC.SelectObject(&bmp);
CBrush br;
br.CreateSolidBrush(RGB(255,255,200));
// background
memDC.FillRect(&rc,&br);
// h axis
memDC.MoveTo(0,HOR_POS);
memDC.LineTo(rc.right,HOR_POS);
// curve start
memDC.MoveTo(0,m_yInfo[m_Start]+HOR_POS);
UINT all=m_yInfo.size();
if(all>=rc.right) all=rc.right;
for(UINT jj=0;jj<all;jj++)
{// all points
memDC.LineTo(jj,m_yInfo[jj+m_Start]+HOR_POS);
}
// points
int tm=0;
for(UINT kk=0;kk<m_yInfo.size();kk+=(int)(10000/83))
{// 83ms each ; 10000/83ms=120 pt
CString str;
str.Format("% 3d秒",tm);// 10sec
if(kk==0 && all < rc.right) memDC.TextOut(-10,HOR_POS+20,str);
else memDC.TextOut(kk-m_Start-20,HOR_POS+20,str);
// scaler | | |
memDC.MoveTo(kk-m_Start,HOR_POS-10);
memDC.LineTo(kk-m_Start,HOR_POS+10);
tm+=10;
}
// output to dc
dc.BitBlt(0,0,rc.Width(),rc.Height(),&memDC,0,0,SRCCOPY);
}
4 60秒 前 结果
qq_40280917 2017-10-09
  • 打赏
  • 举报
回复
我来学习学习
schlafenhamster 2017-10-05
  • 打赏
  • 举报
回复
每 83ms (宽720pixel=60秒)产生新的一点 另外 BOOL CScrollMemDCDlg::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default return TRUE; // return CDialog::OnEraseBkgnd(pDC); }
schlafenhamster 2017-10-05
  • 打赏
  • 举报
回复
schlafenhamster 2017-10-05
  • 打赏
  • 举报
回复
1 初始化

	vector <UINT> m_yInfo;// .h

	// TODO: Add extra initialization here
	CRect rc;
	GetClientRect(rc);
	UINT y;
	for(int jj=0 ;jj < rc.right;jj++)
	{
		y=rc.Height()/3 * sin(jj*PI/180);
		m_yInfo.push_back(y);
	}
	m_Start=0;
//
	int tm=60000/rc.Width();// 83 ms
	SetTimer(1,tm,0);
2 定时器

void CScrollMemDCDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	CRect rc;
	GetClientRect(rc);
	UINT y;
	y=rc.Height()/3 * sin(m_yInfo.size()*PI/180);
	m_yInfo.push_back(y);
// 	
	m_Start++;
//
	rc.top+=50;
	rc.bottom-=80;
	InvalidateRect(&rc);
//	CDialog::OnTimer(nIDEvent);
}
3 绘制

		CPaintDC dc(this); // device context for painting
// prepare bmp;br
		CDC memDC;
		memDC.CreateCompatibleDC(&dc);
		CRect rc;
		GetClientRect(rc);
		CBitmap bmp;
		bmp.CreateCompatibleBitmap(&dc,rc.Width(),rc.Height());
		memDC.SelectObject(&bmp);
		CBrush br;
		br.CreateSolidBrush(RGB(255,255,200));
		int tm=0;
		{
			memDC.FillRect(&rc,&br);
			// h axis
			memDC.MoveTo(0,HOR_POS);
			memDC.LineTo(rc.right,HOR_POS);
			//
			memDC.MoveTo(0,m_yInfo[m_Start]+HOR_POS);
			for(UINT jj=0;jj<rc.right;jj++)
			{
				memDC.LineTo(jj,m_yInfo[jj+m_Start]+HOR_POS);
			}
			for(UINT kk=0;kk<m_yInfo.size();kk+=(int)(10000/83))
			{// 83ms each ; 10000/83ms=120 pt
				CString str;
				str.Format("% 3d秒",tm);// 10sec
				memDC.TextOut(kk-m_Start-20,HOR_POS+20,str);
				memDC.MoveTo(kk-m_Start,HOR_POS-10);
				memDC.LineTo(kk-m_Start,HOR_POS+10);
				tm+=10;
			}
		//
			dc.BitBlt(0,0,rc.Width(),rc.Height(),&memDC,0,0,SRCCOPY);
		}
nettman 2017-10-02
  • 打赏
  • 举报
回复
joe2086666 2017-10-01
  • 打赏
  • 举报
回复
学习学习学习学习
smwhotjay 2017-09-28
  • 打赏
  • 举报
回复
gdi绘制lineto moveto 这种滚动左移右移的曲线图,采用链表,还是双链表,每次pop_front 然后push_back 数据 达到了更新一个点的目的。
weixin_40424226 2017-09-28
  • 打赏
  • 举报
回复
学习学习学习学习
nettman 2017-09-27
  • 打赏
  • 举报
回复
加载更多回复(22)

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧