GetDlgItem(IDC_STATIC)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_BTN1)->ShowWindow(SW_HIDE);
GetDlgItem(IDC_BTN2)->ShowWindow(SW_SHOW);
Sleep(5000);
我在一个函数中执行上面的代码,但是发现结果是先隐藏了IDC_STATIC和IDC_BTN1,然后等5秒后才显示IDC_BTN2,不知为什么?
再者,我在后面加个for循环,也是在执行完for循环后才进行显示?大家有没有知道的。

解决方案 »

  1.   

    那也应该按顺序执行,也应该先显示完了,在执行Sleep(5000)呀,就是不加Sleep(5000),我加for循环后,他是在for循环执行完才显示,我想让他在for循环之前显示呀
      

  2.   

    因为显示的操作后系统要在消息队列中加个wm_paint消息,而这个消息的优先级比较低,要等系统空闲才能能执行。你Sleep(5000)就没有机会及时执行出重绘了;
      

  3.   

    把上面代码改成下面的样子,会解决这个问题:
    GetDlgItem(IDC_STATIC)->ShowWindow(SW_HIDE); 
    GetDlgItem(IDC_BTN1)->ShowWindow(SW_HIDE); 
    GetDlgItem(IDC_BTN2)->ShowWindow(SW_SHOW);
    GetDlgItem(IDC_BTN2)->Invalidate();
    Invalidate(); 
    Sleep(5000); 
      

  4.   

    用Timer或者另外开个线程来控制,主线程不要sleep
      

  5.   

    在sleep()之前加Invalidate()试试
      

  6.   

    ShowWindow和Invalidate一样,都是SendMessage(WM_PAINT)。
      

  7.   

    Invalidate只是放一个WM_PAINT消息在队列里,不做别的,所以只有当当前函数返回后,进入消息循环,取出WM_PAINT,才执行PAINT,所以不管Invalidate放哪里,都是最后的
      

  8.   

    GetDlgItem(IDC_BTN1)->ShowWindow(SW_HIDE); 断点设置,看跑什么地方去执行什么东西了
      

  9.   

    Sleep(5000); 
    改成void mySleep(int milSec) {
      DWORD t = GetTickCount();
      while(GetTickCount()-t < milSec) {
        Sleep(1);
      }
    }