【问题标题】:AfxBeginThread() PostMessage to change contorlsAfxBeginThread() PostMessage 更改控件
【发布时间】:2015-05-21 08:09:47
【问题描述】:

我有一个带有 AfxBeginThread() 的程序,它需要将 postmessage 发送到主对话框以更改 listcontrol 数据。

我如何实现这一点,因为我需要传递我想要更改的文本和元素更改文本?我该怎么做?

【问题讨论】:

  • AfxBeginThread 的第一个重载有一个pParam 参数。这就是您将所有信息传递给它需要的线程的方式,例如对话框的窗口句柄。除非您提供处理所有权的自定义实现,否则您不能使用 PostMessage 传输免费存储数据。改用SendMessage,返回时清理资源。
  • 我需要传递主 dlg 的 hwnd 和指向 dlg 的指针(因为我不知道是否可以从 hanlde 获得指向 dlg 的指针)。另外,我应该将什么传递给 WPARAM 和 LPARAM 中的 sendmessage(主要 dlg 句柄和消息类型除外)?
  • pParam 的类型为 void*。你可以传递你想要的任何结构,它可以是任意复杂的。尽管您可能永远不需要指向CDialog 派生对象的指针,但该结构也可以包含指向该对象的指针。 SendMessage 的参数是特定于消息的,并与相应的消息一起记录。在转到 MFC 之前彻底学习 Windows API 可能是一个非常好的主意。即使您非常熟悉 Windows API,它也具有足够的挑战性。
  • 好的,谢谢。我已经通过结构传递了我所有的论点。但仍然有一个小问题。我在消息映射 afx_msg LRESULT UpdateItemData(WPARAM wParam, LPARAM lParam);它必须更改列表控件中的一些值。但是我可以添加其他参数吗?或者我的线程必须如何与主对话框通信?
  • 你真的,真的需要先学习 Windows API。如果不这样做,您将没有一点机会了解 MFC 应用程序中的代码流。您所有的消息处理程序都隐藏在预处理器宏后面,几乎无法理解发生了什么。也就是说,您通常不会直接调用消息处理程序。您宁愿发送消息并让框架调用它们作为响应。

标签: multithreading user-interface winapi mfc afx


【解决方案1】:

调用 API 版本的 SendMessage (::SendMessage(hwnd, w, l),这样您就不会使用指向对话框的指针。指向对话框的指针是线程本地的。

你传入的 LPARAM ::SendMessage 可以是指向任何东西的指针。如果您需要传递多个参数,则创建一个包含所有参数的结构并将指针传递给该结构。在消息处理函数中,从结构中获取各个参数。

【讨论】:

  • 等一下。那么,我可以使用 LPARAM 来传递我想要的任何值吗? WPARAM 呢?我的意思是,我必须通过 wParam 传递什么?
  • 指向CDialog 派生对象的指针只是普通指针。没有什么线程本地的。它在进程中的每个线程中都有效。但是,指向 数据,即HWND 成员,具有线程affinity。这就是为什么您不想从拥有线程以外的线程调用任何成员函数的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多