Смекни!
smekni.com

Общая информация про MFC. Иерархия классов MFC. Место MFC в среде разработчика Visual C++ (стр. 3 из 3)

Инициализация объекта шрифта: выбор шрифта

После того, как объект класса CFontсоздан, необходимо инициализировать его конкретным шрифтом из установленных в системе, с заданными параметрами. Это может быть как растровый, так и контурный шрифт. Наверное, Вы справедливо ожидаете наличия функции, которая позволяет задать только гарнитуру шрифта, начертание и размер, после чего шрифт будет проинициализирован. К сожалению, ни в MFCни в Windows такой функции нет. Единственная функция, которая подходит для выполнения этой задачи, имеет такой прототип:

BOOL CFont: :CreateFont(int nHeight, int nWidth,

int nEscapement,

int nOrientation,

int nWeight,

BYTE bltalic,

BYTE bUnderline,

BYTE cStrikeOut,

BYTE nCharSet,

BYTE nOutPrecision,

BYTE nClipPrecision,

BYTE nQuality,

BYTE nPitchAndFamily,

LPCTSTR IpszFacename);

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

Функция была создана давно, и тогда казалась увлекательной идея подстановки и замены шрифтов, суть которой заключалась в следующем: программист задает такие параметры шрифта, какие он хочет иметь, aWindows сама на основе имеющихся в системе шрифтов произведет необходимые трансформации и синтезирует требуемый шрифт из имеющихся. Впоследствии оказалось, что эта технология не может быть удовлетворительно работоспособной (так как практически это сложная задача из области искусственного интеллекта). Также функция позволяет проводить трансформации шрифта - растягивать и сжимать его, выводить текст под углом. Сейчас это используется редко. Графические пакеты используют свои алгоритмы трансформаций, и часто используют шрифты PostScript. Суть же заключается в том, что качественно могут быть отображены только те шрифты и в тех начертаниях, которые присутствуют в системе, причем без трансформаций (то есть с использованием хинтов, которые отключаются при трансформациях). Для большинства современных программ требуется высокое качество отображения текста, поэтому никакие трансформации и подстановки неуместны. Практически, являются разумными лишь два варианта поведения: либо программа будет использовать точно тот шрифт, который запросила, в таком виде, в каком его создал разработчик, либо откажется работать при отсутствии шрифта.

Рассмотрим пример кода, который позволяет задать размер шрифта, начертание и гарнитуру, минимизировав возможные трансформации шрифта и синтеза при отсутствии заданного. Такие же параметры для функции CreateFontQВы можете использовать в своих программах.

Желательно также проверять наличие шрифта, если он не является стандартным. Вот код, который используется в примере программы (указатель на объект шрифта хранится в переменной mjpFoni):

void CMainFrame::SetClientFont(CString Typeface, // Гарнитура

intSize, // размер в пунктах

BOOLBold, // Признак жирного начертания

BOOLItalic // Признак наклонного начертания

}

{

// Получим контекст окна

CWindowDCwinDC(this);

// Узнаем, сколько пикселей в одном логическом дюйме У

int pixelsPerlnch = winDC.GetDeviceCaps(LOGPIXELSY);

// Узнаем высоту в пикселях шрифта размером Size пунктов

int fontHeight = -MulDiv(Size, pixelsPerlnch, 72);

// Устанавливаем параметр жирности для функции CreateFont()

int Weight = FW_NORMAL;

if(Bold)

Weight = FWBOLD;

// Удаляемпредыдущийэкземпляршрифта — нельзядваждыинициализироватьшрифтвызовом CreateFont().

delete m pFont;

mjpFont = new CFont;

// Создание шрифта. Большинство параметров не используются.

m_pFont->CreateFont(fontHeight, 0, 0, 0, Weight, Italic, О, О,

DEFAULT_CHARSET,OUT_DEFAULT PRECIS,

CLIP_DEFAULT_PRECIS, PROOF_QUALITY,

DEFAULT_PITCH | FF_DONTCARE, Typeface);

}


Литература

1. Советов Б.Я., Яковлев С.А. “Робототехника”. - М.: Высш. шк., 2007.- 271 с.

2. Методические указанияк курсовой работепо дисциплине "Робототехника и мехатроника" для студентов специальностиГКСР ". 2005.

3. Радиоэлектроника. Пичукин Г.В. М. 1999.