- •КОНТЕКСТ УСТРОЙСТВА
- •Класс CDC и его производные
- •Объявление контекста
- •РАБОТА С ТЕКСТОМ
- •Вывод текста. Функция TextOut
- •Вывод текста в прямоугольнике отсечения. Функция ExtTextOut
- •Цвет фона. Функции GetBkColor, SetBkColor
- •Цвет символов текста. Функции GetTextColor, SetTextColor
- •Выравнивание текста. Функции GetTextAlign, SetTextAlign
- •Пример рисования текста
- •ЦВЕТОВАЯ СИСТЕМА RGB
- •ДИАЛОГОВОЕ ОКНО ВЫБОРА ЦВЕТА
- •Конструктор класса CColorDialog
- •Отображение диалогового окна. Функция DoModal
- •Получение выбранного цвета. Функция GetColor
- •Пример использования диалогового окно выбора цвета
- •МОДЕЛЬ ПЕРЬЕВОГО ПЛОТТЕРА
- •Перемещение карандаша. Функция MoveTo
- •Рисование отрезка. Функция LineTo
- •Рисование точки. Функция SetPixel
- •Получение цвета точки. Функция GetPixel
- •РИСОВАНИЕ ГРАФИЧЕСКИХ ПРИМИТИВОВ
- •Рисование прямоугольника. Функция Rectangle
- •Рисование округлённого прямоугольника. Функция RoundRect
- •Рисование эллипса. Функция Ellipse
- •Рисование эллиптической дуги. Функция Arc
- •Рисование эллиптической дуги и хорды. Функция Chord
- •Рисование ломаной линии. Функция Polyline
- •КАРАНДАШ. КЛАСС CPEN
- •Конструкторы класса СРеn
- •Создание карандаша. Функция CreatePen
- •Создание указателя на карандаш. Тип HPEN
- •Использование объекта. Функция SelectObject
- •Получение атрибутов объекта. Функция GetObject
- •НАСТРОЙКА РЕЖИМА ОТОБРАЖЕНИЯ
- •Выбор единиц измерения. Функция SetMapMode
- •Размер прямоугольника. Структура SIZE
- •Получение размеров клиентской области. Функция GetClientRect
- •Пример настройки режима отображения
- •КИСТЬ. КЛАСС CBRUSH
- •Конструкторы класса CBrush
- •Образец физической кисти. Структура LOGBRUSH
- •Создание кисти
- •Пример создания и использования кисти
- •Создание точечного рисунка. Функция CreateBitmap
- •Создание ресурса точечного рисунка
- •Загрузка ресурса точечного рисунка. Функция LoadBitmap
Лекция 14 |
Работа с графикой |
3 |
Функция OnPaint вызывается в тот момент, когда окно получает сообщение WM_PAINT. Это сообщение посылается окну всегда, когда требуется перерисовка экрана. Например, при увеличении размера окна, если окно выходит на передний план, при запуске программы.
Поскольку наша программа должна реагировать на событие перерисовки экрана, то карта сообщений должна содержать вызов соответствующей функции ON_WM_PAINT
BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd) ON_WM_PAINT
…
END_MESSAGE_MAP()
Переопределяем функцию перерисовки окна. void CMainWnd::OnPaint()
{
//объявление экземпляра класса CPaintDC для работы с клиентской областью окна
//связывает его с контекстом устройства текущего диалогового окна
CPaintDC dc ( this ) ; |
|
dc.TextOut ( 200 , 200 , "Hello MFC Program" ) ; |
// Написать в окне привет |
}
Если вам необходимо перерисовать окно не только при его увеличении, но и при уменьшении, то целесообразно создать функцию обработки события изменения размеров окна, которая содержит команду посылки сообщения WM_PAINT.
void CGraphDlg::OnSize ( UINT nType , int cx , int cy )
{
CDialog::OnSize ( nType , cx , cy ) ;
SendMessage ( WM_PAINT ) ; // посылаем команду родительскому окну перерисовать окно
}
РАБОТА С ТЕКСТОМ
Вывод текста. Функция TextOut
Для вывода текста в классе CDC определено два метода.
Назначение: рисует строку символов в указанном положении, используя текущий шрифт.
Синтаксис:
BOOL TextOut ( int x, int y, const CString& str ) ;
virtual BOOL TextOut ( int x, int y, LPCTSTR lpszString , int nCount ) ;
Возвращаемое значение: ненулевое, если функция успешно выполнена, и ноль в противном случае.
Параметры:
x, y |
определяет логические координаты строки. |
lpszString |
указатель на строку символов, значение которой будет нарисовано. |
str |
объект типа CString, значение которой будет нарисовано. |
nCount |
определяет количество символов, которые будут нарисованы. |
Замечания: по умолчанию, текущие координаты функцией не используются и не обновляются. Для использования текущих координат нужно вызвать функцию SetTextAlign со значением параметра nFlags равным TA_UPDATECP. Если флаг установлен, то вместо значений параметров x, y используются значения текущих координат.
Вывод текста в прямоугольнике отсечения. Функция ExtTextOut
Для вывода текста в прямоугольнике отсечения в классе CDC определено два метода.
Назначение: рисует строку символов в указанном положении, используя текущий шрифт; отсекает текст, который вышел за границами заданного прямоугольника; позволяет изменить интервалы между символами.
Синтаксис:
BOOL ExtTextOut ( int x , int y , UINT nOptions , LPCRECT lpRect , const CString& str , LPINT lpDxWidths ) ;
Выжол Ю.А.
Лекция 14 |
Работа с графикой |
4 |
virtual BOOL ExtTextOut ( int x , int y , UINT nOptions , LPCRECT lpRect , LPCTSTR lpszString , UINT nCount , LPINT lpDxWidths ) ;
Возвращаемое значение: ненулевое, если функция успешно выполнена, и ноль в противном случае.
Параметры:
x , y |
определяет логические координаты строки. |
lpszString |
указатель на строку символов, значение которой будет нарисовано. |
str |
объект типа CString, значение которой будет нарисовано. |
lpRect |
указатель на структуру RECT, которая определяет размеры и положение прямоуголь- |
|
ника. Этот параметр может быть недействителен (NULL). Вы можете также использо- |
nCount |
вать объект типа CRect для этого параметра. |
определяет количество символов, которые будут нарисованы. |
|
LpDxWidths |
указатель на массив целых чисел, которые определяют интервал между соседними |
|
символами. Если параметр недействителен (NULL), то функция использует стандарт- |
nOptions |
ный интервал между символами. |
определяет тип прямоугольника, которые будут нарисованы. |
Этот параметр может содержать одно, два, или ни одного из следующих значений:
ETO_CLIPPED |
текст, который вышел за границы прямоугольника, будет отсечен. |
ETO_OPAQUE |
прямоугольник будет закрашен текущим цветом фона. |
Цвет фона. Функции GetBkColor, SetBkColor
Система использует цвет фона, чтобы заполнить бреши между стилизованными линиями, бреши между штрихуемыми линиями в щетках, и фон в ячейках символов. Получить и изменить цвет фона можно с помощью следующих функций.
Синтаксис:
COLORREF GetBkColor ( ) const;
virtual COLORREF SetBkColor ( COLORREF crColor ) ;
Возвращаемое значение: Предыдущий цвет фона, если функция успешно выполнена, и 0x80000000 в противном случае.
Цвет символов текста. Функции GetTextColor, SetTextColor
Получить и изменить цвет символов текста можно с помощью следующих функций.
Синтаксис:
COLORREF GetTextColor ( ) const;
virtual COLORREF SetTextColor ( COLORREF crColor ) ;
Возвращаемое значение: Предыдущий цвет символов текста.
Параметры:
crColor |
новое значение цвета символов текста. |
Выравнивание текста. Функции GetTextAlign, SetTextAlign
Назначение: определяет способ выравнивания текста, который рисуется с помощью функций TextOut и ExtTextOut. Определяет также способ использования текущих координат.
Синтаксис:
UINT GetTextAlign ( ) const ;
UINT SetTextAlign ( UINT nFlags ) ;
Возвращаемое значение: предыдущее значение флагов, если функция успешно выполнена, и ноль в противном случае.
Параметры: |
|
nFlags |
определяет способ выравнивания текста. Этот параметр может быть суммой одного или |
|
нескольких флагов из трёх категорий. Можно выбирать только один флаг из каждой ка- |
|
тегории. |
Первая категория флагов определяет положение строки в горизонтальном направлении относительно x-координаты:
TA_CENTER TA_LEFT
Выжол Ю.А.
Лекция 14 |
Работа с графикой |
5 |
TA_RIGHT |
координата определяет положение правого края строки. |
|
Вторая категория флагов определяет положение строки в вертикальном направлении относительно y-координаты:
TA_BASELINE TA_BOTTOM TA_TOP
координата определяет положение базовой линии строки. координата определяет положение нижнего края строки.
координата определяет положение верхнего края строки (по умолчанию).
Третья категория определяет, обновлены ли текущие координаты после вызова функции вывода текста:
TA_NOUPDATECP не обновляет текущую координату (по умолчанию)
TA_UPDATECP обновляет текущую x-координату. Новое положение находится с правой стороны рабочего прямоугольника. Когда этот флаг установлен, координаты, указанными в вызовах функции TextOut, не используются.
Пример рисования текста
Ниже приведён пример программы, которая в диалоговом окне изменяемого размера отображает синий заголовок на сером фоне, белый прямоугольник и красный текст внутри прямоугольника. Текст выходящий за границы прямоугольника отсекается. Виддиалогового окна приведённа рисунке.
Поскольку пользователю разрешено изменять размеры окна, то в программе предусмотрено масштабирование изображения – заголовок всегда располагается вверху экрана по центру, прямоугольник всегда занимает центральную четверть экрана, текст рисуется в центре экрана. Масштабирование изображения достигается следующими мерами:
Рисование осуществляется в объявленной функции DrawText члене класса диалогового окна
CtextDlg.
Вызов функции в объявленной функции DrawText члене класса диалогового окна CtextDlg осуществляется в методе OnPaint, который вызывается при каждом изменении размеров экрана.
Размеры клиентской области окна определяются с помощью функции GetClientRect
void CTextDlg :: OnPaint ( ) |
// Функция перерисовки окна |
{ |
|
DrawText ( ) ; |
|
} |
|
void CTextDlg :: DrawText ( ) |
// Функция рисования в окне |
{ |
|
// объявление экземпляра класса CClientDC для работы с клиентской областью - текущего окна
CClientDC dc ( this ) ; |
// контекст устройства - текущее окно |
CRect ClientRec ; |
// параметры клиентской области |
CString Title = "Заголовок"; |
// объявление строки заголовка |
CString Text = "Пример текста в рамке"; |
// объявление строки текста |
COLORREF crBlue = RGB ( 0 , 0 , 255 ); |
// объявление синего цвета для текста |
COLORREF crGray = RGB ( 232 , 232 , 232); |
// объявление серого цвета для фона |
COLORREF crRed = RGB ( 255 , 0 , 0 ); |
// объявление красного цвета для текста |
COLORREF crWhite = 0x00FFFFFF ; |
// объявление белого цвета для фона |
GetClientRect ( &ClientRec ) ; |
// получение параметров клиентской области |
int L=ClientRec.right ; |
// ширина диалогового окна |
int H=ClientRec.bottom ; |
// высота диалогового окна |
dc.SetBkColor ( crGray ) ; |
// установка цвета фона |
dc.SetTextColor ( crBlue ) ; |
// установка цвета текста |
// установка выравнивания текста: горизонталь - по центру, вертикаль - по базовой линии
Выжол Ю.А.