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

4.3.6 Атрибуты контекста устройства

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

Когда программа запрашивает описатель контекста устройства, Windows создает контекст устройства со значениями всех атрибутов по умолчанию. Атрибуты контекста устройства приведены в следующей таблице.

Программа может изменить или получить любой из этих атрибутов.

4.3.7 Сохранение контекста устройства

В этой главе вы столкнетесь с различными функциями, изменяющими атрибуты контекста устройства. Обычно Windows создает новый контекст устройства со значениями атрибутов по умолчанию, когда вы вызываете функции GetDC или BeginPaint. Все изменения атрибутов теряются, когда контекст устройства освобождается посредством вызова функций ReleaseDC или EndPaint. Если вашей программе необходимы значения атрибутов контекста устройства, отличные от значений по умолчанию, вам необходимо инициализировать контекст устройства каждый раз, когда вы получаете его описатель:

case WM_PAINT:

hdc = BeginPaint(hwnd, &ps);

[инициализация атрибутов контекста устройства]

[рисование в клиентской области окна]

EndPaint(hwnd, &ps);

return 0;

Хотя этот подход вполне приемлем, вы можете предпочесть, чтобы изменения атрибутов контекста устройства, сделанные вами, сохранялись, когда вы освобождаете контекст устройства, и использовались в следующий раз при вызове GetDC или BeginPaint. Можно этого добиться, включив флаг CS_OWNDC при регистрации класса окна:

wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;

Теперь каждое окно, которое вы создадите на базе этого класса окон, будет иметь свой собственный контекст устройства до тех пор, пока окно не будет уничтожено. Когда вы используете стиль CS_OWNDC, вам нужно только один раз проинициализировать атрибуты контекста устройства, скорее всего, при обработке сообщения WM_CREATE:

case WM_CREATE:

hdc = GetDC(hwnd);

[инициализация атрибутов контекста устройства]

ReleaseDC(hwnd, hdc);

Атрибуты сохраняют значения до тех пор, пока вы их не измените.

Стиль CS_OWNDC влияет только на контексты устройств, полученные от функций GetDC и BeginPaint, и не влияет на контексты, полученные от других функций (таких как GetWindowDC). Использование стиля CS_OWNDC имеет цену: Windows требует примерно 800 байтов для хранения контекста устройства для каждого окна, созданного с помощью этого стиля. Даже если вы используете CS_OWNDC, вы должны освободить контекст устройства перед выходом из оконной процедуры.

Вы можете также использовать стиль CS_CLASSDC:

wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_CLASSDC;

Использование этого стиля приводит к тому, что все окна такого базового класса разделяют один контекст устройства. Использование контекста устройства типа CS_CLASSDC сложнее, чем использование типа CS_OWNDC, потому что любые изменения атрибутов контекста устройства CS_CLASSDC, будут влиять на все окна, созданные на базе одного и того же базового класса. Это может привести к странным эффектам.

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

iSavedID = SaveDC(hdc);

Теперь вы изменяете атрибуты. Когда вы захотите вернуться к контексту устройства, существовавшему перед вызовом SaveDC, вы используете функцию:

RestoreDC(hdc, iSavedID);

Вы можете вызывать SaveDC любое число раз до вызова RestoreDC. Если вы хотите установить контекст устройства, существовавший перед последним вызовом функции SaveDC, вы вызываете:

RestoreDC(hdc, -1);

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