對界面控件的操作儘量不要在線程裏操作,而是在響應消息裏進行
//C++// 自定義消息號
#define WM_MY_MESSAGE WM_USER+1
class CMyDlg : public CDialog
{
...
public:
// 自定義消息響應函數
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
...
private:
// 假設這個函數啓動線程
void StartThread();
private:
CProgressCtrl m_progressCtrl;
...
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
...
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
END_MESSAGE_MAP()
...
// 使用wParam作爲progressCtrl的位置參數
LRESULT CMyDlg::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
int nPos = (int)wParam;
this->m_progressCtrl.SetPos(nPos);
return 0;
}
void CMyDlg::StartThread()
{
// 將this指針作爲參數傳遞給線程函數
AfxBeginThread(ThreadProc, this);
}
UINT ThreadProc(LPVOID p)
{
// 指針類型轉換
CMyDlg* pDlg = (CMyDlg*) p;
int nPos = 0; // progressCtrl進度條位置
// 對進度條位置的一些處理
...
// 發送消息給窗體,第一個參數是進度條位置信息
pDlg->SendMessage(WM_MY_MESSAGE,(WPARAM)nPos, 0);
return 0;
}
由於使用了OnCtlColor更新界面編輯框顏色,本來打算當一標誌位清零時在OnCtlColor進行更新,開始用了Invalidate 來刷新,但這種刷新會造成界面顯示的閃爍,如果不用Invalidate 當標誌位清零時不會進行顏色更新,於是在該標誌位清零時向編輯框寫入最近的一次值,這樣就會調用OnCtlColor進行顏色的更新。
順便記錄,如果對編輯框關聯了一個CString變量,
你改變了界面上的值, 想把界面上的輸入更新到CString變量中, 就需要調用一次UpdateData(true); //注意,這裏是true
如果是CString變量的值改變了, 想更新到界面上, 就調用一次UpdateData(FALSE) ;// 注意: 這裏是false