Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпора 35 стр [25 вопросов].doc
Скачиваний:
45
Добавлен:
15.06.2014
Размер:
384.51 Кб
Скачать
    1. История создания Windows. Архитектура Windows NT/2000. Операционная среда Win32. Основные системные файлы.

В 1981 году господствующей операционной системой стала MS-DOS. Ранние версии MS-DOS обеспечивали для пользователя интерфейс командной строки, отображая такие команды как DIR и TYPE, которые могли загружать выполняемые программы в оперативную память и предлагали для этих программ определенный интерфейс для доступа к файлам, считывания информации с клавиатуры, и отображения на принтере и на экране дисплея.

С 1983 по 1985 создавалась Microsoft Windows версии 1.0.

Windows версии 2.0 была создана в ноябре 1987 года. Эта версия содержала несколько изменений пользовательского интерфейса. Наиболее важное из этих изменений касалось использования перекрывающихся окон, а также содержала улучшенный интерфейс клавиатуры и манипулятора мышь, а также, отчасти, окон меню и диалога. В то время для Windows требовались только процессоры Intel 8086 или 8088, работающие в реальном режиме, при этом доступ осуществлялся к 1 мегабайту оперативной памяти.

Windows версии 3.0 появилась в 1992 году. Здесь были объединены ранние версии Windows/286 и Windows/386. Главным изменением в Windows 3.0 была поддержка защищенного режима процессоров Intel 80286, 80386 и 80486. Это позволило Windows и ее приложениям получить доступ к 16 мегабайтам оперативной памяти.

Windows версии 3.1 появилась в 1992 году. Сюда были включены такие важные свойства, как технология TrueType для шрифтов, multimedia и диалоговые окна общего пользования. Кроме этого Windows 3.1 работала только в защищенном режиме и требовала процессора 80286 или 80386 и, по крайней мере, одного мегабайта оперативной памяти.

Windows NT 3.51, появившаяся в июле 1993 года, стала первой версией Windows, поддерживающей 32-разрядную модель программирования для процессоров Intel 80386 и 80486, а также Pentium. Windows NT 3.51 имеет сплошное плоское 32-разрядное адресное пространство и 32-разрядные целые. Кроме этого Windows NT 3.51 переносима.

Windows 95 , иногда упоминающаяся как Windows версии 4.0, появилась в августе 1995 года. Также как Windows NT, Windows 95 поддерживает 32-разрядную модель программирования. Тем не менее она способна работать на компьютерах, имеющих всего 4 мегабайта оперативной памяти. Она многозадана, луше работает с сетью.

1998 год появление Windows98, 2000 год –Windows2000 илиWindowsME, 2001 –WindowsXP.

Под Windows любая программа становится резидентной. Одновременно несколько программ Windows могут иметь вывод на экран и выполняться. Каждая программа занимает на экране прямоугольное окно. Пользователь может перемещать окна по всему экрану, менять их размер, переключаться между разными программами и передавать данные от одной программы к другой. Первые версии Windows использовали многозадачность, названную "невытесняющей". Этот термин означал, что Windows не использовала системный таймер для распределения процессорного времени между разными программами, работающими в системе. Чтобы у них была возможность работать, программы сами должны были отдавать управление. В Windows 95 многозадачность является вытесняющей, программы сами по себе могут иметь несколько потоков, которые выполняются параллельно. Операционная система не сможет реализовать многозадачность без управления памятью. Так как одни программы запускаются, а другие завершаются, память фрагментируется. Система должна быть способной объединять свободное пространство.

