Win32 Main Message Loop для OpenGL

Мой основной цикл сообщений в приложении Win32 OpenGL выглядит так:

// Inside wWinMain
bool bQuit = false;
while( bQuit == false )
{
DWORD dwReturn = ::MsgWaitForMultipleObjects( 0, NULL, FALSE, 12, QS_ALLINPUT );

if( dwReturn == WAIT_OBJECT_0 )
{
MSG msg;
BOOL bReturn = ::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE );
if( bReturn != FALSE )
{
if( msg.message == WM_QUIT )
bQuit = true;
::TranslateMessage( &msg );
::DispatchMessage( &msg );
}
}

if( dwReturn == WAIT_OBJECT_0 || dwReturn == WAIT_TIMEOUT )
{
RenderFrame();
::SwapBuffers( hDc );
}
}

Это работает почти нормально, у меня есть только одна проблема: если я нажимаю Alt + F4, чтобы закрыть окно, оно не закрывается сразу после того, как я отпущу клавишу, однако, если я наведу курсор мыши на окно, оно закроется мгновенно.

А) Почему это? Как мне изменить мой цикл?

B) Исходный код, который я обнаружил, не использовал MsgWaitForMultipleObjects, но постоянно вызывал RenderFrame. Я думаю, что слишком много времени процессора тратится на перерисовку экрана. Я прав? Как обычно, ты тратишь все свои лишние способности на рисование?

-4

Решение

ваша ошибка, которую вы называете PeekMessage только один раз в WAIT_OBJECT_0 но вам нужно запустить его в цикле while (::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE )) потому что мы можем иметь несколько сообщений здесь. и лучше использовать MsgWaitForMultipleObjectsEx вместо этого — попробуйте этот код:

bool bQuit = false;
while( !bQuit )// for (;;)
{
MSG msg;

switch(::MsgWaitForMultipleObjectsEx( 0, NULL, 12, QS_ALLINPUT, 0))
{
case WAIT_OBJECT_0:
while (::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ))
{
if( msg.message == WM_QUIT )
bQuit = true;// return;
::TranslateMessage( &msg );
::DispatchMessage( &msg );
}
case WAIT_TIMEOUT:
RenderFrame();
::SwapBuffers( hDc );
}
}

если я нажму Alt + F4, чтобы закрыть окно, оно не закроется сразу после того, как я
отпустите ключ

несколько сообщений, опубликованных в очереди сообщений при нажатии Alt+F4, MsgWaitForMultipleObjects вернуть, но вы обрабатываете не все это но только один

однако, если я наведу курсор мыши на окно, оно мгновенно закроется

новые сообщения (WM_MOUSEMOVE) размещено, но главное MsgWaitForMultipleObjects снова вернитесь и вы в конце обработаете все сообщения, связанные с закрытием процесса

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]