Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИГС / Labor_01.doc
Скачиваний:
13
Добавлен:
17.04.2018
Размер:
524.8 Кб
Скачать

Шрифты True Type в Windows программах.

Масштабируемые шрифты True Type, которые предоставляет система Windows, можно легко использовать в создаваемых приложениях. Шрифты являются графическими объектами GDI, и поэтому выбор шрифта в контекст устройства, аналогичен выбору пера или кисти.

Сначала создаем шифр с помощью функции CreateFontIndirect().

hFont = CreateFontIndirect(&lf);

Созданный шрифт имеет идентификатор hFont типа HFONT. Параметром функции CreateFontIndirect является указатель lf на структуру типа LOGFONT. Приведем поля этой структуры.

typedef struct tagLOGFONT{

LONG lfHeight; //высота шрифта в логических единицах

LONG lfWidth; //ширина символов в логических единицах

LONG lfEscapement; //угол наклона в десятых долях градуса

LONG lfOrientation; //ориентация символов

LONG lfWeight; //толщина символов

BYTE lfItalic; //наклонные символы

BYTE lfUnderline; //подчеркнутые символы

BYTE lfStrikeOut; //перечеркнутые символы

BYTE lfCharSet; //тип кодировки символов

BYTE lfOutPrecision; //точность выбора шрифта

BYTE lfClipPrecision; //способ обрезания символов

BYTE lfQuality; //качество отображения шрифта

BYTE lfPitchAndFamily; //фиксированная или переменная ширина символа

TCHAR lfFaceName [LF_FACESIZE]; //имя шрифта

} LOGFONT;

Изменяя поля структуры, можно выбрать шифр нужного типа, размера и ориентации. Если содержание полей структуры не изменять, то будет использоваться шифр, выбранный в контекст по умолчанию.

Далее выбираем шрифт hFont в контекст устройства hdc. После этого в контексте устройства будет находиться новый шрифт. Чтобы сохранилась информация о старом шрифте, необходимо использовать для старого шрифта свой идентификатор hFontOld.

hFontOld = (HFONT)SelectObject(hdc, hFont);

После этого можно рисовать текстовые надписи в контексте hdc, используя выбранный шифр hFont. Важно то, что, создавая новый шрифт, надо позаботиться об уничтожении его после использования. Шрифт есть объект GDI, для него выделяется специальная область памяти. Шрифт существует до тех пор, пока его не уничтожить. Завершение работы функции, в которой создавался шрифт, не приводит к автоматическому уничтожению объектов GDI и освобождению памяти. Своевременное уничтожение неиспользуемых объектов GDI возлагается на программиста.

Уничтожение созданного шрифта hFont выполняется функцией DeleteObject(). Перед уничтожением нового шрифта hFont, надо восстановить в контексте hdc шрифт по умолчанию hFontOld. Схему создания и уничтожения шифра можно представить в виде.

hFont = CreateFontIndirect(&lf);

hFontOld = (HFONT)SelectObject(hdc, hFont);

 //рисование текста

SelectObject(hdc, hFonthOld);

DeleteObject(hFont);

Приведем пример вывода текста под углом 45 градусов. Возьмем за основу созданную программу GraphWin. В функции Line_OnPaint добавим следующие строчки кода.

LOGFONT lf;

HFONT hFont, hFontOld;

memset(&lf, 0, sizeof(LOGFONT)); //заполняем нулями поля структуры lf

lf.lfHeight = 25;

lf.lfWeight = FW_BOLD;

wcscpy_s(lf.lfFaceName, L"Courier New");

lf.lfEscapement = 450;

hFont = CreateFontIndirect(&lf);

hFontOld = (HFONT)SelectObject(hdc, hFont);

TextOut(hdc,xn(1), ym(-0.75), _T(" This is curve Sin(x) "),22);

SelectObject(hdc, hFontOld);

DeleteObject(hFont);

Компилируем и запускаем программу. Результат показан на Рис.8.

Рис.8

Вывод текста шрифтом "Courier New" под углом 45 градусов.

Создание меню с помощью VISUAL C++ 2008.

Меню, в программной среде VISUAL C++ 2008 создается точно также как и в среде VISUAL C++ 2005. Поэтому выполняем действия, описанные в пункте «Создание меню с помощью VISUAL C++ 2005».

Создание меню с помощью VISUAL C++ 2005.

Рассмотрим пример программы, в которой используется меню в главном окне приложения. Новый проект назовем MenuWin, а за основу возьмем программу GraphWin. Переименуем файл GraphWin.cpp в файл MenuWin.cpp и добавим к проекту MenuWin. Уберем в функции окна WndProc, строчки кода, вызова функции для рисования синусоиды.

case WM_PAINT:

Line_OnPaint(hWnd);

break;

Если откомпилировать файлы проекта и запустить готовую программу, то результат будет таким, как на Рис.6. На экране будет находиться пустое окно приложения MenuWin.

Теперь добавим к этому окну небольшое меню. Загрузим проект в интегрированную среду компилятора Visual C++. В главном окне компилятора Visual C++ , слева имеется окно Solution Explorer. Подводим мышку к надписи Resource Files и щелкаем правой кнопкой. В появившемся маленьком меню выбираем пункт Add – Resource. В результате, в папке проекта D:\BC-WORK\MenuWin создаются два файла: файл ресурсов MenuWin.rc и заголовочный файл resource.h.

