Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекций ООП Visual C++.doc
Скачиваний:
13
Добавлен:
10.11.2019
Размер:
453.12 Кб
Скачать

Работа с кистью.

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

Сплошная кисть - конструктор с одним аргументом, трафаретная кисть - конструктор с двумя аргументами.

В качестве первого аргумента двухаргументного конструктора можно использовать одну из перечисленных ниже констант или числа от 0 до 6:

HS_HORIZONTAL (горизонтальный)

HS_VERTICAL (вертикальный)

HS_CROSS (прямая клетка)

HS_FDIAGONAL (диагональный, наклон влево)

HS_BDIAGONAL (диагональный, наклон вправо)

HS_DIAGONALCROSS (косая клетка)

void CNameView::OnDraw(CDC* pDC)

{

CNameDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

//Инициализировать расположение прямоугольника//

UINT position=0;

//Выбрать перо для вычерчивания контура прямоугольника//

CPen pen(PS_SOLID,5,RGB(255,0,0));

CPen*oldPen=pDC->SelectObject(&pen);

for (UINT x=0; x<7; ++x) //Выбор стиля заливки//

{CBrush*brush; // Создание новой кисти //

if (x==6)

brush=new CBrush(RGB(0,255,0)); // Сплошная кисть //

else

brush=new CBrush(x,RGB(0,160,0)); // Со стилем заливки //

//Выбрать новую кисть в контекст//

CBrush*oldBrush=pDC->SelectObject(brush);

//Начертить прямоугольник//

position+=50;

pDC->Rectangle(20,position,400,position+40); // Смотрите приложение

//Восстановить контекст и стереть кисть//

pDC->SelectObject(oldBrush); // Смотрите приложение

delete brush;

}

//Восстановить прежнее перо в контексте//

pDC->SelectObject(oldPen); // Смотрите приложение

}

Работа со шрифтами.

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

Шрифты Windows описываются в структуре LONGFONT, поля которой перечислены в таблице. Большинство из них может иметь значение 0 или значение по умолчанию - всё зависит от конкретной ситуации в приложении.

Поле

Описание

lfHeight

Высота шрифта, логических единиц

lfWidth

Ширина шрифта, логических единиц

lfEscapement

Угол нанесения текста- угол между базовой линией текста и горизонталью (десятые доли градуса)

lfOrientation

Наклон символов (десятые доли градуса)

lfWeight

Толщина линий начертания шрифта, логических единиц

lfItalic

Ненулевое значение означает курсив

lfUnderline

Ненулевое значение означает подчёркивание

lfStrikeOut

Ненулевое значение означает перечёркнутый шрифт

lfCharSet

Номер набора символов шрифта-таблицы кодировки

lfOutPrecision

Параметр, определяющий соответствие запрашиваемого шрифта и имеющегося в наличии

lfClipPrecision

Параметр, определяющий способ “урезания” изображения литер при выходе их за пределы области ограниченного вывода.

lfQuality

Качество воспроизведения шрифта

lfPitchAndFamily

Определяет, будет ли шрифт иметь фиксированную или переменную ширину литер, а также семейство, к которому принадлежит шрифт

lfFaceName

Имя шрифта

Значение логической единицы задаётся методом pDC->SetMapMode(MM_TEXT). Оно задано по умолчанию.

Соответствие между режимом наклонения и значением логической единицы приведены в таблице.

Режим

Логическая единица

MM_HIENGLISH

0,001 дюйма

MM_HIMETRIC

0,01 мм

MM_ISOTROPIC

Произвольное

MM_LOENGLISH

0,01 дюйма

MM_LOMETRIC

0,1 мм

MM_TEXT

Пиксель устройства

MM_TWIPS

1/1440 дюйма


Наклон текста относится к случаю, когда текст располагается на негоризонтальной базовой линии.

Толщина шрифта есть параметр, характеризующий некоторым опосредованным образом толщину контурных линий литер. Для этого поля определён набор констант: FW_THIN, FW_BOLD,FW_MEDIUM и др.

Существует 4 возможных варианта набора символов шрифта : ANSI_CHARSET,OEM_CHARSET,SYMBOL_CHARSET,UNICODE_CHARSET.

Для полей точности обычно используются значения по умолчанию (OUT_DEFAULT_PRECIS и CLIP_DEFAULT_PRECIS).

Ширина литер и семейство задаются битовыми константами VARIABLE/FF_ROMAN.

Имя шрифта задаётся копированием strcpy(logfont.lf.FaceName,”Courier”). Соответствие требуемого шрифта и контекста не всегда точно. Предоставляется шрифт наиболее близко подходящий.

Ниже приведён пример программы, которая иллюстрирует разнообразные шрифты:

void CNameView::OnDraw(CDC* pDC)

{

CNameDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

//Инициализация структуры LOGFONT//

LOGFONT logfont;

logfont.lfHeight=8;

logfont.lfWidth=0;

logfont.lfEscapement=0;

logfont.lfOrientation=0;

logfont.lfWeight=FW_NORMAL;

logfont.lfItalic=0;

logfont.lfUnderline=0;

logfont.lfStrikeOut=0;

logfont.lfCharSet=ANSI_CHARSET;

logfont.lfOutPrecision=OUT_DEFAULT_PRECIS;

logfont.lfClipPrecision=CLIP_DEFAULT_PRECIS;

logfont.lfQuality=PROOF_QUALITY;

logfont.lfPitchAndFamily=VARIABLE_PITCH|FF_ROMAN;

strcpy(logfont.lfFaceName,"Times New Roman");

//Инициализация расположения текста в поле окна//

UINT position=0;

//Сформировать и вывести на экран 8 примеров шрифтов//

for (UINT x=0; x<8; ++x)

{//Установить новую высоту шрифта//

logfont.lfHeight=16+(x*8);

//Создать новый шрифт и выбрать его в контекст//

CFont font;

font.CreateFontIndirect(&logfont);

CFont*oldFont=pDC->SelectObject(&font);

//Вывести текст новым шрифтом//

position+=logfont.lfHeight;

pDC->TextOut(20,position,"A sample font");

//Восстановить прежний текст в контексте//

pDC->SelectObject(oldFont); // Смотрите приложение

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]