Программы, работающие под Windows могут перераспределять память; размер программы может быть больше, чем размер оперативной памяти в каждый момент времени. Windows может удалить часть кодов выполняемой программы из памяти, а позднее вновь загрузить эти коды из EXE-файла. Пользователь может запустить несколько копий, называемых "экземплярами" программы; и у всех этих экземпляров в памяти оказывается совместно используемый ими код программы. Программы, запущенные в Windows, могут использовать функции из других файлов, которые называются "динамически подключаемыми библиотеками" (DLL). Windows содержит механизм для связи программ во время их работы с функциями из динамически подключаемых библиотек. Сама по себе операционная система Windows по существу является набором динамически подключаемых библиотек. Все основные функции Windows объявляются в заголовочных файлах. Главный заголовочный файл называется WINDOWS.H, и в этом файле содержится множество ссылок на другие заголовочные файлы. Эти заголовочные файлы имеются в любой среде программирования, поддерживающей Windows 95 и основанной на использовании языка С. Заголовочные файлы являются важной частью технической документации для Windows. EXE-файлы Windows содержат ссылки на различные динамически подключаемые библиотеки, функции которых в них используются. Когда программа для Windows загружается в оперативную память, вызовы в программе настраиваются на точки входа функций в динамически подключаемых библиотеках, которые, если этого еще не произошло, тоже загружаются в оперативную память. Windows 95 — это вытесняющая многозадачная среда. Это означает, что если программа работает слишком долго, то Windows может разрешить пользователю переключиться на другую программу.

    1. Структура Windows-приложения. Взаимосвязь с внешней средой. Очередь сообщений. Алгоритм работы функции GetMessage.

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

Сообщения, которые приложение получает от Windows о событиях, относящихся к клавиатуре, различаются на "аппаратные" и "символьные". Такое положение соответствует двум представлениям о клавиатуре. Во-первых, вы можете считать клавиатуру набором клавиш. В клавиатуре имеется только одна клавиша <A>. Нажатие на эту клавишу является аппаратным событием. Отпускание этой клавиши является аппаратным событием. Но клавиатура также является устройством ввода, генерирующем отображаемые символы. Клавиша <А>, в зависимости от состояния клавиш <Ctrl>, <Shift> и <CapsLock>, может стать источником нескольких символов. Некоторые клавиши не генерируют символов. Это такие клавиши, как клавиши переключения, функциональные клавиши, клавиши управления курсором и специальные клавиши, такие как Insert и Delete. Для таких клавиш Windows вырабатывает только аппаратные сообщения.

Когда нажата клавиша, Windows помещает либо сообщение WM_KEYDOWN, либо сообщение WM_SYSKEYDOWN в очередь сообщений окна, имеющего фокус ввода. Когда отпусщена клавиша, Windows помещает либо сообщение WM_KEYUP, либо сообщение WM_SYSKEYUP в очередь сообщений. Аппаратные сообщения:

Клавиша нажата

Клавиша отпущена

Несистемные сообщения

WM_KEYDOWN

WM_KEYUP

Системные сообщения

WM_SYSKEYDOWN

WM_SYSKEYUP

Аппаратные сообщения клавиатуры становятся в очередь.

Префикс "SYS" в WM_SYSKEYDOWN и WM_SYSKEYUP означает "системное" и относится к аппаратным сообщениям клавиатуры, которые больше важны для Windows, чем для приложений Windows. Сообщения WM_SYSKEYDOWN и WM_SYSKEYUP обычно вырабатываются при нажатии клавиш в сочетании с клавишей <Alt>. Эти сообщения вызывают опции меню программы или системного меню, или используются для системных функций. Программы обычно игнорируют сообщения WM_SYSKEYDOWN и WM_SYSKEYUP и передают их DefWindowProc. Сообщения WM_KEYDOWN и WM_KEYUP обычно вырабатываются для клавиш, которые нажимаются и отпускаются без участия клавиши <Alt>. Если сообщением является WM_KEYDOWN или WM_SYSKEYDOWN и, если нажатие клавиши в сочетании с положением клавиши сдвига генерирует символ, тогда TranslateMessage помещает символьное сообщение в очередь сообщений. Это символьное сообщение будет следующим, после сообщения о нажатии клавиши, которое функция GetMessage извлечет из очереди сообщений.

Существует четыре символьных сообщения:

Символы

Немые символы

Несистемные символы:

WM_CHAR

