在WM_CREATE中创建子窗口,相同线程的相关性?

时间:2012-06-24 22:18:45

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

典型的模式是在消息回调(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  ...

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

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

1 个答案:

答案 0 :(得分: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(...);