|
http://tikitak.narod.ru ---- Главная страница сайта
Шаг 93 - Работа со шрифтами.
Надежда была, но осталась напрасной
Она капает на пол в виде жидкости красной
Dolphin
Сложность работы со шрифтами заключаеться в том, что Вы не можете быть уверены насчет присутствия в системе шрифта, которым собираетесь пользоваться. Идеология здесь такая. Вы формируете структуру с информацией о шрифте LOGFONT, которая будет хранить информацию, попробовать её сформировать и работать с тем, что получится в результате.
Структура LOGFONT
typedef struct tagLOGFONT {
LONG lfHeight; // Высота в логических единицах
LONG lfWidth; // Ширина в логических единицах
LONG lfEscapement; // Угол нанесения шрифта
LONG lfOrientation; // Наклон символов
LONG lfWeight; // Толщина линий начертания шрифта
BYTE lfItalic; // Если 0 тот курсив
BYTE lfUnderline; // Если 0 то подчеркнутое
BYTE lfStrikeOut; // Если 0 то перечеркнутое
BYTE lfCharSet; // Номер набора символов в таблице кодировок
BYTE lfOutPrecision; // Соотвествие запрашиваемого шрифта и того который есть
BYTE lfClipPrecision; // Способ обрезания при выходе за предел области ограничения
BYTE lfQuality; // качества шрифта
BYTE lfPitchAndFamily; // Тип шрифта
TCHAR lfFaceName[LF_FACESIZE]; // Имя шрифта
} LOGFONT;
Попробуем. Формируйте MFC приложение, как SDI с именем TestFont. Все изменения будем вносить в функцию Draw, вот она какая сейчас.
void CTestFontView::OnDraw(CDC* pDC)
{
CTestFontDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
Прежде чем использовать TextOut шрифт нужно сформировать. Потом выбрать его в контексте устройства и только потом им писать. Смотрите код. А ниже описание.
void CTestFontView::OnDraw(CDC* pDC)
{
CTestFontDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
LOGFONT lf;
lf.lfHeight = 8;
lf.lfWidth = 0;
lf.lfEscapement = 0;
lf.lfOrientation = 0;
lf.lfWeight = FW_NORMAL;
lf.lfItalic = 0;
lf.lfUnderline = 0;
lf.lfStrikeOut = 0;
lf.lfCharSet = ANSI_CHARSET;
lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
lf.lfQuality = PROOF_QUALITY;
lf.lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN;
strcpy(lf.lfFaceName,"Times New Roman");
int pos=0;
for (int x=0;x<8;++x)
{
lf.lfHeight= 8 + (x*8);
CFont ft;
ft.CreateFontIndirect(&lf);
CFont* oldf=pDC->SelectObject(&ft);
pos=pos + lf.lfHeight;
pDC->TextOut(10,pos,"Font samples");
pDC->SelectObject(oldf);
}
}
Как видите заполняется структура, в которой формируется образ требуемого нам шрифта. Но это как в жизни. Можно хотеть Василису прекрасную, а получить лягушку или наоборот. Дальше нужен класс шрифта CFont. И вот из структуры LOGFONT формируется шрифт, используя функцию класса CFont с названием CreateFontIndirect. Ну, а дальше как обычно. Выбрать SelectObject то, что получилось и писать. В конце мы опять возвращаем старый шрифт.
Вот пример результата.
Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление By Artem.
Используются технологии uCoz
|