WM_DEADCHAR

Системные символы:

WM_SYSCHAR

WM_SYSDEADCHAR

Сообщения WM_CHAR и WM_DEADCHAR являются следствием сообщений WM_KEYDOWN. Сообщения WM_SYSCHAR и WM_SYSDEADCHAR являются следствием сообщений WM_SYSKEYDOWN. Все сообщения, за исключением WM_CHAR, игнорируются.

Символьные сообщения доставляются в оконную процедуру в промежутке между аппаратными сообщениями клавиатуры. Сама по себе клавиша <Shift> не вырабатывает символьного сообщения. В программах для Windows клавиша <Ctrl> иногда используется с клавишами букв в качестве быстрых клавиш, в таком случае сообщения от буквенных клавиш не преобразуются в символьные сообщения. Если Windows-программе необходимо обрабатывать символы клавиатуры, то она будет обрабатывать сообщения WM_CHAR.

Одни и те же сообщения могут быть и "синхронные" и "асинхронные". Cинхронными сообщениями называются сообщения, которые Windows помещает в очередь сообщений программы, и которые извлекаются и диспетчеризуются в цикле обработки сообщений. Асинхронные сообщения передаются непосредственно окну, когда Windows вызывает оконную процедуру. В результате оконная процедура получает все предназначенные для окна сообщения, как синхронные, так и асинхронные. Синхронными становятся сообщения, в основном, тогда, когда они являются результатом пользовательского ввода путем нажатия клавиш (например, WM_KEYDOWN и WM_KEYUP), это символы, введенные с клавиатуры (WM_CHAR), результат движения мыши (WM_MOUSEMOVE) и щелчков кнопки мыши (WM_LBOTTONDOWN). Кроме этого синхронные сообщения включают в себя сообщение от таймера (WM_TIMER), сообщение о необходимости плановой перерисовки (WM_PAINT) и сообщение о выходе из программы (WM_QUIT). Сообщения становятся асинхронными во всех остальных случаях. Часто асинхронные сообщения являются результатом синхронных.

    1. Структура и типология сообщений в Win32. Классификация сообщений. Очередь сообщений, функции работы с ней.

    1. Организация асинхронного ввода. Сообщения от манипулятора типа «мышь». Сообщения от клавиатуры.

Сообщения мыши

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

Кнопка

Нажатие

Отпускание

Двойной щелчок

Левая

WM_LBUTTONDOWN

WM_LBUTTONUP

WM_LBUTTONDBLCLK

Средняя

WM_MBUTTONDOWN

WM_MBUTTONUP

WM_MBUTTONDBLCLK

Правая

WM_RBUTTONDOWN

WM_RBUTTONUP

WM_RBUTTONDBLCLK

Для всех этих сообщений значение параметра lParam содержит положение мыши. Младшее слово — это координата х, а старшее слово — координата y относительно верхнего левого угла рабочей области окна. При движении мыши по рабочей области окна, Windows не вырабатывает сообщение WM_MOUSEMOVE для всех возможных положений мыши. Количество сообщений WM_MOUSEMOVE, которые получает программа, зависит от устройства мыши и от скорости, с которой оконная процедура может обрабатывать сообщения о движении мыши. Если щелкнуть левой кнопкой мыши в рабочей области неактивного окна, Windows сделает активным окно, в котором произведен щелчок, и затем передаст оконной процедуре сообщение WM_LBUTTONDOWN.

Двойные щелчки клавиш мыши

Чтобы оконная процедура получала сообщения двойного щелчка мыши, то нужно включить идентификатор CS_DBLCLKS при задании стиля окна в классе окна перед вызовом функции RegisterClassEx:

wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;

Если не включать CS_DBLCLKS в стиль окна, и пользователь дважды в быстром темпе щелкнет левой кнопкой мыши, то оконная процедура получит следующие сообщения: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDOWN и WM_LBUTTONUP. Если включить в класс окна идентификатор CS_DBLCLKS, то оконная процедура при двойном щелчке мыши получает следующие сообщения: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK и WM_LBUTTONUP. Сообщение WM_LBUTTONDBLCLK просто заменяет второе сообщение WM_LBUTTONDOWN.

