如何使用消息访问 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 控件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MFC No CLR 中访问 Winform ActiveX 控件

如何从工作线程访问 MFC 控件?

如何更改MFC按钮的背景色

如何在 MFC 自定义控件类中挂钩控件关闭

MFC中如何让静态控件响应鼠标移动的消息?

如果我没有为它的相应命令声明消息映射条目,如何阻止 MFC 禁用我的控件?