MFC线程中向主窗口发送消息来操作控件
1.在头文件stdafx.h中添加一个自定义消息宏:
#define WM_USER_MSG_HDL (WM_USER + 100) //100以上最安全
2.在增加新消息的窗口或对话框类头文件中增加一个回调函数声明,注意要声明为public
afx_msg LRESULT OnUserMsgHdl(WPARAM wParam, LPARAM lParam); //信息函数声明
3.在窗口或对话框的cpp文件的BEGIN_MESSAGE_MAP,END_MESSAGE_MAP中增加一行
ON_MESSAGE(WM_USER_MSG_HDL, OnUserMsgHdl) //消息映射
4.在窗口或对话框的cpp文件中添加回调函数的实现,如:
//wParam和lParam为sendMessage或PostMessage传递过来的参数
LRESULT ThreadDialog::OnUserMsgHdl(WPARAM wParam, LPARAM lParam)
{
TRACE("WM_USER_MSG_HDL message /n");
return 0;
}
5.自定义消息的触发:
::PostMessage(GetSafeHwnd(), WM_USER_MSG_HDL, 0, 0); //还可以用SendMessage
其中,GetSafeHwnd()得到了一个当前窗口的句柄,此消息将发送给当前窗口,如果想发送消息给其他窗口只需改变这个句柄,前提示目的的窗口也实现了此消息的处理函数。
举例:
//CtestDlg.h
#define WM_UPDATE_STATIC (WM_USER + 100) //更新主界面static控件信息
DWORD m_dwThreadID;
HANDLE m_hThread;
static DWORD TestThread(LPVOID lpParam);
afx_msg LRESULT OnUpdateStatic(WPARAM wParam, LPARAM lParam); //添加用户自定义消息
//CtestDlg.cpp
BEGIN_MESSAGE_MAP(CtestDlg, CDialogEx)
ON_MESSAGE(WM_UPDATE_STATIC, &CtestDlg::OnUpdateStatic)
END_MESSAGE_MAP()
void CtestDlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码
m_hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TestThread, this, 0, &m_dwThreadID);
}
DWORD CtestDlg::TestThread(LPVOID lpParam)
{
CtestDlg* pInfo = (CtestDlg*)lpParam;
::PostMessage(pInfo->m_hWnd, WM_UPDATE_STATIC, 0, 0);
return false;
}
LRESULT CtestDlg::OnUpdateStatic(WPARAM wParam, LPARAM lParam)
{
if (wParam == 0)
{
GetDlgItem(IDC_STATIC)->SetWindowText(L"Hello Linux");
}
else
{
GetDlgItem(IDC_STATIC)->SetWindowText(L"Hello Windows");
}
return 0;
}
原文链接:https://blog.csdn.net/lidandan2016/article/details/91414756