最近做了一个小程序是基于对话框的。 
对话框里有3个静态文本,1个进度条,2个单选按钮,2个按键,2个文本输入框。 
对话框有2种状态, 
1、静态文本1、2、文本输入框1、2显示,按钮全有效。静态文本3、进度条隐藏。 
2、当点击一个按钮后,静态文本1、2、文本输入框1、2隐藏,按钮全无效。静态文本3、进度条显示。 现在所有的控件(除静态文本3外)都可以按设计的过程显示隐藏。 代码如下: 
void   CReadDlg::OnButton1()   

    //编码 
    if(xxx) 
    { 
        //xxx 
    } 
    else 
    { 
        OnState(1,1); //调整状态。
        //读写文件。 
        m_P1.SetStep(0);   //有无进度条效果一样 
        m_P1.StepIt(); 
    } 
    OnState(0,1); 
} void   CReadDlg::OnButton2()   

    //解码 
    if(xxx) 
    { 
        //xxx 
    } 
    else 
    { 
        OnState(1,2); //调整状态 
         //读写文件。 
         m_P1.SetStep(0);   //有无进度条效果一样 
        m_P1.StepIt(); 
    } 
    OnState(0,2); //调整状态 
} void   CReadDlg::OnState(int   bl,int   size) 

    m_B1.EnableWindow(!bl); //按钮 
    m_B2.EnableWindow(!bl); 
    
    GetDlgItem(IDC_RADIO1)-> EnableWindow(!bl);//单选按钮 
    GetDlgItem(IDC_RADIO2)-> EnableWindow(!bl);     m_S1.ShowWindow(!bl); //字符 
    m_S2.ShowWindow(!bl);     m_E1.ShowWindow(!bl); //输入框 
    m_E2.ShowWindow(!bl);     m_S3.ShowWindow(bl);  //失效的静态文本3 
    Sleep(1000);         //此处延时,不能解决问题 
    m_P1.ShowWindow(bl); //进度条初始化     struct   stat   buf; //需要头文件: <sys/stat.h> <sys/types.h> <errno.h> 
    int   result   =   stat(m_IN,&buf); //获得文件指针 
    m_P1.SetRange(0,buf.st_size/(1000*size)+1);//获得文件长度 
    m_P1.SetPos(0); 
    m_P1.SetStep(0); 
    m_P1.StepIt(); 
    Sleep(10); 
} 经调试结论是,静态文本控件3在文件处理程序完成后才显示。而文件处理完成后,整个对话框的状态翻转了。所以始终没有看见静态文本控件3。 
1、在各处加延时,无效。 
2、将m_S3.ShowWindow(1);直接写入文件处理程序段内,无效。 
        
问,1、为什么这样? 
2、如何解决? 

