Шаг 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 то, что получилось и писать. В конце мы опять возвращаем старый шрифт.

Вот пример результата.

step93.gif (2799 b)


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 29.01.2000