Win32 / C не может отображать окно сообщения сразу после CreateWindow - PullRequest
0 голосов
/ 11 ноября 2010

Я создаю окно своего приложения в коде и пытаюсь показать окно сообщения, как только оно появится. Но я не могу. Я вижу только недавно созданное окно, без окна сообщения. Если я закрываю приложение, закрывая его окно, окно сообщения появляется внезапно, как если бы оно ожидало в какой-то очереди, и показывается только при закрытии окна приложения. Способ, которым я создаю окно, как-то блокирует модальные окна сообщения? Примечание: строка MessageBox предназначена только для тестирования. Я возьму его для нормального использования, так как это, очевидно, будет мешать циклу GetMessage.

//start relevant section of WinMain:
WNDCLASS wc={0};
wc.lpfnWndProc = WindowProc;
...
if (!RegisterClass(&wc) || !CreateWindow("mc", "mc", WS_POPUPWINDOW|WS_CAPTION|WS_VISIBLE, 100, 50, 100, 100, NULL, NULL, hInstance, NULL)) {
  Error("Can't create window");
  return 0;
}
ShowWindow(win, SW_SHOWNORMAL);
MessageBox(0, "Test", 0 ,0);
while (GetMessage(&msg,NULL,0,0)>0) {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}
//end relevant section of WinMain

long FAR PASCAL WindowProc(HWND h, UINT m, WPARAM wParam, LPARAM l)
{
    switch (m) {
        //process other messages
        case WM_CREATE:
            win=h;
            //init stuff, paint something in the main window
        break;
    }
    return DefWindowProc(h, m, wParam, l);
}

1 Ответ

0 голосов
/ 12 ноября 2010

Звучит так, как будто вы не сразу возвращаетесь с WM_CREATE, как предполагалось, но весь срок службы вашего окна находится внутри CreateWindow.Таким образом, MessageBox на самом деле не вызывается до тех пор, пока ваше окно не станет мертвым, и попытка передать wnd, поскольку родительский элемент окна сообщения является недопустимым аргументом (окно больше не существует).

Вы не должнызвоните DefWindowProc для WM_CREATE.У вас не должно быть цикла сообщений (т.е. DispatchMessage) внутри WindowProc (исключение: цикл сообщений, обрабатывающий модальное диалоговое окно, являющееся дочерним элементом главного окна).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...