Эквивалент DoEvents для C ++? - PullRequest
       11

Эквивалент DoEvents для C ++?

6 голосов
/ 12 сентября 2009

Я новичок в нативном с ++. Прямо сейчас я сделал это так, когда я нажимаю левую кнопку мыши, у него есть цикл for, который выполняет InvalidateRect и рисует прямоугольник, и увеличивает X на размер блока при каждой итерации. Но C ++ намного быстрее и эффективнее при рисовании, чем C #, что он рисует все это мгновенно. То, что я хотел бы, это сделать недействительным прямоугольник, показать прямоугольник, подождать 50 мс, а затем продолжить цикл. Я попробовал Sleep (50), но он все еще ждет, пока рисование не будет сделано, прежде чем показать результат. Я также попробовал PeekMessage, но это ничего не изменило. Любая помощь будет оценена. Спасибо

Ответы [ 2 ]

16 голосов
/ 12 сентября 2009

DoEvents в основном переводится как:

void DoEvents()
{
    MSG msg;
    BOOL result;

    while ( ::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE ) )
    {
        result = ::GetMessage(&msg, NULL, 0, 0);
        if (result == 0) // WM_QUIT
        {                
            ::PostQuitMessage(msg.wParam);
            break;
        }
        else if (result == -1)
        {
             // Handle errors/exit application, etc.
        }
        else 
        {
            ::TranslateMessage(&msg);
            :: DispatchMessage(&msg);
        }
    }
}
2 голосов
/ 12 сентября 2009

Я немного заржавел в Win32 API, но асинхронный способ сделать это будет:

  • Обесценить прямоугольник
  • Установите таймер (см. Ниже) для отправки сообщения через 50 мс
  • Возврат в цикл событий, чтобы события WM_PAINT происходили
  • Получив сообщение таймера, переместите прямоугольник и повторите

Этот способ прекрасно сочетается с управляемостью событиями. Я понимаю, что это не совсем то, о чем вы просите, но я решил упомянуть это как возможное решение в любом случае:)

РЕДАКТИРОВАТЬ: быстрый Google вызывает вызов Windows API [SetTimer] (http://msdn.microsoft.com/en-us/library/ms644906(VS.85,loband).aspx), который вы можете использовать для облегчения этого. Сообщение будет WM_TIMER.

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