ALTE DOCUMENTE
|
||||||
Рис. 8.2. Окно программы, испол&# 747c216h 1100;зующей встроенные шрифты
Хотя на первый взгляд это может показаться сложным, на самом деле создавать собственные шрифты довольно просто. При этом Вы пол&# 747c216h 1091;чите два существенных преимущества. Во-первых, собственные шрифты придают программе уникальный внешний вид, отличающий ее от других. Во-вторых, собственные шрифты позволяют лучше управлять выводом текста. Прежде чем начать писать программу создания собственного шрифта, необходимо отметить, что его создание не означает определение нового шрифта. Скорее это выглядит как клонирование существующего шрифта и подгонка его параметров согласно задаваемым Вами спецификациям (то есть не нужно определять форму каждого символа создаваемого шрифта.)
Для создания собственного шрифта испол&# 747c216h 1100;зуется функция API CreateFont()
HFONT CreateFont(int Height, int Width,
int Escapement, int Orientation,
int Weight, DWORD Ital,
DWORD Underline, DWORD StrikeThru,
DWORD Charset, DWORD Precision,
DWORD ClipPreqision, DWORD Quality,
DWORD Pitch, LPCSTR FontName);
Height Width Width равен 0, Windows автоматически подставляет значение, определяемое текущими пропорциями шрифта. Значения Height Width
Escapement
Orientation
Weight задает насыщенность (жирность) шрифта и может принимать значения в диапазоне от 0 до 1000. Значение 0 определяет насыщенность по умолчанию, значение 400 - нормальную насыщенность, а 700 - жирный шрифт. Для задания насыщенности шрифта можно также испол&# 747c216h 1100;зовать следующие макросы:
FW_DONTCARE
FW_EXTRALIGHT
FW_LIGHT
FW_NORMAL
FW_MEDIUM
FW_SEMIBOLD
FW_BOLD
FW_EXTRABOLD
FW_HEAVY
Ital Underline StrikeThru
Параметр Charset определяет множество символов шрифта. В следующем примере мы будем испол&# 747c216h 1100;зовать ANSI_CHARSET Precision OUT_DEFAULT_PRECIS ClipPrecision CLIP_DEFAULT_PRECIS
Charset Precision ClipPrecision, обратитесь к Руководству по функциям и форматам данных API (или к MSDN Library Help - приложению Visual C
Quality
DEFAULT_QUALITY
DRAFT_QUALITY
PROOF_QUALITY
Pitch
DEFAULT_PITCH
FIXED_PITCH
VARIABLE_PITCH
FF_DECORATIVE
FF_DONTCARE
FF_MODERN
FF_ROMAN
FF_SCRIPT
FF_SWISS
Pitch
FontName
CreateFont NULL
CreateFont физически не создает новый шрифт, - она только преобразует шрифт, реально существующий в системе, таким образом, чтобы пол&# 747c216h 1091;ченный в результате шрифт максимально соответствовал задаваемым спецификациям.
CreateFont , должны быть удалены, прежде чем программа завершит свое выпол&# 747c216h 1085;ение. Для удаления шрифта испол&# 747c216h 1100;зуется функция DeleteObject
Times New Roman Cyr Parsek Cyrillic. Каждый раз при выборе команды меню Сменить шрифт выбирается и отображается новый шрифт. Эта программа испол&# 747c216h 1100;зует тот же файл ресурсов, что и пример из предыдущего раздела.
#include <Windows.h>
#include <String.h>
#include <Stdio.h>
#include "Text.h"
LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);
char szWinName[] = " "; //
char str[255]; // Буфер строки вывода
char frame[40]= "По умолчанию"; // Имя шрифта
int X=0, Y=0; // Текущие координаты строки
int maxX, maxY; // Размеры экрана
HDC memdc; // DC виртуального окна
HBITMAP hbit; // Растр - это виртуальное окно
HBRUSH hbrush; // Дескриптор кисти
HFONT holdf, hnewf1, hnewf2; // Дескрипторы шрифтов
int WINAPI WinMain (HINSTANCE hThisInst,
HINSTANCE hPrevInst,
LPSTR lpszArgs,
int nWinMode)
return msg.wParam;
}
// Windows и пол&# 747c216h 1091;чает в качестве параметров сообщения
LRESULT CALLBACK WindowFunc HWND hwnd
UINT message,
WPARAM wParam,
LPARAM lParam)
break;
case ID_RESET:
X=Y=0; //
PatBlt(memdc,0,0,maxX,maxY,PATCOPY);
InvalidateRect(hwnd,NULL,1); //
break;
case ID_HELP:
MessageBox(hwnd,"F2: \n"
"F3: сменить шрифт\n"
"F4: с начала экрана",
" ",MB_OK);
break;
}
break;
case WM_PAINT: //
hdc=BeginPaint(hwnd,&paintstruct); // DC
// Теперь копируем растр из памяти на экран
BitBlt(hdc,0,0,maxX,maxY,memdc,0,0,SRCCOPY);
EndPaint(hwnd,&paintstruct); // DC
break;
case WM_DESTROY: // Завершение программы
DeleteDC(memdc); // Удалить виртуальное окно
PostQuitMessage(0);
break;
default:
// Все сообщения, не обрабатываемые в данной
// функции, направляются на обработку по
// умолчанию
return DefWindowProc(hwnd,message,
wParam,lParam);
return 0;
}
Windows
|