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

4.3 Контекст устройства

Перед тем, как начать рисовать, рассмотрим контекст устройства более подробно, чем в главе 3.

Если вы хотите рисовать на устройстве графического вывода (экране дисплея или принтере), сначала надо получить описатель контекста устройства (device context, DC). Передавая этот описатель, Windows тем самым дает вам право на использование самого устройства. Затем вы включаете этот описатель как параметр в функции GDI для того, чтобы сообщить Windows, на каком устройстве вы собираетесь рисовать.

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

Последующие вызовы функции TextOut будут использовать измененные значения атрибутов.

4.3.1 Получение описателя контекста устройства

Windows предоставляет несколько методов для получения описателя контекста устройства. Если вы получаете описатель контекста устройства в теле обработчика сообщения, вы должны освободить его (удалить, вернуть системе) перед выходом из оконной процедуры. После того, как вы освободите описатель контекста устройства, его значение теряет смысл.

Наиболее общий метод получения контекста устройства и его освобождения состоит в использовании функций BeginPaint и EndPaint при обработке сообщения WM_PAINT:

hdc = BeginPaint(hwnd, &ps);

[другие строки программы]

EndPaint(hwnd, &ps);

Переменная ps — это структура типа PAINTSTRUCT. Поле hdc этой структуры — это описатель контекста устройства, который возвращается функцией BeginPaint. Структура PAINTSTRUCT содержит также структуру типа RECT с именем rcPaint (прямоугольник), определяющую прямоугольную область, содержащую недействительный (требующий перерисовки) регион клиентской области окна. Получив описатель контекста устройства от функции BeginPaint, вы можете рисовать только в пределах этого региона. Функция BeginPaint делает этот регион действительным.

Программы для Windows могут также получать описатель контекста устройства в теле обработчика сообщения, отличного от WM_PAINT:

hdc = GetDC(hwnd);

[другие строки программы]

ReleaseDC(hwnd, hdc);

Полученный контекст устройства с описателем hwnd относится к клиентской (рабочей) области окна. Основная разница между использованием этих функций и комбинации функций BeginPaint и EndPaint состоит в том, что вы можете рисовать в пределах всей рабочей области окна, используя описатель контекста устройства, возвращенный функцией GetDC. Кроме того, функции GetDC и ReleaseDC не делают действительным (не требующим перерисовки) ни один недействительный регион клиентской области окна.

Программы для Windows могут также получать описатель контекста устройства, относящийся ко всему окну программы, а не только к его клиентской области:

hdc = GetWindowDC(hwnd);

[другие строки программы]

ReleaseDC(hwnd. hdc);

Этот контекст устройства включает заголовок окна, меню, полосы прокрутки и рамку окна в дополнение к клиентской области. Функция GetWindowDC редко используется в приложениях. Если вы хотите поэкспериментировать с ней, то вам следует обработать сообщение WM_NCPAINT ("nonclient paint", рисование неклиентской области), которое генерируется Windows для перерисовки неклиентской области окна.

Функции BeginPaint, GetDC и GetWindowDC получают контекст устройства, связанный с конкретным окном на экране. Более общая функция для получения описателя контекста устройства — это функция CreateDC:

hdc = CreateDC(pszDriver, pszDevice, pszOutput, pData);

[другие строки программы]

DeleteDC(hdc);

Например, вы можете получить описатель контекста устройства всего дисплея так:

hdc = CreateDC("DISPLAY", NULL, NULL, NULL);

Запись вне вашего окна обычно не принята, но это удобно для некоторых редко используемых приложений. (Хотя это и не документировано, вы можете получить описатель контекста устройства для экрана дисплея посредством вызова функции GetDC с параметром NULL.)

Иногда вам нужно только получить некоторую информацию о контексте устройства, и не надо ничего рисовать. В этих случаях вы можете получить описатель так называемого "информационного контекста" (information context), используя функцию CreateIC. Параметры этой функции такие же, как у функции CreateDC, например:

hdcInfo = CreateIC("DISPLAY", NULL, NULL, NULL);

[другие строки программы]

DeleteDC(hdcInfo);

Вы не можете осуществлять вывод на устройство, используя информационный контекст.

При работе с битовыми образами иногда полезно получить "контекст памяти" (memory device context):

hdcMem = CreateCompatibleDC(hdc);

[другие строки программы]

DeleteDC(hdcMem);

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

Как уже упоминалось раньше, метафайл — это набор вызовов GDI в двоичном виде. Вы можете создать метафайл, получая контекст метафайла:

hdcMeta = CreateMetaFile(pszFilename);

[другие строки программы]

hmf = CloseMetaFile(hdcMeta);

Пока контекст метафайла действителен, вызов GDI, который вы осуществляете, используя hdcMeta, не вызывает вывода на устройство, а записывается в метафайл. Когда вы вызываете CloseMetaFile, описатель контекста становится недействительным. Функция возвращает описатель метафайла (hmf ).

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