2012-06-24 4 views
0

Типичная картина для создания дочернего окна в функции обратного вызова сообщения (WndProc) в сообщении WM_CREATE:Создать дочернее окно в 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

Не забудьте создать дочернее окно позже, однако, как вы уже упоминали, оно должно быть создано из того же потока.

Например, вы можете создать дочернее окно внутри обработчика сообщения WM_COMMAND (например, когда пользователь нажимает кнопку) или как ответ на WM_TIMER.

Создание дочернего окна из другого потока - плохая идея, так как каждый поток имеет свою собственную очередь сообщений. Однако, если вы хотите, другой поток, чтобы начать создавать окно, вы можете работать вокруг него, посылая определенное пользователем сообщение в окно:

  1. Define Ваше сообщение (например, #define WM_CREATEMYWINDOW WM_USER + 123)
  2. с другой нити отправить его в окно:

    PostMessage(g_hWnd, WM_CREATEMYWINDOW, 0, 0); 
    
  3. в вашей оконной процедуре создания дочернего окна:

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