Как уже упоминалось, чтобы увидеть точку на экране, информацию о цвете этой точки нужно занести в закрепленную за ней ячейку видеопамяти. Размер видеобуфера обычно позволяет хранить образы нескольких экранов, поэтому в контексте устройства необходимо иметь информацию об адресе закрепленного за экраном участка памяти. Если вместо адреса видеопамяти в контекст занести адрес блока системной памяти, то в ней также можно сформировать образ экрана функциями GDI. В этом случае контекст устройства называют контекстом памяти (в отличие от связанного с видеопамятью контекста изображения).

На физическом уровне видеобуфер организован не так, как системное ОЗУ. В зависимости от типа адаптера и выбранного графического режима обмен с видеобуфером может потребовать переключения битовых плоскостей (блоков памяти с одинаковыми адресами), банков памяти (участков видеобуфера, видимых в стандартном для хранения образа экрана диапазоне адресов) и выполнения иных дополнительных действий. Поэтому при создании контекста памяти образ экрана в системном ОЗУ имитирует организацию видеобуфера, связанного с уже существующим контекстом устройства. Контекст памяти hdcMem на базе существующего контекста устройства hdc создается следующей функцией:

hdcMem = CreateCompatibleDC(hdc)

Контекст hdcMem называется совместимым. Это значит, что рисунки из контекста памяти можно копировать в видеопамять, но он не является полной копией оригинала hdc. В частности, если в оригинале были созданы нестандартные объекты, то указатели на них в контекст памяти не скопируются, а функция Wi ndowFromDC ( hdcMem) возвратит пустой дескриптор, так как контекст hdc связан с окном, a hdcMem - с участком оперативной памяти. Следует помнить, что по умолчанию за контекстом hdcMem не закрепляется блок системной памяти, имитирующий видеобуфер для функций GDI. В качестве видеобуфера совместимый контекст использует ту область системной памяти, в которой расположен объект Bitmap.

Поэтому для рисования в созданный выше контекст hdcMem и отображения полученной картинки необходимо выполнить простую последовательность действий:


⇐ Предыдущая| |Следующая ⇒