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