如何使用消息访问 mfc 控件?
Posted
技术标签:
【中文标题】如何使用消息访问 mfc 控件?【英文标题】:how to access mfc controls using messages? 【发布时间】:2014-11-25 06:31:02 【问题描述】:我想从工作线程访问我的对话框的拖动滑块控件。我阅读了许多关于从工作线程访问主窗口控件的警告。因为它们很有可能导致死锁。在这种情况下,如何使用消息访问控件?我知道如何创建用户定义的消息 (WM_USER) 并编写我们自己的处理程序。它想知道的是每个控件是否有任何系统定义的消息,如果存在,如何发布这些消息以访问控件?
【问题讨论】:
【参考方案1】:您可以使用 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 更改它:
::PostMessage(hSlider, TBM_SETPOS, TRUE, nPos);
如果您想要更复杂的东西,将 WM_USER 消息发布到父窗口并在那里处理您的控件管理功能,因为 WM_USER 消息将由 UI 线程调度,因此您可以安全地使用控件。
【讨论】:
你能解释一下下面的例子吗?我有一个名为滑块的 CSliderCtrl。如果我想改变滑块控件的位置,不使用slider.setpos()怎么办?我怎么能只通过发布消息来做到这一点? 在您发布的 WM_USER 消息中,您可以直接调用 slider.setpos,因为您将在 UI 线程上。我也更新了答案。以上是关于如何使用消息访问 mfc 控件?的主要内容,如果未能解决你的问题,请参考以下文章