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()函数也没有用。
哪位高手能帮小弟解决一下,感激不尽。
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()函数也没有用。
哪位高手能帮小弟解决一下,感激不尽。
我也去做了这个有趣的事情,有一个结论:
发现CEdit::SetWindowText(...)必须在一个函数体完成后才在CEdit对象里面显示出文字。 因此,你要完成那个功能就把显示不同文字用不同函数来完成;
或者用计数器/多线程来完成。
这函数告诉主线程,也即界面线程来settext
但是你用sleep时阻塞了线程,直到sleep后才settext
而后立刻有settext(b)(注意这个时间段十分小,所以根本没发觉变化过程)
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);
}
运行发现文本框中会显示文字“A”的
这又怎么解释呢?
运行发现文本框中会显示文字“A”的
这又怎么解释呢?
==========================================
你用到了Sleep会使界面线程阻塞,解决的办法就是建立一个线程来实现。
你用MessageBox替换掉Sleep,并不会使界面线程阻塞,因此会有不同的结果。
你用MessageBox替换掉Sleep,并不会使界面线程阻塞,因此会有不同的结果。
------------------------------------------------------------------
那么为什么Sleep()没有阻塞pbtn->SetWindowText()的界面线程呢?
按钮的字体总是可以正常显示的
难道两个控件的SetWindowText()实现方式不一样吗?
它们好像都是运行的是CWnd::SetWindowText()函数吧