2009-09-12 30 views
6

Soy nuevo en C++ nativo. En este momento, lo hice así cuando presiono el botón izquierdo del mouse, tiene un ciclo for que hace InvalidateRect y dibuja un rectángulo, e incrementa X por el tamaño del cuadro cada vez que itera. Pero, C++ es mucho más rápido y eficiente en el dibujo que C#, atrae todo esto al instante. Lo que me gustaría es que invalide el rectángulo, muestre el rectángulo, espere 50 ms y luego continúe el ciclo. Intenté dormir (50) pero todavía espera hasta que la pintura esté lista antes de mostrar el resultado. También probé PeekMessage pero no cambió nada. Cualquier ayuda sería apreciada. GraciasDoEvents equivalente para C++?

Respuesta

16

DoEvents básicamente se traduce como:

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, casi correcto, excepto que el valor de retorno de GetMessage no está marcado y WM_QUIT no se maneja correctamente. –

+2

Si GetMessage devuelve 0, entonces el mensaje WM_QUIT necesita ser reubicado (http://blogs.msdn.com/oldnewthing/archive/2005/02/22/378018.aspx). GetMessage también puede devolver -1, que se debe manejar. –

+0

@FilipNavara Tenía la intención de que esto solo muestre lo básico, pero tiene toda la razón, editado para mostrar los 3 casos posibles. –

2

estoy un poco oxidado en la API de Win32, pero la manera asíncrona de hacer esto sería:

  • invalida el rect
  • Conjunto una temporizador (ver a continuación) para enviar un mensaje después de 50 ms
  • Regrese al ciclo de eventos para permitir que ocurran eventos WM_PAINT
  • Al recibir el mensaje del temporizador, mueva el rect, luego repita

De esta manera se integra muy bien con el evento. Me doy cuenta de que esto no es exactamente lo que pides, pero pensé en mencionarlo como una posible solución de todos modos :)

EDITAR: Un rápido Google activa la llamada a la API de Windows [SetTimer] (http://msdn.microsoft.com/en-us/library/ms644906(VS.85,loband).aspx) que puedes usar para facilitar esto. El mensaje será un WM_TIMER.

+0

+1, esta es una solución mejor para un problema en particular. –