CreateWindow зависает

0

Я написал класс основного окна для GUI-системы, которую я пишу. В конструкторе главного окна он создает окно с помощью функции CreateWindow(). Окно отображается отлично, как и ожидалось, однако я не могу захватить строку заголовка и перемещать его по экрану. Он полностью заморожен. Вот код в конструкторе.

//Set up window class
WNDCLASS wnd;
wnd.cbClsExtra = 0; 
wnd.cbWndExtra = 0;
wnd.hCursor = LoadCursor(0, IDC_ARROW);
wnd.hIcon = LoadIcon(0, IDI_WINLOGO);
wnd.lpszMenuName = 0;
wnd.style = 0;
wnd.hbrBackground = 0;
wnd.lpfnWndProc = WndProc;
wnd.hInstance = GetModuleHandle(NULL);
wnd.lpszClassName = L"GtMainWindow";

//Register window class
RegisterClass(&wnd);


this->m_winID = CreateWindow(
L"GtMainWindow",      /* Classname */
L"Windows App",       /* Title Text */
WS_OVERLAPPEDWINDOW,  /* default window */
CW_USEDEFAULT,        /* Windows decides the position */
CW_USEDEFAULT,        /* where the window ends up on the screen */
500,                  /* The programs width */
500,                  /* and height in pixels */
HWND_DESKTOP,         /* The window is a child-window to desktop */
NULL,                 /* No menu */
GetModuleHandle(NULL), /* Program Instance handler */
NULL                  /* No Window Creation data */
);
ShowWindow(m_winID,SW_SHOW);

Вот функция обратного вызова WinProc

//WndProc function
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch(msg) {
case WM_PAINT:
    {
        //GtWidget::PostPaint();
        return 0;
    }
case WM_CLOSE:
case WM_DESTROY:
    {
        PostQuitMessage(0);
        GtApplication* ptrApp = GtApplication::GetAppInstancePtr();
        ptrApp->Quit();
        return 0;
    }
}

return DefWindowProc(hWnd, msg, wParam, lParam);
}

Теперь у меня есть отдельный EventManager, который содержит всю обработку PeekMessage, которая находится внутри GtApplication. Вопрос снова заключается в том, почему окно замораживается и не реагирует на манипуляции с заголовком. Я не могу его переместить, минимизировать, максимизировать или закрыть. Любая помощь будет очень оценена. Заранее спасибо. С уважением, Энтони Дэниелс

  • 8
    Вы начали цикл сообщений?
  • 0
    Видимо, проверка DC для очистки устаревшей области рисования не входит в список приоритетов. Если вы не собираетесь этого делать, то DefWindowProc сделает это, чего вы, похоже, не допустите.
Показать ещё 1 комментарий
Теги:
user-interface

2 ответа

1
Лучший ответ

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

  • 0
    У меня та же проблема, что и у вас, я распечатал this_thread::get_id() из функций main и WindowProc и соответствия идентификатора.
1

Если вы не вызываете BeginPaint/EndPaint в обработчике WM_PAINT, вы получаете бесконечный цикл, вызванный бесконечным количеством сообщений WM_PAINT.

  • 0
    Я попытался добавить PAINTSTRUCT PS; HDC HDC; COLORREF crTxt, crBk; hdc = BeginPaint (hWnd, & ps); // GtWidget :: PostPaint (); EndPaint (hWnd, & ps); Это не сработало, оно все еще заморожено.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню