Я новичок в родном C++. Прямо сейчас, я сделал это, когда я нажимаю левую кнопку мыши, у него есть цикл for, который делает InvalidateRect и рисует прямоугольник, и увеличивает размер X каждый раз при его итерации. Но C++ намного быстрее и эффективнее при рисовании, чем C#, что он все это мгновенно рисует. Я бы хотел, чтобы он сделал недействительным прямоугольник, покажите прямоугольник, подождите 50 мс, а затем продолжите цикл. Я попробовал Sleep (50), но он все еще ждет, пока картина не будет сделана, прежде чем показывать результат. Я также попробовал PeekMessage, но ничего не изменил. Любая помощь будет оценена по достоинству. Благодаряэквивалент DoEvents для C++?
6
A
ответ
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);
}
}
}
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, это лучшее решение для конкретной проблемы. –
Смежные вопросы
- 1. Android-эквивалент для приложения C#.DoEvents();
- 2. Silverlight OpenFileDialog эквивалент DoEvents
- 3. Есть ли эквивалент DoEvents в макросах Visual Studio?
- 4. Timer - альтернативная реализация DoEvents
- 5. DoEvents в DLL
- 6. Вызов DoEvents в Application.Idle
- 7. DoEvents, Ожидание и редактирование
- 8. Как мне «DoEvents» в WPF?
- 9. C# эквивалент для кода C
- 10. C# эквивалент для даного
- 11. jQuery эквивалент для C#
- 12. httplib эквивалент для C
- 13. Эквивалент C++ для fgets()?
- 14. C++ эквивалент для fscanf
- 15. CryptHashData эквивалент для C#?
- 16. C++ эквивалент для Lua?
- 17. MS Access, DoEvents для выхода из цикла
- 18. WPF «DoEvents»: как его реализовать?
- 19. DoEvents не делает событий ... Почему?
- 20. C/C++ эквивалент для C# System.Net.Mail
- 21. DoEvents с висячим приложением Webbrowser
- 22. Можно ли сравнить C# с прежними старыми VB6 DoEvents?
- 23. Ruby-эквивалент для C# BitConverter.ToSingle
- 24. C++ эквивалент для Encoding.Unicode.GetByteCount (str)?
- 25. MonoTouch.Dialog эквивалент для Objective C?
- 26. json_encode эквивалент для Objective-C
- 27. эквивалент контрольной суммы для C++?
- 28. C: Эквивалент pthread_barrier_t для окон
- 29. эквивалент GAsyncQueue glib для C++?
- 30. C# эквивалент для сериализации JSON
+1, почти правильно, за исключением того, что возвращаемое значение GetMessage не проверено, а WM_QUIT неправильно обработано. –
Если GetMessage возвращает 0, тогда сообщение WM_QUIT должно (http://blogs.msdn.com/oldnewthing/archive/2005/02/22/378018.aspx). GetMessage также может возвращать -1, который должен обрабатываться. –
@FilipNavara Я предназначался для этого просто показать основы, но вы абсолютно правы - отредактированы, чтобы показать все 3 возможных случая. –