【问题标题】:Create child window in WM_CREATE, relevance of same thread?在 WM_CREATE 中创建子窗口,同一线程的相关性?
【发布时间】:2012-06-24 22:18:44
【问题描述】:

一个典型的模式是在消息WM_CREATE处的消息回调(WndProc)中创建一个子窗口:

LRESULT APIENTRY WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
...
switch (message) {
  case WM_CREATE:
  ....
  hwndChild[i] = CreateWindow (szChildClass[i], NULL, WS_CHILDWINDOW | WS_BORDER  ...

我完全理解这是一个很好的机会,但以后再做会有问题吗?这样做的一个原因是子窗口是在同一个线程中创建的。但是还有其他原因吗?

在同一个线程(作为父线程)中创建子窗口有多重要?从“Can a child thread of parent GUI dialog thread create a child window?”开始,这似乎不是一般问题?

【问题讨论】:

    标签: c++ windows childwindow createwindow message-loop


    【解决方案1】:

    以后再创建子窗口是没有问题的,但是,正如你所提到的,它应该从同一个线程中创建。

    例如,您可以在 WM_COMMAND 消息处理程序中创建一个子窗口(例如,当用户单击按钮时)或作为对 WM_TIMER 的响应。

    从另一个线程创建子窗口是个坏主意,因为每个线程都有自己的消息队列。但是,如果您希望另一个线程开始创建窗口,您可以通过向您的窗口发送用户定义的消息来解决它:

    1. 定义您的消息(例如#define WM_CREATEMYWINDOW WM_USER + 123)
    2. 从另一个线程将其发布到您的窗口:

      PostMessage(g_hWnd, WM_CREATEMYWINDOW, 0, 0);
      
    3. 在你的窗口过程中创建子窗口:

      if (message == WM_CREATEMYWINDOW)
          hwndChild[i] = CreateWindow(...);
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      相关资源
      最近更新 更多