
- •1. Признаки сложных систем. Сложность, присущая программному обеспечению.
- •2. Компоненты объектно-ориентированного подхода.
- •3. Объекты и классы с точки зрения объектно-ориентированного проектирования.
- •4. Модели и диаграммы, используемые в объектно-ориентированном подходе.
- •5. Техника отладки.
- •6. Работа с многофайловыми проектами. Использование включаемых файлов.
- •9. Простое наследование. Контроль доступа к атрибутам класса.
- •10. Виртуальные функции (вф) и абстрактные классы.
- •11. Множественное и виртуальное наследование.Множественное наследование
- •12 Перегрузка операций
- •13. Шаблоны функций, макросы, inline-функции.
- •14. Шаблоны классов.
- •15. Обработка исключительных ситуаций, структурная обработка исключений.
- •16. Пространства имён. Кратко о механизме пространства имен
- •Зачем нужен механизм пространства имен?
- •Имитация средствами языка Си
- •Правило составления имени
- •Недостатки
- •17 Строки и потоки.
- •18.Стандартная библиотека: Контейнеры
- •19 Реализация устойчивости объектов средствами mfc.
- •20. Структура Windows-приложения WinApi
- •21. Структура Windows-приложения, использующего библиотеку mfc
- •Документы и их представление
- •22. Обработка сообщений
- •23. Контекст устройства
- •24.Объекты gdi
- •25.Использование контекста отображения в памяти.
- •26.Режимы отображения.
- •27.Работа с меню. Обработка сообщений.
- •28.Работа с диалогами. Обработка сообщений.
- •29. Работа с полями ввода и кнопками.
- •30. Работа со списками и выпадающими списками. Работа со списком
- •Работа с комбинированном списком
- •Инициализация
- •Операции со строками
- •31. Классы CimageList и CtreeCtrl. Класс cImageList
- •Изменение содержимого списка
- •32. Классы CimageList и ClistCtrl. Класс cImageList
- •Изменение содержимого списка
- •Создание просмотра списка
- •Работа со столбцами
- •Функции для работы со списком в целом
- •Рабочие области просмотра списка
- •Поиск и сортировка записей
- •33. Классы CprogressCtrl, cRichEdit Ctrl, CsliderCtrl, cSpinButton Ctrl.
- •34. Классы cPropertySheet и cPropertyPage.
- •35. Передача информации в диалог и обратно.
- •36. Работа со стандартными диалогами.
- •37.Обработка сообщений от клавиатуры и мыши(wm_char,wm_keYxxx,wm_xButtoNxxx,
- •38 Таймеры, использование времени простоя программы и локального цикла обработки сообщений.
- •39. Библиотеки динамической компоновки. Явная и неявная загрузка dll.
- •Согласование экспортируемых элементов с импортируемыми
23. Контекст устройства
В Windows включен особый слой абстракций – интерфейс графического устройства – GDI. Вместо того чтобы обращаться к оборудованию программа вызывает GDI-функции которые ссылаются на структуру данных – контекст устройства.
Контекст устройства (device context) Microsoft Windows — ключевой элемент GDI, служащий для представления физического устройства. С каждым объектом «контекст устройства» C++ связан контекст устройства Windows, идентифицируемый 32-разрядным описателем типа HDC. Библиотека MFC версии 6.0 предоставляет несколько классов контекста устройства. Базовый класс CDC содержит все необходимые для рисования функции-члены, включая несколько виртуальных. Все производные классы, за исключением CMetaFileDC, отличаются только конструкторами и деструкторами. Если Вы (или каркас приложения) создали объект производного класса контекста устройства, то указатель на CDC можно затем передать функции, например, OnDraw. Для дисплея обычно используют производные классы CclientDC и CWindowDC. Для других устройств, таких, как принтеры или буферы в памяти, используют объекты базового класса CDC. «Виртуальность» класса CDC — важная особенность каркаса приложения. В главе 19 Вы увидите, насколько легко написать код, работающий и с дисплеем, и с принтером. Оператор в OnDraw, например,
pDC->TextOut(0, 0, "Hello");
посылает текст на дисплей, принтер или в окно предварительного просмотра печати, в зависимости от класса объекта, на который ссылается параметр pDC функции CView.-.-OnDraw. Каркас приложения связывает описатели контекста устройства с объектами, представляющими контексты устройств дисплея и принтера.
Классы контекста дисплея CCIientDC и CWindowDC
В клиентскую область окна не входят рамка, заголовок и меню. Если создать объект CCIientDC, то получится контекст устройства, представляющий только эту область, — рисовать за ее пределами невозможно. Точка (0,0) обычно связана с верхним левым углом клиентской области. Как Вы увидите далее, объект CView соответствует дочернему окну, содержащемуся внутри отдельного окна-рамки, зачастую вместе с панелью инструментов, панелью состояния и линейками прокрутки. Все эти окна не входят в клиентскую область окна представления. Если, например, вверху окна имеется пристыкованная панель инструментов, то (0,0) соответствует точке непосредственно под левым краем панели. В случае, когда Вы создаете объект CWindowDC, точка (0,0) соответствует левому верхнему краю неклиентской области окна. С помощью этого полнооконного контекста устройства Вы можете рисовать по рамке окна, в области заголовка окна и т. д. Не забывайте, что у окна представления нет неклиентской области, поэтому CWindowDC более подходит для окон-рамок, а не для окон представлений.
Создание и уничтожение CDC-объектов
Важно своевременно уничтожать созданные Вами объекты CDC, когда работа с ними закончена. Microsoft Windows ограничивает число доступных контекстов устройства, и если не освободить контекст устройства Windows, небольшой участок памяти будет потерян до самого завершения программы. Чаще всего объект «контекст устройства» создается в обработчике сообщения, например, в OnLButtonDown. Проще всего гарантировать уничтожение объекта «контекст устройства» (и освобождение соответствующего контекста устройства Windows), создавая объект на стеке следующим образом:
void CMyView::OnLButtonDown(UINT nFlags, CPoint point) {CRect rect;
CCIientDC dc(this); // создание etc на стеке dc.GetClipBox(rect); // получение ограничивающего прямоугольника } // dc автоматически освобождается .
Обратите внимание: конструктор объекта CCIientDC принимает в качестве параметра указатель на окно. Деструктор CCIientDC вызывается при возврате управления из функции. Вы можете также получить указатель на контекст устройства с помощью функции CWnd::GetDC, как показано ниже. Не забывайте вызывать ReleaseDC для освобождения контекста устройства:
void CMyView::OnLButtonDown(UlNT nFlags, CPoint point) .
CRect rect;
CDC* pDC = GetDC();
dc.GetClipBox(rect);
ReleaseDC(pDC);
// указатель на внутренний объект CDC
// получение ограничивающего прямоугольника
// Не забывайте
ВНИМАНИЕ Нельзя удалять CDC-объект, указатель на который передается функции OnDraw. Удалением этого объекта управляет каркас приложения.
Состояние контекста устройства
Когда Вы используете CDC-объект для рисования, например, эллипса, то полученное на экране (или на принтере) изображение зависит от текущего «состояниям контекста устройства. Состояние контекста включает в себя:
• связанные с контекстом объекты для рисования, такие, как перья, кисти и шрифты;
• режим преобразования координат, определяющий масштаб элементов при их рисовании. (Мы уже экспериментировали с режимами преобразования координат в главе 4.);
• различные детали, например, параметры выравнивания текста и режим заполнения многоугольников.
Вы уже видели, что если выбрать, например, серую кисть перед рисованием эллипса, то внутренняя область эллипса закрашивается серым. Вновь созданный контекст устройства обладает некоторыми характеристиками по умолчанию, такими, как черное перо для границ фигур. Все остальные характеристики состояния назначаются при помощи функций-членов класса CDC. GDI-объекты выбирают в контекст устройства вызовом переопределенных функций SelectObject. В любой момент времени в контекст устройства можно выбрать только одно перо, одну кисть и один шрифт.