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
上一篇: 创建一棵完全二叉搜索树
推荐阅读