Sleep () не работает в winapi32? - PullRequest
       40

Sleep () не работает в winapi32?

2 голосов
/ 03 сентября 2011

Я все еще новичок в программировании GUI с использованием C ++ winapi32, и я обнаружил нечто странное Вот часть моего кода:

        InvalidateRect(hwnd,&rect, true);
        //Sleep(delay);
        MessageBox(hwnd, "Blahblah!", "blahblah",MB_OK | MB_ICONINFORMATION);
        InvalidateRect(hwnd,&rect, true);
        //Sleep(delay);
        MessageBox(hwnd, "Blahblah!", "blahblah",MB_OK | MB_ICONINFORMATION);

Я использую Invalidaterect, чтобы перекрасить часть своих окон, и я пытаюсь перекрашивать окна каждые 1 секунду или около того, чтобы изменения стали очевидными для глаз пользователя. Странно то, что Sleep, похоже, не влияет на мои окна, если за ним не следует команда MessageBox, хотя на самом деле я не хочу иметь команду MessageBox для каждой перекраски, потому что это слишком мешает.

Я пробовал 1000,2000, даже 10000 за задержку. Windoes замерзли во время сна, но перекрашивание выполняется только 1 раз в последней команде Sleep ...

Этот код является частью, скажем, void A (). А void A () вызывается void B ().

       //Message loop
       if(turn == 0)
       {
       B();
       }           

Есть ли альтернатива, которую я могу сделать, чтобы решить эту проблему?

О да, я использую MS Visual C ++ 2008 Express, кстати

Заранее благодарен за любую помощь по этому вопросу:)

1 Ответ

6 голосов
/ 03 сентября 2011

Важно то, что InvalidateRect ничего не рисует.Он только планирует содержимое окна, которое будет нарисовано (помещает сообщение WM_PAINT в очередь сообщений).Реальное рисование не произойдет, пока вы не вернетесь к циклу сообщений, и окно фактически не сможет обработать сообщение рисования.Таким образом, после последнего Sleep / MessageBox вы наконец возвращаетесь из своей функции, чтобы снова попасть в цикл сообщений, и в цикле сообщений вы, наконец, получаете сообщение WM_PAINT, которое представляет фактическое событие рисования, и обрабатываете это сообщение, чтобы перерисовать содержимое окна.

...