Появляется окно со списком ресурсов. Выбираем пункт Menu.

Рис.9.

Окно Add Resource компилятора Visual C++ 2005, для добавления новых объектов в проект.

Нажимаем кнопку New, и открывается окно для редактирования меню.

Рис.10.

Окно для редактирования меню.

Напечатаем в окошке Type Here имя File. В результате окно редактирования принимает следующий вид.

Рис.11.

Окно для редактирования меню.

Напечатаем в нижнем окне Type Here имя Exit, затем в правом окне Type Here имя Graphics и снова в нижнем окне Type Here имя Ellipse. В результате окно редактирования принимает следующий вид.

Рис. 12.

Окно для редактирования меню.

Щелкаем правой кнопкой в нижнем поле Type Here окна редактирования меню, и в появившемся дополнительном меню выбираем пункт Insert Separator.

Рис. 13.

Окно для редактирования меню.

Под именем Ellipse появится разделительная линия. Еще ниже в окошке Type Here напечатаем имя Polygon. В результате окно редактирования принимает следующий вид.

Рис.14.

Окно для редактирования меню.

В главном окне компилятора Visual C++ , слева имеется окно Resource View. Подводим мышку к надписи Menu и щелкаем правой кнопкой. В появившемся маленьком меню выбираем пункт Save MenuWin.rc. В результате, в файле ресурсов MenuWin.rc и заголовочном файле resource.h появляется информация о созданном меню.

Можно посмотреть какие изменения произошли в файле ресурсов MenuWin.rc. Приведем фрагмент кода в этом файле, который описывает созданное меню.

IDR_MENU1 MENU

BEGIN

POPUP "File"

BEGIN

MENUITEM "Exit", ID_FILE_EXIT

END

POPUP "Graphics"

BEGIN

MENUITEM "Ellipse", ID_GRAPGICS_ELLIPSE

MENUITEM SEPARATOR

MENUITEM "Polygon", ID_GRAPGICS_POLYGON

END

END

Здесь имеются три пункта меню, при нажатии на которые программа может ответить некоторыми действиями. Это следующие пункты "Exit", "Ellipse" и "Polygon". Каждый из этих пунктов меню имеет свой идентификатор - ID_FILE_EXIT, ID_GRAPGICS_ELLIPSE, ID_GRAPGICS_POLIGON.

Программа будет узнавать эти пункты меню по их идентификаторам. Поэтому в файле resource.h каждому идентификатору присвоено некоторое численное значение. Ниже приводится фрагмент кода из этого файла.

#define IDR_MENU1 101

#define ID_FILE_EXIT 40001

#define ID_GRAPGICS_ELLIPSE 40002

#define ID_GRAPGICS_POLIGON 40003

Отметим также в этих фрагментах идентификатор созданного меню IDR_MENU1.

Идентификаторы меню можно изменять, давая им другие названия. Для примера изменим имена созданных идентификаторов. Загрузим проект в интегрированную среду компилятора Visual C++. В главном окне компилятора Visual C++ , слева выберем окно Resource View. Раскроем пункты MenuWin, MenuWin.rc, и Menu. Щелкаем левой кнопкой на пункте IDR_MENU1, в результате открывается окно редактирования меню. Подводим мышку к надписи Exit и щелкаем правой кнопкой, и выбираем пункт properties. Появляется дополнительное окно, содержащее описание пункта меню Exit.

Рис.15.

Окно для редактирования меню.

В строке ID изменим имя идентификатора ID_FILE_EXIT на ID_EXIT. Щелкаем левой кнопкой мышку на надписи Ellipse и изменяем имя идентификатора ID_GRAPHICS_ELLIPSE на ID_ELLIPSE. Аналогично меняем имя идентификатора поля меню Polygon. Поменяем также имя идентификатора меню. Щелкаем левой кнопкой мышки на надписи IDR_MENU1, появляется следующее окно.

Рис.16.

Окно для редактирования меню.

В строке ID изменим имя идентификатора IDR_MENU1 на MENU1. Сохраняем изменения в файле ресурсов MenuWin.rc. В результате, в файле ресурсов MenuWin.rc и заголовочном файле resource.h появляется новая информация о созданном меню.

Приведем измененный фрагмент кода в файле MenuWin.rc.

MENU1 MENU

BEGIN

POPUP "File"

BEGIN

MENUITEM "Exit", ID_EXIT

END

POPUP "Graphics"

BEGIN

MENUITEM "Ellipse", ID_ELLIPSE

MENUITEM SEPARATOR

MENUITEM "Polygon", ID_POLYGON

END

END

В файле resource.h появились новые идентификаторы, но остались и старые идентификаторы, как это видно ниже.

#define IDR_MENU1 101

#define MENU1 101

#define ID_FILE_EXIT 40001

#define ID_GRAPHICS_ELLIPSE 40002

#define ID_GRAPHICS_POLYGON 40003

#define ID_ELLIPSE 40004

#define ID_POLYGON 40005

#define ID_EXIT 40006

Старые идентификаторы можно убрать непосредственно из файла resource.h.

Соседние файлы в папке ИГС