Мой основной цикл сообщений в приложении 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. Я думаю, что слишком много времени процессора тратится на перерисовку экрана. Я прав? Как обычно, ты тратишь все свои лишние способности на рисование?
ваша ошибка, которую вы называете 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
снова вернитесь и вы в конце обработаете все сообщения, связанные с закрытием процесса
Других решений пока нет …