Сообщения мыши нерабочей области

Если мышь оказывается вне рабочей области окна, но все еще внутри окна, Windows посылает оконной процедуре сообщения мыши "нерабочей области". Нерабочая область включает в себя панель заголовка, меню и полосы прокрутки окна. Они просто передаются в DefWindowProc. Сообщения мыши нерабочей области почти полностью такие же, как и сообщения мыши рабочей области. В названия сообщений входят буквы "NC", что означает "нерабочая". Если мышь перемещается внутри нерабочей области окна, то оконная процедура получает сообщение WM_NCMOUSEMOVE. Однако, параметр wParam показывает зону нерабочей области, в которой произошло перемещение или щелчок мыши. Переменная lParam содержит в младшем слове значение координаты х, а в старшем — y. Однако, эти координаты являются координатами экрана, а не координатами рабочей области, как это было у сообщений мыши рабочей области.

Оконная процедура обычно получает сообщения мыши только тогда, когда курсор мыши находится в рабочей или в нерабочей области окна. Но программе может понадобиться получать сообщения мыши и тогда, когда курсор мыши находится вне окна. Если это так, то программа может произвести "захват" мыши при помощи функции GetCapture, освобождение мыши - RealeseCapture.

Сообщения клавиатуры

Некоторые приложения могут иметь больше одного окна, и клавиатура должна разделяться между этими окнами в рамках одного и того же приложения. Когда на клавиатуре нажата клавиша, только одна оконная процедура может получить сообщение об этом. Окно, которое получает это сообщение клавиатуры, является окном, имеющим "фокус ввода". Окно, имеющее фокус ввода — это активное окно. Определить активное окно обычно достаточно просто. Обрабатывая сообщения WM_SETFOCUS и WM_KILLFOCUS, оконная процедура может определить, когда окно имеет фокус ввода. WM_SETFOCUS показывает, что окно получило фокус ввода, а WM_KILLFOCUS, что окно потеряло его. Сообщения, которые приложение получает от Windows о событиях, относящихся к клавиатуре, различаются на "аппаратные" и "символьные".(3 вопрос)

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

  • CreateCaret— создает связанную с окном каретку.

  • SetCaretPos— устанавливает положение каретки в окне.

  • ShowCaret— показывает каретку.

  • HideCaret— прячет каретку.

  • DestroyCaret— удаляет каретку.

  • GetCaretPos – получает положение каретки.

Оконная процедура вызывает функцию CreateCaretпри обработке сообщения WM_SETFOCUS и функциюDestroyCaretпри обработке сообщения WM_KILLFOCUS.

    1. Система окон. Типология окон. Регистрация класса окна. Функции работы с окнами.

Типология окон – конспект.

Окно всегда создается на основе класса окна. Класс окна идентифицирует оконную процедуру, которая выполняет процесс обработки сообщений, поступающих окну. На основе одного класса окна можно создать несколько окон. Класс окна определяет оконную процедуру и некоторые другие характеристики окон, создаваемых на основе этого класса. Перед созданием окна для программы необходимо зарегистрировать класс окна путем вызова функции RegisterClassEx. Это расширенная версия функции RegisterClass из предыдущих версий Windows. У функции RegisterClassEx имеется один параметр: указатель на структуру типа WNDCLASSEX. Структура WNDCLASSEX определяется в заголовочного файла Windows следующим образом:

typedef struct tagWNDCLASSEX

{

UINTcbSize; //длина структуры

UINTstyle; //стиль класса окна

WNDPROClpfnWndProc; //адрес оконной процедуры

intcbClsExtra; //доп. пространство в структуре класса

intcbWndExtra; // доп. пространство в структуре окна

HINSTANCEhInstance; //описатель экземпляра программы

HICONhIcon; // установка иконки

HCURSORhCursor; // загружает стандартный курсор

HBRUSHhbrBackground; // цвет фона

LPCSTRlpszMenuName; // меню класса окна

LPCSTRlpszClassName; //имя класса окна

HICONhIconSm; // установка иконки

}

