void CLotteryDlg::OnPaint() 
{
if (IsIconic())
{
   //省略...
}
else
{
                   CClientDC dc(this);
switch(m_status)
{
                       
case 1: dc.TextOut(0,0,"first");break;
case 2:  dc.TextOut(20,20,"second");break;
default:break;
}
CDialog::OnPaint();
}
}另外我有两年按纽 OnButton1( ) ,OnButton2()
其中OnButton1( ) 改变 m_status的值,OnButton2( )中清屏函数。例如刚开始的时候,m_status为1, 则屏幕上显示"first",当我按一下Button1,则在(20,20)处显示"second",但我的目的是要在显示"second"之前先把屏幕("first")给清除,然后再显示"second",我试了如下的OnButton1( )不能成功。
OnButton1( )
{ m_status=2;
  CRect rect1;
  this->GetClientRect(rect1);
  this->InvalidateRect(rect1); 
}
其效果好象是不停的显示"second",同时又不停的清屏。
但如果,我按一下Button2后,再按下只有一行语句 m_status=2的OnButton1( )里却是正常的先清屏后显示。
OnButton2()
{
  CRect rect1;
  this->GetClientRect(rect1);
  this->InvalidateRect(rect1); 
}
------------------------------
请告诉我错误所在,以及怎么才能达到我的那个先清屏后显示的效果.
非常感谢!

解决方案 »

  1.   

    OnButton1( )
    {
       m_status=2;
       Invalidate(); 
    }
    这样应该就可以了
      

  2.   

    用static控件不是更容易吗???
      

  3.   

    CRect rect1;
    this->GetClientRect(rect1);
    这里应该用一个reference吧 不然rect1的值不会被GetClientRect()写进去的本身函数的参数也是一个指针
    应该GetClientRect(&rect1);
    还是你的笔误?
      

  4.   

    还有如果调用Invalidate()的话 参数是TRUE或者FALSE 并不是一个rect的reference 它会刷新整个客户区 TRUE 擦掉原有内容 FALSE则不擦
    如果想用获得的rect来刷新的话 可以用InvalidateRect()
    void InvalidateRect( LPCRECT lpRect, BOOL bErase = TRUE );
    同样是一个指向rect的指针 和一个是否擦除要更新区域背景的bool值
      

  5.   

    To awnucel(中国间谍) :
    Invalidate( )执行后据说也是调用的OnPaint( ),也就是触发WM_PAINT消息。所以如你所说的和我用的 OnButton1( )的效果是一样的。To xiaobaolove(紫色太阳) :
    你好象误解了我的意思,只是我要在屏上显示的东西不便于用 static控件。To cy214(嘿呀嘿) :
    看函数的参数原型是 LPRECT 好象是指针型的,不过像我那样的用法(在OnButton2中),好象也能起来清屏的效果。我现在的问题是:我如果不在OnPaint里画的话,一移动窗口,就全部消失了,不能持续显示。而在OnPaint中显示的话,我又处理不好先清屏后画的问题,就是不能在一个函数中完成先清屏后画的效果。但是外加一个清屏按纽如我的OnButton2后再显示就行了。我估计我还是对WM_PAINT消息的传递流程不太清楚。请高手指点,
      

  6.   

    你理解错了,awnucel(中国间谍) 说的是对的。虽然使用Invalidate是调用wm_paint消息,但是你别忘了,awnucel(中国间谍) 在清屏的时候把你的m_status置为2了,而Invalidate默认的调用参数是true,这样,在重新输出的时候,已经把屏幕上原有的东西清空先了。你自己再想一想。