以对话框为基础的程序,菜单项有一个 ID_DRAW_GRID ,在CMyDialog::OnDrawGrid( )中,用了
{ Crect rect1;
    this->GetClientRect(rect1);
    this->InvalidRect(rect1,TRUE);
    m_mClass->DrawLine( );
 }其中 m_mClass 是CMyDialog的一个成员变量,m_mClass->DrawLine( )负责真正的绘图工作,如果不用上面的前三行的话,画的图像就会重叠在一块,但是用了的话,就会全部清除,就连刚画上的也给立刻清除了。从程序的顺序上看,应该是清除后再画的呀?请大侠帮忙!!!

解决方案 »

  1.   

    InvalidRect只是使窗口区域无效,正真的擦除重绘操作还要等OnDrawGrid( )函数执行完毕才能进行。这样就会发生,先执行m_mClass->DrawLine( );后擦除重绘,刚刚画的线当然又被删除了
      

  2.   

    你可以参考《VC++技术内幕》P42页,对窗口无效区域有讲解。
      

  3.   

    把m_mClass->DrawLine( );放到OnDraw里
      

  4.   

    InvalidRect(rect1,TRUE);调用结束后会触发OnDraw
      

  5.   

    你可以只刷新一小部分区域
    InvalidateRect(CRect());
      

  6.   

    InvalidateRect触发WM_PAINT消息,但WM_PAINT消息不会立即执行的
      

  7.   

    回复人: lizhli(小三) ( ) 信誉:106  2003-05-10 13:37:00  得分:0 
     
      把m_mClass->DrawLine( );放到OnDraw里
    ====================================================
    如果像上面的这位大侠说的,倒也可以。
    不过我自己的那个类里面有好几个画图的成员函数,如果都放在一个OnDraw( ),显得比较长,有没有其它的办法,让其先画后擦除??? 
     
      

  8.   

    放在OnDraw()中绘图吧,由OnDraw()调用你的绘图函数,这样好一些!
      

  9.   

    InvalidateRect触发WM_PAINT消息,但WM_PAINT消息不会立即执行的