解决方案 »

  1.   

    m_S1.ShowWindow(!bl);//////////////////ShowWindow的参数应该是 SW_SHOW 或 SW_HIDE ,而不是 TRUE 或 FALSE.
      

  2.   

    先谢谢luohongming 的即时答复。
    确实“ShowWindow的参数应该是   SW_SHOW   或   SW_HIDE   ,而不是   TRUE   或   FALSE”。已改如下:
    void CReadDlg::OnState(int bl,int size)
    {
    int nShow1,nShow2;
    if (bl ==0)
    {
    nShow1 = SW_HIDE;
    nShow2 = SW_SHOW;

    else
    {
    nShow1 = SW_SHOW;
    nShow2 = SW_HIDE;
    }
    m_B1.EnableWindow(!bl); //按钮停用
    m_B2.EnableWindow(!bl); GetDlgItem(IDC_RADIO1)->EnableWindow(!bl);
    GetDlgItem(IDC_RADIO2)->EnableWindow(!bl);

    m_S1.ShowWindow(nShow2); //字符隐藏
    m_S2.ShowWindow(nShow2); m_E1.ShowWindow(nShow2); //输入框隐藏
    m_E2.ShowWindow(nShow2); m_CHULI.ShowWindow(nShow1);
    m_P1.ShowWindow(nShow1); //进度条初始化 struct stat buf; //需要头文件:<sys/stat.h><sys/types.h><errno.h>
    int result = stat(m_IN,&buf); //获得文件指针
    m_P1.SetRange(0,buf.st_size/(1000*size)+1);//获得文件长度
    m_P1.SetPos(0);
    m_P1.SetStep(0);
    m_P1.StepIt();
    Sleep(10);
    }
    现在问题依旧,静态文本控件3在文件处理程序完成后才显示。不是SW_SHOW、TRUE的问题,用那个参数系统都能认出来。现在又有新发现:.EnableWindow(SW_SHOW/SW_HIDE)可以实时显示。
    .ShowWindow(SW_HIDE)可以实时隐藏。
    但.ShowWindow(SW_SHOW)必须要等待到当前程序“停止”后才能显示出来。比如OnButton1函数结束(不论该函数做了什么),或弹出个Messagebox()都可以。
    有什么办法可以解决吗?
    .SetWindowText("xxx")可以实时显示,但是,m_S1的内容长短变化时,用什么方法可以改变控件的长度,使m_S1的内容可以显示完全?
      

  3.   

     m_S3.ShowWindow(bl);
    UpdateWindow();
    ----------------
    改变控件的长度。
    如果要多行显示,最好用Eidt(Read only),可以高每行的最大长度自动换行。
      

  4.   

    消息没有办法处理造成的,可以把.ShowWindow(SW_SHOW)放进其他线程里面处理.
    或者加上消息处理循环......m_CHULI.ShowWindow(nShow1); 
    m_P1.ShowWindow(nShow1); //进度条初始化 MSG msg
    for(int i=0;i<xxx;i++)
    {
     GetMessage(......);
     DispatchMessage(..........);
     Sleep(..);
    }struct   stat   buf; //需要头文件: <sys/stat.h> <sys/types.h> <errno.h> 
    int   result   =   stat(m_IN,&buf); //获得文件指针 
    m_P1.SetRange(0,buf.st_size/(1000*size)+1);//获得文件长度 
    m_P1.SetPos(0); 
    m_P1.SetStep(0); 
    m_P1.StepIt(); 
    Sleep(10); 
      

  5.   

    请教 风
    消息处理循环的作用是什么?
    MSG   *msg;
    HWND hWnd;
    for(int i=0;i <10;i++) 

    GetMessage(msg, hWnd, 0, 0); 
    DispatchMessage(msg); 
    Sleep(10); 

    一般msg和hWnd该如何初始化?
    typedef struct tagMSG { // msg 
        HWND   hwnd;     
        UINT   message; 
        WPARAM wParam; 
        LPARAM lParam; 
        DWORD  time; 
        POINT  pt; 
    } MSG; 
      

  6.   

    我用.net 2002测试了一下,发现主线程中ShowWindow(SW_HIDE)是可以立即见效的,而ShowWindow(SW_SHOW)要等到主线程中的运行结束后才能显示出来。而且不仅是静态控件是这样,我试了编辑框和CListCtrl都是这样,我是用在一个按钮的点击事件中写入了这样两行:
       object.ShowWindow(SW_HIDE);
       ojbect.ShowWindow(SW_SHOW);
    也就是同一个控件隐藏后立即显示,结果它隐藏了,要等到按钮单击事件运行结束后才会显示。
    所以看来你要实现的效果,即用静态控件3来显示当前状态,看来真的只能用另一个线程了。
      

  7.   

    "看来真的只能用另一个线程了。"
    我也是这么想的,看来就这条路可走了。请教 小龙
    一般的添加新线程用什么方法比较好些,以前照着《Visual C++6_0程序设计培训教程》中介绍的添加线程方法,怎么写也写不出效果来。
      

  8.   

    在ShowWindow(SW_HIDE or SW_SHOW)之后调用一下UpdateWindow()如何?
      

  9.   

    感谢凤矶的UpdateWindow(); 
    第1次看时看错了。试过之后果然有效果。
    现在结贴散分。