Ускорение GDI в Windows 7 / Растровые рисунки в память
======================================================

Моя программа GDI отлично работает в Windows XP, но в Windows Vista и 7 она выглядит довольно ужасно из-за отсутствия аппаратного ускорения GDI. Я вспоминаю, как несколько лет назад читал статью о том, что в Windows 7 добавлено аппаратное ускорение для некоторых функций GDI, включая функцию BitBlt (). Предположительно, если вы рисуете в битовую карту памяти, а затем используете BitBlt () для копирования изображения в главное окно, оно работает с той же скоростью, что и XP. Это правда?

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

В функции окна OnPaint () я добавил строку:

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

Спасибо за любой совет, который вы можете предложить.

AFAIK, вы получаете аппаратное ускорение для функций GDI во всех версиях Windows (я буду рад исправить это, если кто-то сможет объяснить это более подробно). Но в любом случае вы исправляете двойную буферизацию (о чем вы говорите), что обеспечивает значительное повышение производительности (и, что более важно, отсутствие мерцания) по сравнению с рисованием непосредственно на экране.

Я сделал довольно многое из этого и придумала метод, позволяющий вам использовать GDI и GDI + одновременно в ваших функциях рисования, но при этом выиграть от аппаратного ускорения BitBlt при рисовании на экране. GDI + не является аппаратно ускоренным AFAIK, но может быть очень полезен во многих более сложных методах рисования, поэтому может быть полезно иметь опцию.

Итак, мой базовый класс представления будет иметь следующие члены:

Тогда сам класс будет иметь такой код

Таким образом, вы можете либо просто рисовать прямо в DC памяти и вызывать InvalidateRect (), либо поместить весь свой код рисования в rcUpdateBitmap (), что было более удобно для того, как я его использовал. Вам необходимо вызвать vCreateScreenBuffer () в OnSize ().

Надеюсь, это даст вам некоторые идеи в любом случае. Двойная буферизация - определенно способ получить быстрый и не мерцающий интерфейс. Может потребоваться немного усилий, чтобы начать работу, но это определенно стоит того.



CMemDC:
<http://www.codeproject.com/Articles/33/Flicker-Free-Drawing-In-MFC>
[http://msdn.microsoft.com/en-us/library/cc308997(v=vs.90).aspx](https://msdn.microsoft.com/en-us/library/cc308997(v=vs.90).aspx)