如何使用消息访问 MFC 控件



我想从工作线程访问对话框的拖动滑块控件。我阅读了许多有关从工作线程访问主窗口控件的警告。因为它们很有可能导致死锁。在这种情况下,如何使用消息访问控件?我知道如何创建用户定义的消息(WM_USER)并编写我们自己的处理程序。它想知道的是每个控件是否有任何系统定义的消息,如果有,如何发布这些消息以访问控件?

您可以使用 PostMessage 向控件发送消息,主 UI 线程实际上会将消息调度到控件,即工作将在 UI 线程上进行(假设 UI 线程正在泵送消息)。查看afxcmn.inl,您可以看到SetPos正在做什么:

_AFXCMN_INLINE void CSliderCtrl::SetPos(_In_ int nPos)
{ ASSERT(::IsWindow(m_hWnd)); ::SendMessage(m_hWnd, TBM_SETPOS, TRUE, nPos); }

更改帖子消息:

::PostMessage(hSlider, TBM_SETPOS, TRUE, nPos);

如果你想要更复杂的东西,请将WM_USER消息发布到父窗口并在那里处理你的控件管理功能,因为同样,WM_USER消息将由 UI 线程调度,以便你可以安全地使用你的控件。

最新更新