Я написал класс главного окна для системы с графическим интерфейсом, которую я пишу. В конструкторе главного окна он создает окно с помощью функции 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. Снова возникает вопрос: почему окно зависает и не реагирует на какие-либо манипуляции со строкой заголовка? Я не могу переместить это, минимизировать это, максимизировать это или закрыть это. Любая помощь будет принята с благодарностью. Заранее спасибо. С уважением, Энтони Дэниелс
Если вы не вызовете BeginPaint / EndPaint в обработчике WM_PAINT, вы получите бесконечный цикл, вызванный бесконечным количеством сообщений WM_PAINT.
Проблема заключалась в том, что цикл обработки событий находился в потоке, отличном от окна. Видимо это запрещено. Как только цикл обработки событий был перенесен в основной поток, все работает нормально.