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++?
6
A
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);
}
}
}
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. –
Cuestiones relacionadas
- 1. C# Equivalente de VB 6 DoEvents
- 2. DoEvents en JavaScript
- 3. ¿Cómo hago "DoEvents" en WPF?
- 4. ¿Hay un equivalente de DoEvents en las macros de Visual Studio?
- 5. C# Uri.EscapeDatastring() equivalente para Java
- 6. Equivalente a #region para C++
- 7. Equivalente a window.setTimeout() para C++
- 8. MonoTouch.Dialog equivalente para Objective C?
- 9. equivalente C# para Delphi de
- 10. C# nulo coalescente operador equivalente para C++
- 11. DoEvents no hace los eventos ... ¿Por qué?
- 12. equivalente de C++ para memset en char *
- 13. Cualquier equivalente de "extendido" para C#?
- 14. ¿Hay un JavaScript equivalente para C# 'params'?
- 15. C++ CString equivalente en C#
- 16. ¿Hay un equivalente en C para las plantillas de C++?
- 17. lo que es c time_t equivalente para C#
- 18. C equivalente de C++ STL
- 19. C# ULONG_PTR Equivalente
- 20. Anotación Java equivalente C#
- 21. C# String.IsNullOrEmpty JavaScript equivalente
- 22. Application.DoEvents() -> Función equivalente en java?
- 23. GWT equivalente para .NET?
- 24. C# equivalente a shell_exec
- 25. C# equivalente a InStrRev
- 26. SAXParser equivalente en C#
- 27. popen equivalente en C++
- 28. DebugBreak() Equivalente en C#
- 29. iif equivalente en C#
- 30. C++ equivalente a java.lang.Integer.MIN_VALUE
+1, casi correcto, excepto que el valor de retorno de GetMessage no está marcado y WM_QUIT no se maneja correctamente. –
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. –
@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. –