WNDCLASSEX;

Префиксы LP и lp означают "длинный указатель". Приставка lpfn означает "длинный указатель на функцию". Приставка cbозначает "счетчик байтов". Префикс hbr — это "описатель кисти".

В WinMain нужно определить структуру типа WNDCLASSEX. Затем вызывается

RegisterClassEx (&wndclass).

Функции работы с окнами

Создание окна.

hwnd=CreateWindow(szAppName, //имя класса окна

"The Hello Program", //заголовок окна

WS_OVERLAPPEDWINDOW, //стиль окна

CW_USEDEFAULT, //начальное положение по x

CW_USEDEFAULT, //начальное положение по y

CW_USEDEFAULT, //начальный размер по x

CW_USEDEFAULT, //начальный размер по y

NULL, //описатель родительского окна

NULL, //описатель меню окна

hInstance, //описатель экземпляра программы

NULL); //параметры создания

Вызов CreateWindow возвращает описатель созданного окна. Этот описатель хранится в переменной hwnd, которая имеет тип HWND. У каждого окна в Windows имеется описатель.

Отображение окна

ShowWindow (hwnd, iCmdShow);

Первым параметром является описатель только что созданного функцией CreateWindow окна. Вторым параметром является величина iCmdShow, передаваемая в качестве параметра функции WinMain. Он задает начальный вид окна на экране. Если iCmdShow имеет значение SW_SHOWNORMAL (т. е. 1), на экран выводится обычное окно. Если iCmdShow имеет значение SW_SHOWMINNOACTIVE (т. е. 7), то окно не выводится, а на панели задач появляются его имя и иконка. Функция ShowWindow выводит окно на экран.

UpdateWindow (hwnd);

вызывает затем перерисовку рабочей области.

Удаление она.

DestroyWindow(HWND hwnd);Функция послает сообщение WM_DESTROY и удаляет фокус ввода.

Перемещение окна.

BOOL SetWindowPos ( HWND hWnd, // описатель окна

HWND hWndInsertAfter, //описатель окна

int X, //новое положение по х

int Y, // новое положение по у

int cx, // новый размер по х

int cy, // новый размер по у

UINT uFlags ); // флаг, отмечающий новые установки окна

В случае успеха возвращает ненулевой результат.

MoveWindow(HWND,int,int,int,int,bool)

    1. Основные понятия GDI. Основные графические примитивы GDI.

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

Типы функций

В основном, функции GDI могут быть разбиты на несколько крупных групп. Это группы не имеют четких границ и частично перекрываются.

  • Функции, которые получают (или создают) и освобождают (или уничтожают) контекст устройства. Функции GetDC и ReleaseDC позволяют сделать это внутри обработчиков сообщений, отличных от WM_PAINT. Функции BeginPaint и EndPaint используются в теле обработчика сообщения WM_PAINT для рисования.

  • Функции, которые получают информацию о контексте устройства.

  • Функции рисования.

  • Функции, которые устанавливают и получают атрибуты контекста устройства. Атрибут контекста устройства определяет различные особенности работы функции рисования. Все атрибуты контекста устройства имеют значение по умолчанию, которое устанавливается, при получении контекста устройства. Для всех функций Set есть функции Get, позволяющие получить текущее значение атрибута контекста устройства.

  • Функции, которые работают с объектами GDI. Именно эти функции вносят в GDI некоторый беспорядок.

Примитивы GDI

Типы графических объектов, выводимых на экран или принтер, которые могут быть разделены на несколько категорий, часто называют "примитивами". Это:

  • Прямые (отрезки) и кривые.

  • Закрашенные области.

  • Битовые шаблоны (растровые шаблоны, растровые образы). Битовые шаблоны — это двумерный массив битов, соответствующий пикселям устройства отображения. Это базовый инструмент в растровой графике. Битовые образы используются, в основном, для отображения сложных изображений на дисплее или принтере. Битовые образы также используются для отображения маленьких картинок, таких как значки, курсоры мыши, кнопки панели инструментов программ, которые нужно быстро нарисовать.

  • Текст.

