2009-09-12 2 views
6

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

ответ

16

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); 
     } 
    } 
} 
+3

+1, почти правильно, за исключением того, что возвращаемое значение GetMessage не проверено, а WM_QUIT неправильно обработано. –

+2

Если GetMessage возвращает 0, тогда сообщение WM_QUIT должно (http://blogs.msdn.com/oldnewthing/archive/2005/02/22/378018.aspx). GetMessage также может возвращать -1, который должен обрабатываться. –

+0

@FilipNavara Я предназначался для этого просто показать основы, но вы абсолютно правы - отредактированы, чтобы показать все 3 возможных случая. –

2

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

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

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

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

+0

+1, это лучшее решение для конкретной проблемы. –

Смежные вопросы