Шрифт. Классификация, параметры шрифта, установка в контексте устройства.



Существует 2 категории шрифтов: встроенные шрифты устройства и шрифты GDI, которые можно создать самостоятельно при помощи функции CreateFont. Шрифты устройства соответствуют конкретному устройству вывода.

 Контекст устройства определяет шрифт, который используется при выводе текста в рабочую область. По умолчанию задается системный шрифт (system font) или SYSTEM_FONT. В данном приложении для создания логического шрифта используется функция CreateFontIndirect:

CreateFontIndirect ( &MyFont );

где &MyFont – указатель на структуру LOGFONT, с помощью которой задается логический шрифт. 

Структура LOGFONT

Поле Описание
lfHeight Высота шрифта, логических единиц
lfWidth Ширина шрифта, логических единиц
lfEscapement Угол нанесения текста - угол между базовой линией текста и горизонталью (десятые доли градуса)
lfOrientation Наклон символов (десятые доли градуса)
lfWeight Толщина линий начертания шрифта ("жирность")
lfItalic Ненулевое значение означает курсив
lfUnderline Ненулевое значение означает подчеркивание
lfStrikeOut Ненулевое значение означает перечеркнутый шрифт
lfCharSet Номер набора символов шрифта - таблицы кодировки
lfOutPrecision Параметр, определяющий соответствие запрашиваемого шрифта и имеющегося в наличии
lfClipPrecision Параметр, определяющий способ "обрезания" изображения литер при их выходе за пределы области ограничения вывода
lfQuality Качество воспроизведения шрифта
lfPitchAndFamily Это поле определяет, будет ли шрифт иметь фиксированную или переменную ширину литер, а также семейство, к которому принадлежит шрифт
lfName Имя шрифта

Параметры шрифта задаются в данной структуре следующим образом:

LOGFONT MyFont;

sprintf(MyFont.lfFaceName,"Courier New"); //имя шрифта

MyFont.lfEscapement=-10*A-900;// угол наклона

MyFont.lfHeight=75;// высота

MyFont.lfCharSet=ANSI_CHARSET;//кодировка

MyFont.lfOutPrecision=OUT_DEFAULT_PRECIS;//точность вывода

MyFont.lfсредняя ширина

MyFont.lfWeight=600; // толщина

MyFont.lfItalic = false;// курсив

MyFont.lfUnderline = false;//подчеркивание

MyFont.lfStrikeOut = false;//зачеркивание

Атрибуты контекста устройств, влияющие на вывод текста

При рисовании на экране приложение получает дескриптор контекста устройства с помощью функции BeginPaint при обработке сообщения WM_PAINT и освобождает его перед завершением обработки сообщения, вызвав функцию EndPaint. При обработке других сообщений контекст должен быть получен с помощью функции GetDC, а после завершения процедуры рисования перед выходом из обработчика сообщений следует освободить полученный контекст, вызвав функцию ReleaseDC.

 В нашем приложении это выглядит так:

HDC hdc;// описатель контекста устройства

PAINTSTRUCT ps;

 

case WM_CHAR:{

hdc = GetDC(hWnd);

. . .

ReleaseDC(hWnd, hdc);

}; break;

 

case WM_PAINT:{

hdc = BeginPaint(hWnd, &ps);

. . .

EndPaint(hWnd, &ps);};

                     break;

 

Методы GDI вывода текста

GDI (интерфейс графического устройства) – набор функций, данных и структур, которые позволяют программе нормально работать на любых графических устройствах отображения, т.е. отделить программу от конкретных характеристик устройства.

Для вывода текста можно использовать функцию BOOL TextOut. В нашем приложении это выглядит так:

TextOut(hdc,xc, yc, &ch, 1); где xc и yc – координаты начальной позиции строки, &ch – указатель на симовол, полученный по нажатию клавиши из wParam, 1 – длина строки.

 

 

Управление направлением, размером и расстоянием между символами

определить параметры самого шрифта с помощью функции CreateFont().

CreateFont(высота,ширина,угол наклона (в 1/10 градуса),поворот базы относительно 0Х,жирность (FW_NORMAL=400; FW_HEAVY=900),

Курсив,подчёркнутый,зачёркнутый,character set identifier,

Точность(меткость вывода), точность сжатия. Соединения,как выравнивать и придерживаться лог. атр. Текста,pitch and family

,typeface name);

 

 


Основы построения и использования вычислительных процессов в Windows

Создание процесса

Процесс создается при вызове приложением функции CreateProcess.[1]