Другие аспекты GDI не так легко классифицируются. Это:

  • Режимы масштабирования и преобразования позволяют рисовать, задавая размеры в дюймах, в миллиметрах, или других единицах измерения.

  • Метафайлы. Метафайл — это набор вызовов команд GDI, сохраненный в двоичном виде. Метафайлы, в основном, используются для передачи изображений векторной графики через буфер обмена.

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

  • Пути. Путь — это набор отрезков и кривых, хранящихся внутри GDI. Они могут использоваться для рисования, закрашивания и при отсечении. Пути могут быть преобразованы в регионы.

  • Отсечение. Рисование может быть ограничено некоторой областью рабочего пространства окна. Это и называется отсечением, область отсечения может быть прямоугольной или любой другой. Отсечение, как правило, задается регионом или путем.

  • Палитры. Использование привычных палитр обычно ограничено способностью дисплея показывать не более 256 цветов. Windows резервирует только 20 из этих цветов для использования системой.

  • Печать

    1. Контекст устройства. Классификация контекстов устройств. Функции работы с контекстами устройств.

Контекст устройства – структура, которая описывает связь приложения с конкретным устройством вывода. Чтобы нарисовать что-нибудь на устройстве графического вывода, сначала надо получить описатель контекста устройства (DC). Затем этот описатель включается как параметр в функции GDI для того, чтобы сообщить Windows, на каком устройстве будет происходить рисование. Контекст устройства содержит много текущих атрибутов, определяющих поведение функций GDI при работе с устройством. Эти атрибуты позволяют включать в вызовы функций GDI только начальные координаты или размеры.

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

hdc = BeginPaint (hwnd, &ps);

EndPaint (hwnd, &ps);

Поле hdc этой структуры — это описатель контекста устройства, который возвращается функцией BeginPaint. Получив описатель контекста устройства от функции BeginPaint, можно рисовать только в пределах этого региона. Функция BeginPaint делает этот регион действительным.

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

hdc = GetDC (hwnd);

ReleaseDC (hwnd, hdc);

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

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

hdc = GetWindowDC (hwnd);

ReleaseDC (hwnd. hdc);

Этот контекст устройства включает заголовок окна, меню, полосы прокрутки и рамку окна в дополнение к клиентской области. Функции BeginPaint, GetDC и GetWindowDC получают контекст устройства, связанный с конкретным окном на экране.

Более общая функция для получения описателя контекста устройства — это функция CreateDC (создается произвольный КУ, ей передается его имя и параметры):

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

DeleteDC (hdc);

Используя функцию CreateIC можно создать информационный КУ. Параметры этой функции такие же, как у функции CreateDC.

При работе с битовыми образами иногда может быть полезно получить "контекст памяти" для временного хранения информации:

hdcMem = CreateCompatibleDC (hdc);

DeleteDC (hdcMem);

Можно создать метафайл, получая контекст метафайла:

hdcMeta = CreateMetaFile (pszFilename);

hmf = CloseMetaFile (hdcMeta);

Получение информации из контекста устройства. Можно получить эту информацию посредством вызова функции GetDeviceCaps:

iValue = GetDeviceCaps (hdc, iIndex);

Параметр iIndex — один из 28 идентификаторов, определенных в заголовочном файле Windows. Можно также использовать функцию GetDeviceCaps для определения возможностей устройства по обработке различных типов графики.

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

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

Чтобы изменения атрибутов контекста устройства сохранялись, когда освобождается контекст устройства, и использовались в следующий раз при вызове 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_CLASSDC:

wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_CLASSDC;

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

iSavedID = SaveDC (hdc);

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

RestoreDC (hdc, iSavedID);