Создать дочернее окно в WM_CREATE, актуальность того же потока?

Типичным шаблоном является создание дочернего окна в обратном вызове сообщения (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 создает дочернее окно? "это не общая проблема?


person Horst Walter    schedule 24.06.2012    source источник


Ответы (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(...);
    
person Ivan Shcherbakov    schedule 24.06.2012