【问题标题】:how to access mfc controls using messages?如何使用消息访问 mfc 控件?
【发布时间】:2014-11-25 06:31:02
【问题描述】:

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

【问题讨论】:

    标签: c++ multithreading visual-c++ mfc


    【解决方案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 线程上。我也更新了答案。
    猜你喜欢
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多