CButton *pbtn=(CButton*)(this->GetDlgItem(IDC_TESTBTN));
CEdit *pedit=(CEdit*)(this->GetDlgItem(IDC_TESTEDIT));
pbtn->SetWindowText("A");
pedit->SetWindowText("A");
Sleep(1000);
pbtn->SetWindowText("B");
pedit->SetWindowText("B");上面那个程序是想让文本框和按钮都现显示字母“A”,然后用Sleep()函数,暂停一会,然后将两个空间的字体都显示为“B”,但是实际运行的效果确是:按钮的效果和前面所说的一样,但是文本框确没有显示“A”,而是直接显示的“B”。而且当按钮显示“A”,并进入Sleep()等待时间时会发现,文本框中没有任何字母被显示出来(文本框里默认没有输入信息)。
就算我加了UpdateData()函数也没有用。
哪位高手能帮小弟解决一下,感激不尽。

解决方案 »

  1.   


      我也去做了这个有趣的事情,有一个结论:
      发现CEdit::SetWindowText(...)必须在一个函数体完成后才在CEdit对象里面显示出文字。  因此,你要完成那个功能就把显示不同文字用不同函数来完成;
      或者用计数器/多线程来完成。
      

  2.   

    补充,这与用不用Sleep无关。(这点你可以去掉Sleep(..)后用单步跟踪就可以发现)
      

  3.   

    This method causes a WM_SETTEXT message to be sent to this window.
    这函数告诉主线程,也即界面线程来settext
    但是你用sleep时阻塞了线程,直到sleep后才settext
    而后立刻有settext(b)(注意这个时间段十分小,所以根本没发觉变化过程)
      

  4.   

    创建一个线程来完成它。
    UINT MyThread(LPVOID pParam)
    {
    CGraphictestDlg *pDlg=(CGraphictestDlg *)pParam;
    pDlg->GetDlgItem(IDC_BUTTON1)->SetWindowText("A");
    pDlg->GetDlgItem(IDC_EDIT1)->SetWindowText("A");
    Sleep(1000);
    pDlg->GetDlgItem(IDC_BUTTON1)->SetWindowText("B");
    pDlg->GetDlgItem(IDC_EDIT1)->SetWindowText("B");
    return 0;
    }void CGraphictestDlg::OnButton1() 
    {
    AfxBeginThread(MyThread,this);
    }
      

  5.   

    后来我又将上面的自己的程序中的Sleep(1000);语句改为MessageBox(“Test”);
    运行发现文本框中会显示文字“A”的
    这又怎么解释呢?
      

  6.   

    后来我又将上面的自己的程序中的Sleep(1000);语句改为MessageBox(“Test”);
    运行发现文本框中会显示文字“A”的
    这又怎么解释呢?
    ==========================================
    你用到了Sleep会使界面线程阻塞,解决的办法就是建立一个线程来实现。
    你用MessageBox替换掉Sleep,并不会使界面线程阻塞,因此会有不同的结果。
      

  7.   

    你用到了Sleep会使界面线程阻塞,解决的办法就是建立一个线程来实现。
    你用MessageBox替换掉Sleep,并不会使界面线程阻塞,因此会有不同的结果。
    ------------------------------------------------------------------
    那么为什么Sleep()没有阻塞pbtn->SetWindowText()的界面线程呢?
    按钮的字体总是可以正常显示的
    难道两个控件的SetWindowText()实现方式不一样吗?
    它们好像都是运行的是CWnd::SetWindowText()函数吧