Создать дочернее окно в 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 создавать дочернее окно? ", Это, кажется, не является общей проблемой?
1 ответ
Это не проблема, чтобы создать ваше дочернее окно позже, однако, как вы упомянули, оно должно быть создано из того же потока.
Например, вы можете создать дочернее окно внутри обработчика сообщений WM_COMMAND (например, когда пользователь нажимает на кнопку) или в качестве ответа на WM_TIMER.
Создание дочернего окна из другого потока - плохая идея, поскольку каждый поток имеет свою очередь сообщений. Однако, если вы хотите, чтобы другой поток инициировал создание окна, вы можете обойти его, отправив пользовательское сообщение в ваше окно:
- Определите ваше сообщение (например, #define WM_CREATEMYWINDOW WM_USER + 123)
Из другой ветки разместите его в своем окне:
PostMessage(g_hWnd, WM_CREATEMYWINDOW, 0, 0);
В вашей оконной процедуре создайте дочернее окно:
if (message == WM_CREATEMYWINDOW) hwndChild[i] = CreateWindow(...);