BOOL CreateProcess(

LPCTSTR lpApplicationName,    // указатель на имя исполняемого модуля

LPTSTR lpCommandLine, // указатель на командную строку

LPSECURITY_ATTRIBUTES lpProcessAttributes, // атрибуты безопасности процесса

LPSECURITY_ATTRIBUTES lpThreadAttributes, // атрибуты безопасности потока

BOOL bInheritHandles, // флаг наследования дескрипторов

DWORD dwCreationFlags, // дополнительные параметры создания процесса

LPVOID lpEnvironment, // указатель на блок переменных окружения

LPCTSTR lpCurrentDirectory,   // указатель на текущий каталог

LPSTARTUPINFO lpStartupInfo,  // указатель на структуру STARTUPINFO

LPPROCESS_INFORMATION lpProcessInformation // указатель на PROCESS_INFORMATION

);

Когда приложением вызывается функция CreateProcess, система создает объект ядра “процесс” (process kernel object) с начальным значением счетчика числа пользователей, равным единице. Этот объект – компактная структура данных, через которую операционная система управляет процессом. Затем система создает для нового процесса виртуальное адресное пространство размером 4 Гб и загружает в него код и данные как исполняемого файла, так и любых динамически подключаемых библиотек.

После этого система создает объект ядра “поток” (со счетчиком числа пользователей, равным единице) для управления первичным потоком нового процесса.

 

Описатель процесса

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

 

Командная строка процесса

При создании новому процессу передается командная строка, которая почти никогда не бывает пустой — как минимум, она содержит имя исполняемого файла, использованного при создании этого процесса. Однако, возможны случаи, когда процесс получает командную строку, состоящую из единственного символа — нуля, завершающего строку. В момент запуска приложения стартовый код из библиотеки С++ считывает командную строку процесса, пропускает имя исполняемого файла и заносит в параметр pszCmdLine функции (w)WinMain указатель на оставшуюся часть командной строки.

Параметр pszCmdLine всегда указывает на ANSI-строку. Но, заменив WinMain на wWinMain, Вы получите доступ к Unicode-версии командной строки для своего процесса.

Программа может анализировать и интерпретировать командную строку как угодно. Указатель на полную командную строку процесса можно получить и вызовом функции GetCommandLine.

PTSTR GetCommandLine();

Она возвращает указатель на буфер, содержащий полную командную строку, включая полное имя (вместе с путем) исполняемого файла.

Во многих приложениях безусловно удобнее использовать командную строку, предварительно разбитую на отдельные компоненты, доступ к которым приложение может получить через глобальные переменные __argc и __argv (или __wargv). Функция CommandLineToArgvW расщепляет Unicode-строку на отдельные компоненты:

PWSTR CommandLineToArgvW( PWSTR pszCmdLine, int* pNumArgs );

Буква W в конце имени этой функции намекает на "широкие" (wide) символы и подсказывает, что функция существует только в Unicode-версии. Параметр pszCmdLine указывает на командную строку. Его обычно получают предварительным вызовом GetCommandLineW. Параметр pNumArgs — это адрес целочисленной переменной, в которой задается количество аргументов в командной строке. Функция CommandLineToArgvW возвращает адрес массива указателей на Unicode-строки.

 

Среда процесса.

С любым процессом связан блок переменных окружения — область памяти, выделенная в адресном пространстве процесса. Каждый блок содержит группу строк такого вида

VarName1=VarValue1\0

VarName2=VarValue2\0

...

VarNameX=VarValueX\0

\0

Первая часть каждой строки — имя переменной окружения. За ним следует знак равенства и значение, присваиваемое переменной. Строки в блоке переменных окружения должны быть отсортированы в алфавитном порядке по именам переменных.

Конец блока переменных окружения помечается дополнительным нулевым символом.

Переменные окружения обычно применяются для тонкой настройки приложения. Пользователь создает и инициализирует переменную окружения, затем запускает приложение, и оно, обнаружив эту переменную, проверяет ее значение и соответствующим образом настраивается.

GetEnvironmentVariable позволяет выявлять присутствие той или иной переменной окружения и определять ее значение:

DWORD GetEnvironmentVariable( PCTSTR pszName, PTSTR pszValue, DWORD cchValue);

При вызове GetEnvironmentVariable параметр pszName должен указывать на имя интересующей Вас переменной, pszValue — на буфер, в который будет помещено значение переменной, а в cchValue следует сообщить размер буфера в символах. Функция возвращает либо количество символов, скопированных в буфер, либо 0, если ей не удалось обнаружить переменную окружения с таким именем.

функция SetEnvironmentVariable позволяет добавлять, удалять и модифицировать значение переменной.

DWORD SetEnvironmentVariable(

PCTSTR pszName,

PCTSTR pszValue);

Она устанавливает ту переменную, на чье имя указывает параметр pszName, и присваивает ей значение, заданное параметром pszValue. Если такая переменная уже существует, функция модифицирует ее значение. Если же в pszValue содержится NULL, переменная удаляется из блока.

 


Дата добавления: 2019-02-13; просмотров: 277; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!