MFC更新控件界面&防閃爍--發送消息

對界面控件的操作儘量不要在線程裏操作,而是在響應消息裏進行

//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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章