
- •Системное по. Цели, задачи, классификация
- •Операционная система. Основные функции ос. Структура операционной системы.
- •Общая характеристика операционных систем Microsoft: семейства dos, Windows
- •Интерфейс прикладных программ (api). Apidos (программные прерывания) и Win32
- •Дисковая подсистема в архитектуре ibmpc
- •Низкоуровневая организация дисковой памяти. Сервис bios доступа к дисковой подсистеме.
- •Понятие файловой системы. Назначение, требования, функции. Способы организации фс.
- •Объекты файловой системы: файлы, директории, логические устройства, другие виды объектов.
- •Файловые системы на основе fat
- •X.2 Файловая система ntfs
- •Служебные структуры fat и их использование
- •Программный интерфейс файловой системы (функции для взаимодействия с фс, файлового ввода-вывода) – dos, Windows Функции общего назначения
- •Файловый ввод-вывод
- •14. Адресное пространство процесса (задачи).
- •15. Приложения Windows (Win 32), разновидности. Структура оконных приложений
- •1. Основные определения
- •2. Особенности приложений Win 32.
- •3. Событийное управление
- •4. Структура приложения
- •16. Окно Win32: назначение, виды, свойства. Оконные классы.
- •17. Создание и управление окнами.
- •18. Событийное управление в Win32. Сообщения и очереди сообщений Windows (Windowsmessages): назначение, структура, отсылка, доставка, обработка Сообщения и очереди сообщений.
- •19. Цикл обработки сообщений. Оконная процедура: назначение, выполнение, способы активизации и завершения.
- •20. Многозадачность, многозадачные операционные системы, особенности выполнения приложений в многозадачной среде. Модель многозадачности Win 32
- •21. Состояния процессов (многозадачная среда). Состояния процессов (потоков)
- •22. Многозадачность в win32. Планирование и выполнения программ в win32
- •23. Процессы win32. Атрибуты и состояния процессов. Порождение процессов и управление ими. Основы управления процессами Win32
- •24. Потоки и многопоточные приложения. Порождение потоков, состояние потоков, управление ими. Основы управления потоками Win32
- •25. Нити – альтернативное управление выполнением программы Управление нитями
- •26. Распределение времени выполнения программ в многозадачной системе. Приоритеты. Распределение времени между потоками (управление приоритетами)
- •27. Приоритеты процессов и потоков win32. Управление приоритетами.
- •28. Взаимодействие процессов/потоков, взаимное исключение, синхронизация (базовые сведения)
- •29. Реализация взаимного исключения. Механизм criticalsection.
- •30. Синхронизация при управлении процессами и потоками
- •31. Функция ожидания
- •32. Использование каналов и почтовых ящиков для обмена данными
- •33. Использование файловой системы для обмена данными
- •X.2.6. Использование сообщения wm_copydata
- •34. Графическая подсистема win32 – общая характеристика, основные принципы.
- •35. Основные объекты win32 gdi. Средства векторной и растровой графики
- •Растровая графика
- •36. Подсистема памяти. Основные задачи, функции, требования
- •37. Виртуальное адресное пространство, управление памятью.
- •38. Динамическое распределение памяти программами (heap). HeapApiWin32.
- •Функции работы с кучами (heap-область)
- •39. Подсистема памяти win32. Регионы(области) памяти. Группы функций api подсистемы памяти. Адресное пространство процесса.
- •40. Управление на уровне менеджера вирнуальной памяти. (vmm)
- •41. Отображение файлов в память Проецирование файлов в память
- •42. Системный реестр windows: назначение, организация, доступ
35. Основные объекты win32 gdi. Средства векторной и растровой графики
В рамках принятого в Windows подхода за собственно формирование изображения отвечают т.н. инструменты, а функции отрисовки, как правило, лишь задают их поведение (перемещение). Ярким примером может служить работа с готовыми растровыми изображениями: получение контекста, связанного с битовым образом и затем отрисовка примитивов в этом контексте , в т.ч. другого растрового изображения.
(Похожим образом был организован и упоминавшийся BGI. Ее функции рисования использовали единые централизованно устанавливаемые параметры.).
Инструменты также являются системными объектами, но прикладная программа может произвольно создавать их и управлять ими. Как обычно, инструмент идентифицируется его описателем, тип данных HGDIOBJ (handle GDI object).
К основным инструментам относятся:
– "перо" или "карандаш" (Pen) – контурные примитивы (в переводе чаще употребляется термин "карандаш");
– "кисть" (Brush) – закраска (штриховка) внутренних областей примитивов;
– "шрифт" (Font) – символы и строки;
– "битовая карта" (Bitmap) – "готовые" растровые изображения
Инструменты создаются соответствующими специфическими функциями вида Create..., возвращающими их описатели (NULL как признак ошибки). Количество создаваемых инструментов искусственно не ограничивается, но в любом контексте одновременно может быть активным только один инструмент каждого типа. Для установки инструмента в качестве активного в данном контексте служит универсальная функция SelectObject, принимающая описатель нового инструмента и самостоятельно определяющая его тип, при этом возвращается описатель того инструмента, который в результате был замещен. Выбор инструмента отменить нельзя, но можно повторять его сколько угодно раз с любыми другими инструментами того же типа. Инструменты различного типа между собой взаимно независимы. Функция DeleteObject удаляет созданные инструменты. Перед удалением инструмент следует дезактивировать, выбрав активным другой того же типа (например, сохраненный предыдущий). Пользоваться удаленным инструментом, очевидно, нельзя; поэтому, временно заместив инструменты, установленные для контекста изначально, обязательно нужно восстановить их перед удалением замещающих.
Информация о любом инструменте может быть получена с помощью функции GetObject, аргументами которой являются контекст, буфер для сохранения данных и его размер. Данные записываются в буфер в виде структур LOGPEN, LOGBRUSH, LOGFONT и т.д.
Рассмотрим примеры создания инструментов.
.1 Инструмент Pen
Инструмент служит для отображения контурных примитивов
Функция CreatePen()
Действие: создание пера (карандаша) с заданными параметрами
Форматфункции:
HPEN CreatePen(int fStyle,int nWidth,COLORREF crColor
Возвращаемое значение: описатель созданного инструмента или NULL.
Параметры:
fStyle – стиль пера, может принимать значения: PS_SOLID (сплошная линия), PS_DASH, PS_DOT, PS_DASHDOT, PS_DASHDOTDOT (штриховые, пунктирные и штрихпунктирные), PS_NULL ("пустое", нерисующее перо), PS_INSIDEFRAME (внутренняя обводка: в замкнутом контуре автоматически отступает внутрь в соответствии с толщиной линии).
nWidth – толщина линии пера в логических единицах, по умолчанию в пикселах; значение 0 соответствует толщине 1 пиксел независимо от установленного режима отображения.
crColor – цвет линии пера; тип COLORREF совместим с 32-разрядным целым, хранит 3 однобайтовые цветовые компоненты модели RGB, либо информацию для палитрового преобразования; может быть получен, например, с помощью функции (макроса) RGB, аргументами которой являются цветовые компоненты.
ФункцияExtCreatePen()
Действие: создание пера с расширенными возможностями
Форматфункции:
HPEN CreatePen(
DWORD fStyle,DWORD nWidth,const LOGBRUSH lpPenBrush,
DWORD dwPatternCount,const DWORD* lpPattern
)
Возвращаемое значение: описатель созданного инструмента или NULL.
Параметры:
fStyle – стиль пера, комбинация по ИЛИ нескольких групп значений:
тип пера: PS_GEOMETRIC (точная отрисовка), PS_COSMETIC (упрощенная);
стиль: к набору значений предыдущей функции добавляются PS_ALTERNATE (воздействует на каждый второй? пиксел, в Window NT работает только для "косметических" перьев, в Window 9x не поддерживается) и PS_USERSTYLE (произвольная штриховая линия, штрихи задаются отдельным массивом, в Window 9x не поддерживается); штриховые стили в Windows 9x поддерживаются только для "косметических" перьев;
типконцовотрезков: PS_ENDCAP_ROUND, PS_ENDCAP_SQUARE, PS_ENDCAP_FLAT;
типсоединений: PS_JOIN_BEVEL, PS_JOIN_MITER, PS_JOIN_ROUND.
nWidth – толщина линии пера.
lpPenBrush – структура данных кисти (см. ниже), используемой для отрисовки линии пера; для пера "cosmetic" используется только компонента цвета и принудительно устанавливается "сплошная" кисть.
dwPatternCount – число элементов в массиве описания шаблона (только для стиля PS_USERSTYLE), или 0.
lpdwPattern – массив двойных слов, описывающий шаблон, в формате: <длина_штриха>-<длина_пропуска>-<длина_штриха>-....
Функции CreatePenIndirect(constLOGPEN* lplgPen) и CreateExtPenIndirect(constLOGEXTPEN* lplgExtPen) отличаются тем, что вместо полного списка атрибутов пера передаются специальные структуры LOGPEN и LOGEXTPEN, содержащие поля аналогичного назначения; в ряде случаев это более предпочтительно.
.2 Инструмент Brush
ФункцияCreateBrushIndirect()
Действие: создание кисти с заданными параметрами
Форматфункции:
HPEN CreateBrushIndirect(const LOGBRUSH* lplgBrush)
Возвращаемое значение: описатель созданного инструмента или NULL.
Параметр: структура LOGBRUSH, содержащая поля:
UINT lbStyle – стиль (тип) кисти: BS_SOLID ("сплошная" кисть), BS_HOLLOW, BS_NULL ("пустая", невидимая кисть), BS_HATCHED ("штрихованная" кисть), BS_PATTERN, BS_PATTERN8X8 (задается битовой картой), BS_DIBPATTERN, BS_DIBPATTERN8X8, BS_DIBPATTERNPT (задается битовой картой DIB, в Windows 95 размер шаблона ограничен 88 точек).
COLORREF lbColor – цвет кисти; для пустой или "шаблонной" кисти игнорируется; для кистей с DIB-шаблоном младшее слово определяет, следует ли интерпретировать его цвета как заданные цветовыми компонентами (DIB_RGB_COLORS) или как палитровые (DIB_PAL_COLORS);
LONG lbHatch – тип штриховки для штрихованной кисти: HS_HORIZONTAL, HS_VERTICAL, HS_BDIAGONAL (диагональная слева направо вверх), HS_FDIAGONAL (диагональная слева направо вниз), HS_CROSS (прямая сетка), HS_DIAGCROSS (диагональная сетка), или описатель шаблона, или описатель шаблона DIB (BS_DIBPATTERN, BS_DIBPATTERN8X8), или указатель на шаблон DIB (BS_DIBPATTERNPT);
Если выбранные перо или кисть не сплошные, то они не воздействует на фоновые промежутки, например, между штрихами, однако эти промежутки заполняются фоновым цветом. Для работы с фоновым цветом служит следующие функции:
COLORREFSetBkColor(HDChdc, COLORREFcrColor);
COLORREFGetBkColor(HDChdc);
Функции соответственно устанавливают новое или получают текущий фоновый цвета. Признаком ошибки является возвращенное значение CLR_INVALID. Функция SetBkColor возвращает значение предыдущего цвета. Установка цвета эффективна, если устройство (контекст) реально его поддерживает.
Фон может быть сделан "прозрачным" (невидимым), что достигается установкой соответствующего режима его отрисовки. Возможны 2 режима: OPAQUE (сначала рисуется фон, затем передний план) и TRANSPARENT (фон не отрисовывается). Используются следующие функции:
intSetBkMode(HDChDC,intiBkMode);
intGetBkMode(HDChDC);
Признаком ошибки служи возвращенное нулевое значение.
.3 Инструмент Font
Более сложным инструментом является шрифт. Все символы в оконном интерфейсе формируются в соответствии с одним из зарегистрированных в системе шрифтов.
(Шрифтовая модель Windows. FontMapper. Растровые и векторные шрифты. Гарнитура, кегль, питч, кернинг, интерлиньяж и т.д. Соответствие имен и гарнитур, подмена, совместимость.)
Физический шрифт – файл (образ в памяти) с описанием начертаний всех символов, известных в данном шрифте. Логический шрифт – объект GDI, характеризуемый как применяемым физическим шрифтом, так и его конкретными количественными характеристиками. Он же является и инструментом, отвечающим за формирование символов.
ФункцияCreateFont()
Действие: создание логического шрифта.
Формат функции:
HFONT CreateFont(
int nHeight, int nWidth,
int nEscapement, int nOrientation,
int fnWeight,
DWORD fdwItalic, DWORD fdwUnderline, DWORD fdwStrikeOut,
DWORD fdwCharSet,
DWORD fdwOutputPrecision, DWORD fdwClipPrecision, DWORD fdwQuality,
DWORDfdwPitchAndFamily,
LPCTSTRlpszFace
);
Возвращаемое значение: описатель созданного инструмента или NULL.
Параметры:
nHeight – основной размер (высота, em-height) шрифта в логических единицах, значение интерпретируется следующим образом: положительное – высота знакоместа, отрицательное – высота шрифта (после смены знака), нулевое – размер по умолчанию; при неточном соответствии требуемого размера доступным выбирается наибольший не превышающий требуемый.
nWidth – "приблизительная" ширина шрифта (ex-width); если 0, то стандартная для выбранного основного размера.
nEscapement – направление вывода строки символов, определяется как угол между базовой линией и горизонтальной осью по часовой стрелке в десятых долях градуса;
nOrientation – ориентация отдельного символа, исчисление аналогично предыдущему параметру; в Windows 9x ориентация символов и направление вывода должны совпадать.
fnWeight – толщина символов в условных единицах от 0 до 1000, например: 0 (FW_DONTCARE) – стандартный, по умолчанию, 400 (FW_NORMAL, FW_REGULAR) – стандартная толщина, обычный шрифт, 700 (FW_BOLD) – жирный, выделенный (в русифицированный приложениях обычно "полужирный"), и т.д.
fdwItalic, fdwUnderline, fdwStrikeOut – флаги, указывающие, является ли шрифт наклонным, подчеркнутым или перечеркнутым.
fdwCharSet – тип символьного набора (charset): DEFAULT_CHARSET, ANSI_CHARSET, OEM_CHARSET и т.д., в основном национальные наборы символов, например, русский, восточноевропейский, китайский; поддержка конкретных наборов зависит от операционной системы, а также применяемого физического шрифта.
fdwOutputPrecision – "точность вывода" символов, фактически предпочтение типа шрифта при наличии альтернативного выбора: OUT_DEFAULT_PRECIS, OUT_DEVICE_PRECIS, OUT_RASTER_PRECIS, OUT_TT_PRECIS, OUT_TT_ONLY_PRECIS и т.д.
fdwClipPrecision – "точность отсечения"; большинство значений в настоящее время не используются (безразличны), поведение по умолчанию – CLIP_DEFAUL_PECIS.
fdwQuality – "качество" вывода, точнее степень предпочтительности визуального качества по сравнению с точностью воспроизведения прочих параметров: DEFAULT_QUALITY, DRAFT_QUALITY, PROOF_QUALITY.
fdwPitchAndFamily – комбинация по ИЛИ 2 групп параметров, действующих при неопределенном имени шрифта:
– питч (шаг символов) – 2 младших бита: DEFAULT_PITCH, FIXED_PITCH, VARIABLE_PITCH;
– "семейство" шрифта – 4 старших бита: FF_DONTCARE (по умолчанию), FF_MODERN (моноширинные шрифты с засечками и без), FF_ROMAN ("книжные" с засечками, переменный шаг), FF_SWISS (без засечек, переменный шаг), FF_SCRIPT ("рукописные" и курсивные), FF_DECORATIVE (не вполне понятная характеристика из документации: "Noveltyfonts. OldEnglishisanexample.").
lpszFace – имя шрифта, как правило, совпадает с именем его дискового файла; если NULL, то система подбирает шрифт, наиболее отвечающий заданным требованиям, иначе явно указанный шрифт перекрывает их.
Базовая линия (baseline) символа проходит по верхней границе знакоместа слева направо (в "системе координат" символа). В этой связи необходимо отметить некоторые особенности. Во-первых, отсчет угла между базовой линией и горизонтальной осью всегда идет по часовой стрелке в действующей системе координат, вследствие чего зрительно в режиме MM_TEXT поворот происходит в обратную сторону. Направление отсчета угла поворота обратно принятому на стандартном "тригонометрическом круге"! Во-вторых, символы всегда, независимо от режима, расположены в собственной "локальной системе координат" под базовой линией, т.е. при любой ориентации нижняя часть символа отклонена от нее на 90зрительно вправо, что необходимо учитывать в "многорежимных" программах.
Функция CreateFontIndirect(constLOGFONT* lplgFont) отличается тем, что использует в качестве аргумента структуру с полями аналогичного назначения.
Как видно, параметры шрифта не включают цвет инструмента, отображающего образ символа. Управление цветом выводимого текста осуществляется функциями:
COLORREFSetTextColor(HDChDC, COLORREFcrColor).
COLORREFGetTextColor(HDChDC);
Кроме того, знакоместо символа, не занятое его образом, считается фоном, цветом и прозрачностью которого можно управлять (см. выше).
Базовой функцией вывода символа является:
BOOL TextOut(HDC hdc, // handle of device context
int nXStart,int nYStart,
LPCTSTR lpString,
int cbString
);
Позицией символа считается верхний левый угол его знакоместа.
Помимо собственно вывода текста часто нужно заранее определить величину занимаемого им пространства, особенно с учетом приблизительности и неопределенности ряда параметров шрифта. Горизонтальные размеры могут быть проанализированы с помощью следующих функций:
BOOLGetCharWidth(
HDC hdc,UINT iFirstChar,UINT iLastChar,LPINT lpBuffer
);
BOOL GetCharWidth32(
HDC hdc,UINT iFirstChar,UINT iLastChar,LPINT lpBuffer
);
BOOL GetCharWidthFloat(
HDC hdc,UINT iFirstChar,UINT iLastChar,PFLOAT pxBuffer
);
Действие функций: заполняют массив значениями ширин символов с номерами из заданного диапазона iFirstChar... iLastChar, выводимых текущим в данном контексте шрифтом. Целочисленные ширины отсчитываются в логических координатах. Вещественный формат имеет разрядность 32 бит в соответствии с IEEE.
Возвращаемое значение: признак успешности операции.
Более подробная информация может быть получена с помощью структуры ABC, имеющей следующие поля:
intabcA – т.н. "A"-spacing, отступ слева до начала видеобраза символа;
UINTabcB – "B"-spacing, ширина видеобраза символа;
intabcC – "B"-spacing, отступ справа после видеобраза символа.
Сумма всех трех значений дает общую ширину символа вместе с зазорами. Отступы "A" и "C" могут быть как положительными (символы отделены друг от друга), так и отрицательными (наложение символов).
Функция GetCharABCWidths действует подобно GetCharWidth, но заполняет массив структур ABC:
BOOL GetCharABCWidths(
HDC hdc,UINT uFirstChar,UINT uLastChar,LPABC lpabc
);
Функция нормально работает только со шрифтами TrueType.
Для преобразования значений полей ABC в логические единицы измерения используется поле omtSquare структуры OUTLINETEXTMETRIC. Там же содержится наиболее полная информация о действующем шрифте.
Наиболее "употребимые" параметры шрифта, включая вертикальные размеры, содержатся в структуре TEXTMETRIC (включена в OUTLINETEXTMETRIC). Все размеры в логических единицах измерения:
LONGtmHeight – полный вертикальный размер символов (знакоместа), равен (ascent+descent);
LONGtmAscent, LONGtmDescent – вертикальный размер символа выше и ниже линии основания (baseline);
LONGtmInternalLeading – пробельное (свободное от видеобраза символа) пространство внутри знакоместа по высоте;
LONGtmExternalLeading – зазор по высоте между знакоместами (строками знакомест);
LONGtmAveCharWidth – типовая средняя ширина символа данного шрифта, т.н. ex-width (за единицу принимается ширина символа 'x');
LONGtmMaxCharWidth – наибольшая ширина символов данного шрифта;
LONGtmWeight – "жирность" шрифта;
LONGtmOverhang – дополнительный зазор по ширине, добавляемый к строками при некоторых "синтезированных" шрифтах, например, полужирном или наклонном;
LONGtmDigitizedAspectX, LONGtmDigitizedAspectY – показатели пропорциональности горизонтальных и вертикальных размеров для данного устройства;
BCHARtmFirstChar, BCHARtmLastChar – первый и последний символы в данном шрифте;
BCHARtmDefaultChar – "символ по умолчанию", заменитель для образов символов, отсутствующих в шрифте;
BCHARtmBreakChar – символ – разделитель слов в тексте;
BYTEtmItalic, BYTEtmUnderlined, BYTEtmStruckOut – флаги наклонного, подчеркнутого и перечеркнутого шрифта;
BYTEtmPitchAndFamily – "тип и семейство" шрифта, комбинация битовых полей:
4 младших разряда – шаг и технология: TMPF_FIXED_PITCH (моноширинный шрифт), TMPF_VECTOR (векторный шрифт), TMPF_TRUETYPE (шрифт TrueType), TMPF_DEVICE (шрифт, зависимый от устройства, devicefont); интерпретация комбинированных значений может быть неочевидной, например, шрифты PostScript и TrueType маркируются векторными, но PostScript будет также и "device";
4 старших разряда – семейство шрифта, описываемое константами (см. выше): FF_DONTCARE, FF_MODERN, FF_ROMAN, FF_SWISS, FF_SCRIPT, FF_DECORATIVE;
BYTEtmCharSet – набор символов (см. выше);
Еще более информативна структура OUTLINETEXTMETRIC, включающая также и TEXTMETRIC. Ввиду большого числа полей подробное описание данной структуры здесь опущено.
Заполнение указанных структур осуществляется функциями:
BOOLGetTextMetrics(
HDChdc, //контекст
LPTEXTMETRIClptm //заполняемый буфер (структура)
);
UINTGetOutlineTextMetrics(
HDChdc, //контекст
UINTcbData, //размер буфера
LPOUTLINETEXTMETRIClpOTM //заполняемый буфер (структура)
);
Для обоих функций возвращаемое значение TRUE (не ноль) при успешном завершении и FALSE при ошибке.