我想从工作线程访问我的对话框的拖动 slider 控件。我阅读了许多关于从工作线程访问主窗口控件的警告。因为它们很有可能导致死锁。在这种情况下,如何使用消息访问控件?我知道如何创建用户定义的消息 (WM_USER) 并编写我们自己的处理程序。它想知道的是每个控件是否有任何系统定义的消息,如果有,如何发布这些消息以访问控件?
最佳答案
您可以使用 PostMessage 向控件发送消息,主 UI 线程实际上会将消息分派(dispatch)给控件,即工作将在 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 更改它:
::PostMessage(hSlider, TBM_SETPOS, TRUE, nPos);
如果您想要更复杂的东西,请将 WM_USER 消息发送到父窗口并在那里处理您的控件管理功能,因为同样,WM_USER 消息将由 UI 线程分派(dispatch),因此您可以安全地使用您的控件。
关于c++ - 如何使用消息访问mfc控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27120160/