欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MFC更新控件界面&防闪烁--发送消息

程序员文章站 2024-03-20 10:16:04
...

对界面控件的操作尽量不要在线程里操作,而是在响应消息里进行

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