Опубликован: 10.03.2009 | Доступ: свободный | Студентов: 2297 / 280 | Оценка: 4.31 / 4.07 | Длительность: 09:23:00
Лекция 2:

Библиотека классов MFC

Основные методы класса CDC контекста устройства

Из всех методов класса CDC можно выделить две основные группы: функции создания и настройки контекста устройства и функции рисования. Рассмотрим их подробнее.

BOOL CreateDC(LPCTSTR lpszDriverName, LPCTSTR lpszDeviceName, LPCTSTR lpszOutput, const void* lpInitData)

Это основная функция для инициализации контекста устройства. Первый параметр – указатель на строку с именем драйвера устройства. Второй параметр – указатель на строку с именем устройства, необходим, если драйвер поддерживает несколько устройств. Третий параметр – указатель на строку с именем файла или порта, куда будет осуществляться вывод. Четвертый – содержит особые параметры для настройки данного устройства. Функция возвращает true или false в зависимости от успеха или неудачи. Эта функция редко используется, обычно каркас MFC сам создает необходимый контекст.

BOOL CreateCompatibleDC(CDC* pDC)

Создает в памяти объект контекста устройства, указатель на который передается в качестве параметра, совместимый с данным.

SelectObject(…)

Это основная функция для связи с контекстом устройства GDI объекта. Рассмотри подробнее ее прототип. CPen* SelectObject (CPen* pPen) – связывает перо, указатель на которое передан в качестве параметра, с контекстом устройства. Возвращает указатель на перо, которое находилось в контексте устройства, до вызова функции. При неудаче возвращает NULL. Далее приведены перегруженные варианты данной функции.

CBrush* SelectObject(CBrush* pBrush)
virtual CFont* SeiectObject (CFont* pFont) 
CBitmap* SelectObject (CBitmap* pBitmap) 
int SelectObject (CRgn* pRgn)

В зависимости от типа параметра с контекстом устройства связывается соответствующий GDI объект.

virtual CGdiObject* SelectStockObject (int nlndex)

Связывает с контекстом один из стандартных объектов, идентификатор которого передается в качестве параметра. Также как и SelectObject(…), возвращает указатель на объект, который был связан с контекстом до ее вызова, в случае успеха, в случае неудачи – NULL.

CPen* GetCurrentPen( ) const

Возвращает указатель на выбранное в контекст перо. Далее приведены примеры аналогичных функций.

CPalette* GetCurrentPalette( ) const
CBrush* GetCurrentBrush( ) const

Функции с префиксом Get возвращают определенные параметры контекста устройства.

int SetBkMode (int nBkMode)

Устанавливает режим закрашивания фона. В качестве параметра передается идентификатор, определяющий тип закрашивания. Возвращает идентификатор предыдущего типа закрашивания.

Функции для преобразования системы координат

Будут далее рассмотрены подробнее. Ниже приведены их прототипы.

virtual int SetMapMode(int nMapMode)
virtual CPoint SetViewportOrg(CPoint point) 
СPoint SetWindowOrg(CPoint point)
virtual CSize SetViewportExt(CSize size)
virtual CSize SetWindowExt(CSize size)
void DPtoLP(LPPOINT lpPoints, int nCount = 1) const
void LPtoDP(LPPOINT lpPoints, int nCount = 1) const

СOLORREF SetPixel(int X, int Y, COLORREF Color)

Закрашивает пиксель области с координатами (X,Y) переданными в качестве первых двух аргументов цветом Color (третий аргумент функции). Возвращает цвет, который имел пиксель до вызова данной функции.

BOOL Rectangle(int upX, int upY, int lowX, int lowY)

Функция, которая рисует прямоугольник загруженным в контекст пером и заполняет его загруженной в контекст кистью. В качестве аргументов передаются координаты противоположных углов.

BOOL RoundRect(int upX, int upY, int lowX, int lowY, int curveX, int curveY)

