c++ - 如何使用消息访问mfc控件?

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

我想从工作线程访问我的对话框的拖动 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/

相关文章:

c++ - 多线程实时音频编程 - 阻塞或不阻塞

c++ - 线程安全,在C++中有序映射/哈希?

c++ - C1083 WIN32 没有那个文件或目录

c++ - 如何检查文件是否为 DLL?

c++ - 根据 C++ 中的决策调用父级的初始化器

c++ - 插入到 2-3-4 树中

java - 如何在 Java 中决定 wait() 的循环条件

c++ - const char [22 ]' to ' LPCWSTR'

用 C 编程语言创建 Sin 公式

c++ - 在 Visual C++ 2003 中删除调试符号