Цикл сообщений Windows - PullRequest
1 голос
/ 16 июля 2009

Есть какая-то причина, по которой этот код не дошел до первого? Я получил то же самое из разных источников. Чем я сделал свою собственную инкапсуляцию. Все идет хорошо Окно создано, сообщения обрабатываются, события генерируются для ввода keyborad в клиентской области, gl canvas работает нормально (когда я заставляю его рисовать).

Единственная проблема в том, что цикл обработки сообщений никогда не покидает первый if. : / Я действительно застрял.

while (!done)                                       
{
    if (::PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
    {
        if (msg.message == WM_QUIT)                 
        {
            done = TRUE;                            
        }
        else                                        
        {
            ::TranslateMessage (&msg);              
            ::DispatchMessage (&msg);               
        }
    }
    else                                        
    {
        // Code is never reaching this!
        draw ();
        ::SwapBuffers(hDC);
        idle ();
    }
}
return msg.wParam;

Ответы [ 4 ]

7 голосов
/ 16 июля 2009

В вашем случае очередь сообщений никогда не должна быть пустой - почему? Ну, это зависит от того, что делает остальная часть вашей программы. Некоторые возможности:

  1. Ваш код отправляет новые сообщения в очередь таким образом, чтобы очередь не становилась пустой. Я бы предложил выйти из идентификаторов сообщений, когда они обрабатываются.

  2. Вы не обрабатываете сообщения рисования - из msdn: «Функция PeekMessage обычно не удаляет сообщения WM_PAINT из очереди. Сообщения WM_PAINT остаются в очереди до тех пор, пока не будут обработаны. Однако, если сообщение WM_PAINT имеет область обновления NULL, PeekMessage действительно удаляет его из очереди.»

Надеюсь, это поможет.

[Изменить] Для обработки WM_PAINT либо вызовите BeginPaint и EndPaint, либо перешлите на DefWindowProc

4 голосов
/ 16 июля 2009

Убедитесь, что вы правильно обрабатываете WM_PAINT .

Под этим подразумевается, что вы звоните BeginPaint и EndPaint из сообщения WM_PAINT , в противном случае вы будете путать Windows думая, что ваше приложение еще нужно нарисовать.

0 голосов
/ 16 июля 2009

PeekMessage вернет 0, только если в очереди сообщений нет сообщений. Поскольку в очереди сообщений есть сообщения, которые должны быть отправлены, он возвращает ненулевое значение, и ваше условие else никогда не выполняется

0 голосов
/ 16 июля 2009

Может быть, всегда есть сообщение, ожидающее?

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