图形重绘或者刷新问题(论坛相关的都看了,还是不懂)

时间:2023-02-02 07:47:33
我是想把串口采集来的数据放到数据库然后画一个实时的动态曲线图。现在是分配了一个数组m_Count[10],将十个数据放到数组,每次用这是个数据画图,然后将数组每个数前移一位,最后一位用数据库中的书填充,再调用数组中的数画图。
代码:
                  _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看看!不过,要在前面调用!不能放在后面!

#2


引用 1 楼 fandh 的回复:
呵呵,楼主应该是新手吧! 
'InvalidateRect' 应该要加入参数的! 
你干脆调用invalidate看看!不过,要在前面调用!不能放在后面!


确是是新手,现在做毕设,刚刚接触。

你所说的调用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消息就可以了

#4


引用 3 楼 Allen_zhang 的回复:
你是在对话框上画的吗? 

1、重载ON_WM_ERASEBKGND消息,在这里画你的背景。 

2、重载ON_WM_PAINT,再这里画你的的曲线,这个考虑用双缓冲,这里你每一次画都是取背景,这样就不会有重叠了 
需要画的时候你只需要改变一下你的数组,然后发一个OnPaint消息就可以了 


1、在类向导没找到有WM_ERASEBKGND,不知道是在什么地方?

2、在现有程序基础上改的话该怎么改呢?还是根本就不行?

#5


用SetTimer定时采集数据,把要显示的数据保存在类成员变量里面,然后调用Invalidate刷新窗口,(然后就可以从定时函数中返回了);响应WM_PAINT消息来绘制图形。

#6


不要把重画放到循环里,结果就是一阵闪

放到相隔时间的函数里,用SetTimer采集数据

用WM_PAINT里画采集的数据

#7


引用 6 楼 fenge1981 的回复:
不要把重画放到循环里,结果就是一阵闪 

放到相隔时间的函数里,用SetTimer采集数据 

用WM_PAINT里画采集的数据


在onpaint里面是不是只能用CpaintDC类画图?

#8


怎么没人看了?
还是要顶上去!

#1


呵呵,楼主应该是新手吧!
'InvalidateRect' 应该要加入参数的!
你干脆调用invalidate看看!不过,要在前面调用!不能放在后面!

#2


引用 1 楼 fandh 的回复:
呵呵,楼主应该是新手吧! 
'InvalidateRect' 应该要加入参数的! 
你干脆调用invalidate看看!不过,要在前面调用!不能放在后面!


确是是新手,现在做毕设,刚刚接触。

你所说的调用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消息就可以了

#4


引用 3 楼 Allen_zhang 的回复:
你是在对话框上画的吗? 

1、重载ON_WM_ERASEBKGND消息,在这里画你的背景。 

2、重载ON_WM_PAINT,再这里画你的的曲线,这个考虑用双缓冲,这里你每一次画都是取背景,这样就不会有重叠了 
需要画的时候你只需要改变一下你的数组,然后发一个OnPaint消息就可以了 


1、在类向导没找到有WM_ERASEBKGND,不知道是在什么地方?

2、在现有程序基础上改的话该怎么改呢?还是根本就不行?

#5


用SetTimer定时采集数据,把要显示的数据保存在类成员变量里面,然后调用Invalidate刷新窗口,(然后就可以从定时函数中返回了);响应WM_PAINT消息来绘制图形。

#6


不要把重画放到循环里,结果就是一阵闪

放到相隔时间的函数里,用SetTimer采集数据

用WM_PAINT里画采集的数据

#7


引用 6 楼 fenge1981 的回复:
不要把重画放到循环里,结果就是一阵闪 

放到相隔时间的函数里,用SetTimer采集数据 

用WM_PAINT里画采集的数据


在onpaint里面是不是只能用CpaintDC类画图?

#8


怎么没人看了?
还是要顶上去!