0

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

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  ...

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

在同一个线程(作为父线程)中创建子窗口有多重要?至于“父GUI对话框线程的子线程可以创建子窗口吗? ”这似乎不是一般问题?

4

1 回答 1

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(...);
    
于 2012-06-24T22:36:19.110 回答