Рисует и заполняет текущей кистью контекста прямоугольник со скругленными углами. Параметры curveX и curveY задают ширину и высоту эллипса, определяющего дугу для скругленных углов.

BOOL Ellipse(int upX, int upY, int lowX, int lowY)

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

CPoint MoveTo(CPoint point)

Перемещает фокус в точку point. Возвращает предыдущие координаты фокуса.

BOOL LineTo(POINT point)

Проводит линию пером, загруженным в контекст устройства, из фокуса в точку, переданную функции в качестве параметра.

Битовые образы

Битовые образы – очень важная часть Windows. При хранении битовых образов в отдельном файле, обычно используется расширение BMP (это единственный растровый формат, который напрямую поддерживается Windows). Битовые образы могут храниться и в ресурсах. Битовые образы используются чаще, чем все остальные ресурсы. Это объясняется наличием для них чрезвычайно мощной поддержки. В Windows многие вещи, которые можно легко нарисовать программно, отображаются с помощью готовых битовых образов. Например, кнопки в нажатом и отпущенном состоянии, каркасы для целых окон. Так как компьютеры теперь имеют большие жесткие диски, то выбор между программным рисованием объекта и готовой картинкой часто однозначно решается в пользу последней.

Создание битовых образов

В MFC битовые образы описываются классом CBitmap. Для их создания можно использовать либо ресурсный редактор, либо импортировать в ресурсы готовые файлы BMP, созданные при помощи графических пакетов. Битовый образ является таким же ресурсом, как иконка, или диалог. Необходимо помнить, что область ресурсов с битовыми образами в EXE-файле может занимать большой размер. Но это не критично, так как ресурсы автоматически не загружаются в память.

Вывод битового образа на экран

Когда битовый образ помещен в ресурсы, его можно выводить на экран. Сначала необходимо создать объект типа CBitmap и с помощью функции LoadBitmap() загрузить в него битовый образ из ресурсов. Прототип функции:

BOOL CBitmap::LoadBitmap(LPCSTR ResourceName);

Параметр определяет строковый идентификатор ресурса. После загрузки битового образа, его необходимо вывести в клиентскую область окна. Для этого обработчик WM_PAINT должен содержать приблизительно такой код (предполагается, что битовый образ загружен в объект backgroundBitmap ):

CPaintDC clientDC(this);
CDC memDC; // Контекст памяти
// Создать совместимый контекст памяти 
memDC.CreateCompatibleDC(&clientDC);
// Выбрать битовый образ в контекст устройства
memDC.SelectObject(&backgroundBitmap);
// Получить характеристики битового образа в структуру BITMAP
BITMAP bmp;
backgroundBitmap.GetBitmap(&bmp); 
// Скопировать битовый образ из контекста памяти в контекст клиентской области
clientDC.BitBlt(0, 0, bmp.bmWidth, bmp.bmHeight, &memDC, 0, 0, SRCCOPY);

Сначала объявляются два контекста устройства. Первый связан с текущим окном. Второй не инициализирован и предназначен для области памяти, в которой будет храниться изображение. Затем, с помощью функции CreateCompatibleDC(…), этот контекст объявляется совместимым с контекстом окна. Функция имеет прототип:

virtual BOOL CDC::CreateCompatibleDC(CDC *pDC);

Область памяти используется для вывода изображения на экран. Перед выводом на экран изображение должно быть выбрано в контекст устройства, связанный с областью памяти, с помощью функции SelectObject(…). Мы используем ее вариант с прототипом:

CBitmap *CDC::SelectObject(CBitmap *pBmp);

Параметр pBmp – это указатель на объект битового образа. Для вывода изображения на экран используется функция BitBlt(…), которая копирует изображение из исходного контекста устройства в контекст, связанный с вызывающим функцию объектом. Прототип функции такой:

BOOL CDC::BitBlt(int x, int y, int Width, int Height, CDC *pSourceDC, int SourceX, int SourceY, DWORD RasterOpCode);

