代码:
_variant_t vCount;
int i,j;
int m_Count[10];
CPoint point1,point2;
long Yscale=(m_bottom - m_top)/(30-15);//纵坐标每个占的百分比
long Xscale=(rect.right-rect.left)/9;//横坐标百分比
for(i=0;i<10;i++)
{
m_Count[i]=m_bottom;
}//数组先赋值为0
while(!m_pRst->adoEOF)
{
for(i=0;i<9;i++)
{
m_Count[i]=m_Count[i+1];
}
vCount = m_pRst->GetCollect("Age");
m_y=vCount.lVal;
m_y=(30 - m_y)*Yscale;//m_y为表中获取的数字
m_Count[9] = m_y;
m_pRst->MoveNext();
point1.x = rect.left-Xscale;
//绘制曲线
for(i=0;i<9;i++)
{
point1.x = point1.x+Xscale;
point1.y = m_Count[i];
pDC->MoveTo(point1);
point2.x = point1.x+Xscale;
point2.y = m_Count[i+1];
pDC->LineTo(point2);
//InvalidateRect();
//UpdateWindow();
//RedrawWindow();
}
}
现在的问题是,画出来的图形全部重叠在一起。
怎么能在下次画图前删除前一次的图,每两张图之间的时间间隔怎么确定(应该和数据采集间隔时间相等才能显出实时性吧),
而且我图形是有背景的,是不是还需要重绘背景?
PS:我加InvalidateRect()进去报错: error C2660: 'InvalidateRect' : function does not take 0 parameters。是怎么了哦?
8 个解决方案
#1
呵呵,楼主应该是新手吧!
'InvalidateRect' 应该要加入参数的!
你干脆调用invalidate看看!不过,要在前面调用!不能放在后面!
'InvalidateRect' 应该要加入参数的!
你干脆调用invalidate看看!不过,要在前面调用!不能放在后面!
#2
确是是新手,现在做毕设,刚刚接触。
你所说的调用invalidate()在前面,是在什么位置,我放到如下的位置还是不行啊,闪烁很快,而且是整个窗口都闪,不是画图区域(用的PICTURE控件)。
for(i=0;i <9;i++)
{
Invalidate();
point1.x = point1.x+Xscale;
point1.y = m_Count[i];
pDC->MoveTo(point1);
point2.x = point1.x+Xscale;
point2.y = m_Count[i+1];
pDC->LineTo(point2);
}
怎么回事?
#3
你是在对话框上画的吗?
1、重载ON_WM_ERASEBKGND消息,在这里画你的背景。
2、重载ON_WM_PAINT,再这里画你的的曲线,这个考虑用双缓冲,这里你每一次画都是取背景,这样就不会有重叠了
需要画的时候你只需要改变一下你的数组,然后发一个OnPaint消息就可以了
1、重载ON_WM_ERASEBKGND消息,在这里画你的背景。
2、重载ON_WM_PAINT,再这里画你的的曲线,这个考虑用双缓冲,这里你每一次画都是取背景,这样就不会有重叠了
需要画的时候你只需要改变一下你的数组,然后发一个OnPaint消息就可以了
#4
1、在类向导没找到有WM_ERASEBKGND,不知道是在什么地方?
2、在现有程序基础上改的话该怎么改呢?还是根本就不行?
#5
用SetTimer定时采集数据,把要显示的数据保存在类成员变量里面,然后调用Invalidate刷新窗口,(然后就可以从定时函数中返回了);响应WM_PAINT消息来绘制图形。
#6
不要把重画放到循环里,结果就是一阵闪
放到相隔时间的函数里,用SetTimer采集数据
用WM_PAINT里画采集的数据
放到相隔时间的函数里,用SetTimer采集数据
用WM_PAINT里画采集的数据
#7
在onpaint里面是不是只能用CpaintDC类画图?
#8
怎么没人看了?
还是要顶上去!
还是要顶上去!
#1
呵呵,楼主应该是新手吧!
'InvalidateRect' 应该要加入参数的!
你干脆调用invalidate看看!不过,要在前面调用!不能放在后面!
'InvalidateRect' 应该要加入参数的!
你干脆调用invalidate看看!不过,要在前面调用!不能放在后面!
#2
确是是新手,现在做毕设,刚刚接触。
你所说的调用invalidate()在前面,是在什么位置,我放到如下的位置还是不行啊,闪烁很快,而且是整个窗口都闪,不是画图区域(用的PICTURE控件)。
for(i=0;i <9;i++)
{
Invalidate();
point1.x = point1.x+Xscale;
point1.y = m_Count[i];
pDC->MoveTo(point1);
point2.x = point1.x+Xscale;
point2.y = m_Count[i+1];
pDC->LineTo(point2);
}
怎么回事?
#3
你是在对话框上画的吗?
1、重载ON_WM_ERASEBKGND消息,在这里画你的背景。
2、重载ON_WM_PAINT,再这里画你的的曲线,这个考虑用双缓冲,这里你每一次画都是取背景,这样就不会有重叠了
需要画的时候你只需要改变一下你的数组,然后发一个OnPaint消息就可以了
1、重载ON_WM_ERASEBKGND消息,在这里画你的背景。
2、重载ON_WM_PAINT,再这里画你的的曲线,这个考虑用双缓冲,这里你每一次画都是取背景,这样就不会有重叠了
需要画的时候你只需要改变一下你的数组,然后发一个OnPaint消息就可以了
#4
1、在类向导没找到有WM_ERASEBKGND,不知道是在什么地方?
2、在现有程序基础上改的话该怎么改呢?还是根本就不行?
#5
用SetTimer定时采集数据,把要显示的数据保存在类成员变量里面,然后调用Invalidate刷新窗口,(然后就可以从定时函数中返回了);响应WM_PAINT消息来绘制图形。
#6
不要把重画放到循环里,结果就是一阵闪
放到相隔时间的函数里,用SetTimer采集数据
用WM_PAINT里画采集的数据
放到相隔时间的函数里,用SetTimer采集数据
用WM_PAINT里画采集的数据
#7
在onpaint里面是不是只能用CpaintDC类画图?
#8
怎么没人看了?
还是要顶上去!
还是要顶上去!