MFC 在线程中操作UI控件时报错,针对这种情况我们需要在线程处理函数中通过SendMessage或PostMessage来操作界面控件。
1、创建消息处理函数
a. 在.cpp文件顶部添加消息ID, WM_USER + 100避免与系统消息ID重复
#define WM_SHOW_MESSAGE (WM_USER + 100)
b. 在.h文件界面类中添加响应函数声明
protected:
afx_msg LRESULT OnShowMessage(WPARAM wParam, LPARAM lParam);
c.在.cpp中实现消息处理函数
LRESULT CAutoStick_Param::OnShowMessage(WPARAM wParam, LPARAM lParam)
{
// TODO: 处理用户自定义消息
ShowAll(); // 界面处理函数
return 0;
}
d. 在.cpp中映射消息ID和消息处理函数
BEGIN_MESSAGE_MAP(CAutoStick_Param, CDialogEx)
ON_WM_TIMER()
ON_MESSAGE(WM_SHOW_MESSAGE, OnShowMessage)
END_MESSAGE_MAP()
2、创建线程并在处理函数中调用PostMessage
void ProcessBkGrd(LPVOID lp)
{
CAutoStick_Param * pThis = (CAutoStick_Param *)lp;
while (pThis->threadRun_) {
SendMessage(pThis->m_hWnd, WM_SHOW_MESSAGE, 0, 0);
::Sleep(500);
}
}
int CAutoStick_Param::InitWorkThread()
{
//启动线程
HANDLE hThread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ProcessBkGrd, (LPVOID)this, 0, NULL);
if (NULL == hThread){
return -1;
}
else{
::Sleep(200);
}
return 0;
}