Первые два параметра задают координаты начальной точки изображения. Размеры изображения задают следующие два параметра. Параметр pSourceDC является указателем на исходный контекст устройства. Координаты SourceX и SourceY задают левый верхний угол изображения и обычно равны 0. Последний параметр задает код операции, которая будет проделана при передаче изображения из одного контекста в другой. Мы будем использовать только значение SRCCOPY, в этом случае изображение просто копируется. Существует также много других констант. Следует отметить, что указанным методом нельзя корректно выводить битовые образы более чем с 16 цветами в видеорежимах с 256 цветами. В режимах же HiColor и TrueColor без всяких проблем этим методом выводятся любые битовые образы. Так как на всех современных компьютерах используются, по крайней мере, HiColor режимы, мы не будем рассматривать ограничения худших режимов и манипуляции с палитрой. В библиотеке MFC, распространяющейся вместе с MS Visual Studio 2005 Professional, встроен класс CImage, который упрощает работу с битовыми образами. Принципы работы с ним рассмотрены далее.

Настройка системы координат

Стандартные функции каркаса MFC для настройки систем координат

В MFC встроены функции для настройки аппаратной и логической систем координат. Также предусмотрены функции перехода от одной к другой. Задача программиста состоит в том, чтобы определить, когда и какую систему координат использовать.

Основные правила при работе с системами координат:

  • Все параметры, передаваемые в методы CDC, – это логические координаты.
  • Все параметры, передаваемые в методы CWnd, – это аппаратные координаты.
  • Значения, сохраняемые длительное время, должны использовать логические координаты.

Рассмотрим функции для работы с системами координат.

Функция virtual int SetMapMode(int nMapMode) устанавливает направления осей и определяет логические единицы. Возможные значения параметра nMapMode приведены в таблице:

ММ_ТЕХТ Одна логическая единица равна одному пикселю, ось x направлена вправо, ось у — вниз. Режим задан по умолчанию.
MM_HIENGLISH Одна логическая единица равна 0.001 дюйма, ось x направлена вправо, ось у — вверх.
MM_HIMETRIC Одна логическая единица равна 0.01 миллиметра, ось x направлена вправо, ось у — вверх.
MM_LOENGLISH Одна логическая единица равна 0.01 дюйма, ось x направлена вправо, ось у — вверх.
MM_LOMETRIC Одна логическая единица равна 0.1 миллиметра, ось x направлена вправо, ось у — вверх.
MM_ANISOTROPIC Режим позволяет настраивать (с помощью функций SetWindowExt и SetViewportExt) размерность (отдельно для каждой из осей), их направления и начало отсчета
MM_ISOTROPIC Режим позволяет настраивать (с помощью функций SeWindowExt и SetViewportExt) размерность осей, их направления и начало отсчета, единица оси x равна единице оси у.
MM_TWIPS Одна логическая единица — твипс (twips) — равна 1/20 пункта (point) или 1/1440 дюйма, ось x направлена вправо, ось у — вверх.

Функции для перемещения центров систем координат: virtual CPoint SetViewportOrg(CPoint point) и СPoint SetWindowOrg(CPoint point) . Первая смещает центр аппаратных координат, а вторая – логических, в точку, переданную в качестве параметра. Обе функции возвращают координаты предыдущего центра.

Функции virtual CSize SetViewportExt(CSize size) и virtual CSize SetWindowExt(CSize size) используются для задания единиц измерения. Первая функция устанавливает единицы измерения аппаратной системы координат, вторая – логической.

Для перехода от аппаратных координат к логическим используется функция void DPtoLP(LPPOINT lpPoints, int nCount = 1) const, а для перехода от логических к аппаратным – void LPtoDP(LPPOINT lpPoints, int nCount = 1) const. Аргументами обоих функций являются указатель на массив с точками, которые нужно преобразовать, и размерность этого массива.

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