Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VC Лекции PDF / VC 15 Лек Графика.pdf
Скачиваний:
37
Добавлен:
15.02.2015
Размер:
651.21 Кб
Скачать

Лекция 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 ) ;

// установка цвета текста

// установка выравнивания текста: горизонталь - по центру, вертикаль - по базовой линии

Выжол Ю.А.