- •Структура программы.
- •Создание простейшего приложения Windows.
- •Работа с пером.
- •Работа с кистью.
- •Работа со шрифтами.
- •Работа с клавиатурой.
- •Работа с мышью.
- •Редактирование меню.
- •Кнопки на панели инструментов.
- •Блокировка и пометка пунктов меню.
- •Диалоговые окна.
- •Флажки и переключатели.
- •Списки.
- •Методы выбора.
- •Методы параметров рисунка.
- •Методы цветовой палитры.
- •Методы атрибутов рисунка.
- •Растровые методы.
- •Методы отсечения.
- •Методы рисования линии.
- •Методы простых рисунков.
- •Методы рисования эллипса и многоугольника.
- •Текстовые методы.
Работа с кистью.
Перо вычерчивает на экране линии заданной толщины. Кисть же закрашивает (заливает) внутреннюю область замкнутых фигур. Схема работы с кистью аналогична работе с пером. Рассмотрим пример, который будет демонстрировать как сплошные кисти, так и стандартные трафаретны, которые будут использованы для заливки прямоугольников.
Сплошная кисть - конструктор с одним аргументом, трафаретная кисть - конструктор с двумя аргументами.
В качестве первого аргумента двухаргументного конструктора можно использовать одну из перечисленных ниже констант или числа от 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); // Смотрите приложение
}
}