Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

4.10.4 Контекст памяти

Две функции — SetDIBitsToDevice и StretchDIBits позволяют вам воспроизвести массив битов на устройстве вывода. Тем не менее, даже если у вас есть описатель битового образа, то нет функции для рисования битового образа на поверхности отображения контекста устройства. Вы будете тщетно искать функцию, имеющую такой вид:

DrawBitmap(hdc, hBitmap, xStart, yStart); // Такой функции нет !!!

Эта функция копировала бы битовый образ в контекст устройства, заданный параметром hdc, начиная с логической точки (xStart, yStart). Мы напишем свою собственную функцию DrawBitmap позднее в этой главе. Однако для этого вам необходимо познакомиться с некоторыми концепциями, начиная с контекста памяти.

Контекст памяти (memory device context) — это контекст, имеющий поверхность отображения (display surface), существующую только в памяти. Вы можете создать контекст памяти, используя функцию CreateCompatibleDC:

hdcMem = CreateCompatibleDC(hdc);

Описатель hdc — описатель действительного открытого контекста устройства. Функция CreateCompatibleDC возвращает описатель контекста памяти. При создании контекста памяти все атрибуты устанавливаются в значения по умолчанию. Вы можете делать почти все, что вы захотите с этим контекстом памяти. Вы можете устанавливать атрибуты в значения, отличные от значений по умолчанию, получать текущие значения атрибутов, выбирать в него перья, кисти и регионы. И, конечно, вы можете даже рисовать на нем. Но это не имеет смысла делать прямо сейчас. И вот почему.

Когда вы впервые создаете контекст памяти, он имеет поверхность отображения, содержащую только 1 монохромный пиксель. Это очень маленькая поверхность отображения. (Не полагайтесь на то, что функция GetDeviceCaps сообщит вам это. Все значения HORZSIZE, VERTSIZE, HORZRES, VERTRES, BITSPIXEL и PLANES для hdcMem будут установлены в значения, связанные с исходным hdc. Если бы функция GetDeviceCaps в действительности возвращала истинные значения, связанные с контекстом памяти, когда он был впервые создан, то для индексов HORZRES, VERTRES, BITSPIXEL и PLANES эти значения были бы равны 1.) Вам надо увеличить поверхность отображения контекста памяти. Это осуществляется выбором битового образа в контекст памяти:

SelectObject(hdcMem, hBitmap);

Теперь поверхность отображения hdcMem имеет те же ширину, высоту и организацию цвета, что и битовый образ, описываемый hBitmap. Если начало координат окна и области вывода установлены по умолчанию, то логическая точка (0, 0) контекста памяти соответствует левому верхнему углу битового образа.

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

Ранее были рассмотрены различные функции для создания битовых образов. Вот одна из них:

hBitmap = CreateCompatibleBitmap(hdc, xWidth, yHeight);

Если hdc — это обычный описатель контекста устройства для дисплея или принтера, то число цветовых плоскостей и число битов на пиксель созданного битового образа совпадает с соответствующими характеристиками устройства. Однако, если hdc — это описатель контекста памяти (и в него еще не выбран битовый образ), то функция CreateCompatibleBitmap возвращает монохромный битовый образ шириной xWidth и высотой yHeight пикселей.

Битовый образ — объект GDI. Ранее в этой главе было показано, как использовать функцию SelectObject для выбора перьев, кистей или регионов в контекст устройства, а далее мы узнаем, как применять эту функцию для выбора шрифта в контекст устройства. С помощью функции SelectObject можно выбирать эти четыре объекта GDI в контекст памяти. Однако, вы не можете выбирать битовый образ в обычный контекст устройства — только в контекст памяти.

Когда закончится работа с контекстом памяти, его надо удалить:

DeleteDC(hdcMem);

Итак, вы можете сказать: "Очень хорошо. Но мы еще не решили проблему отображения битового образа на экране. Все что мы сделали — научились выбирать его в контекст памяти. Что теперь?" Теперь мы должны научиться переносить биты из одного контекста устройства в другой с помощью функции BitBlt.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]