- •Классификация системного программного обеспечения
- •Другая классификация
- •Требования к системному программному обеспечению
- •2. Операционная система. Основные функции ос. Структура операционной системы.
- •3. Интерфейс прикладных программ (api) ос. Api Win32 (системные функции).
- •Api операционных систем.
- •Структура api-программ
- •4. Дисковая подсистема в архитектуре ibm pc.
- •5. Низкоуровневая организация дисковой памяти. Сервис bios доступа к дисковой подсистеме.
- •Емкость Диска
- •Оглавление Диска (Каталог)
- •Основные Положения На Память
- •6. Понятие файловой системы. Назначение, требования, функции. Способы организации фс.
- •7. Объекты файловой системы: файлы, директории, логические устройства, другие виды объектов. Файловая система
- •Имена файлов
- •Типы файлов
- •Логическая организация файла
- •Физическая организация и адрес файла
- •Права доступа к файлу
- •Кэширование диска
- •Общая модель файловой системы
- •Отображаемые в память файлы
- •Современные архитектуры файловых систем
- •8. Файловые системы на основе fat (либо по желанию ntfs, s5fs, ufs, ext и т.Д.).
- •9. Служебные структуры файловых систем fat и их использование.
- •1.3.2. Файловые системы
- •Файловая система fat Краткие теоретические сведения
- •Обзор файловой системы fat
- •Имена файлов в fat
- •Преимущества файловой системы fat
- •Недостатки файловой системы fat
- •Обзор файловой системы hpfs
- •Суперблок
- •Запасной блок
- •Преимущества файловой системы hpfs
- •Недостатки файловой системы hpfs
- •Обзор файловой системы ntfs
- •Надежность
- •Дополнительные функции
- •Поддержка posix
- •Устранение ограничений
- •Преимущества файловой системы fat
- •Недостатки файловой системы ntfs
- •Соглашения именования в ntfs
- •10. Программный интерфейс файловой системы (функции для взаимодействия с фс, файлового ввода-вывода) - dos, Win32.
- •12. Вычислительный процесс. Состояния вычислительного процесса.
- •[Править]Создание программ
- •[Править]Использование программ
- •[Править]Правовые аспекты
- •13. Адресное пространство процесса (задачи).
- •20. Адресное пространство процесса
- •14. Приложения Windows (Win 32), разновидности. Структура оконных (windowed) приложений.
- •2. Особенности приложений Win 32.
- •17. Событийное управление в Win32. Сообщения и очереди сообщений Windows (Windows messages): назначение, структура, отсылка, доставка, обработка.
- •18. Цикл обработки сообщений. Оконная процедура: назначение, выполнение, способы активизации и завершения. Краткие теоретические сведения
- •19. Многозадачность, многозадачные операционные системы, особенности выполнения приложений в многозадачной среде.
- •Краткие теоретические сведения поток
- •Краткие теоретические сведения
- •27. Взаимодействие процессов/потоков, взаимное исключение, синхронизация (базовые сведения)
- •Синхронизация субъектов взаимодействия
- •Сравнительная характеристика механизмов взаимодействия
- •33. Графическая подсистема Win32 (gdi) - общая характеристика, основные концепции, объекты (инструменты).
- •Х.1 Общие сведения
- •Х.2 Системы координат и единицы измерения
- •Х.3 Цвета и палитры
- •Х.4 Основные инструменты графической подсистемы
- •Х.4 Растровая графика
- •Х.5 Управление областями вывода и отсечением
- •Х.6 Некоторые аспекты использования графической подсистемы
- •34. Подсистема памяти. Основные задачи, функции, требования. 35. Виртуальное адресное пространство, управление памятью с использованием виртуального адресного пространства.
- •37. Подсистема памяти Win32. Регионы (области) памяти. Группы функций api подсистемы памяти.
- •38. Распределение памяти на уровне менеджера виртуальной памяти (vmm api - Win32). In (35) 3. Архитектура памяти в Win32® api. 3.2. Управление виртуальной памятью. Vmm.
- •39. Отображение файлов в память (File mapping - Win32).
- •4.1 Адресное пространство процесса.
- •4.2 Функции работы с виртуальной памятью.
- •4.3 Проецирование файлов в память
- •4.4.1 Запуск исполняемых файлов и динамически связываемых библиотек
- •4.4.2 Проецирование файлов данных
- •4.4.3 Взаимодействие процессов через общую область данных
- •4.4 Функции работы с кучами (heap-область)
- •4.5 Глобальные и локальные объекты "память"
- •4.6 Функции crt Memory api
- •X.2. Структура подсистемы памяти Win 32 и группы функций
- •40. Системный реестр Windows: назначение, организация, доступ.
Х.4 Основные инструменты графической подсистемы
В рамках принятого в 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(const LOGPEN* lplgPen) и CreateExtPenIndirect(const LOGEXTPEN* 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);
Если выбранные перо или кисть не сплошные, то они не воздействует на фоновые промежутки, например, между штрихами, однако эти промежутки заполняются фоновым цветом. Для работы с фоновым цветом служит следующие функции:
COLORREF SetBkColor(HDC hdc, COLORREF crColor);
COLORREF GetBkColor(HDC hdc);
Функции соответственно устанавливают новое или получают текущий фоновый цвета. Признаком ошибки является возвращенное значение CLR_INVALID. Функция SetBkColor возвращает значение предыдущего цвета. Установка цвета эффективна, если устройство (контекст) реально его поддерживает.
Фон может быть сделан "прозрачным" (невидимым), что достигается установкой соответствующего режима его отрисовки. Возможны 2 режима: OPAQUE (сначала рисуется фон, затем передний план) и TRANSPARENT (фон не отрисовывается). Используются следующие функции:
int SetBkMode(HDC hDC,int iBkMode);
int GetBkMode(HDC hDC);
Признаком ошибки служи возвращенное нулевое значение.
.3 Инструмент Font
Более сложным инструментом является шрифт. Все символы в оконном интерфейсе формируются в соответствии с одним из зарегистрированных в системе шрифтов.
(Шрифтовая модель Windows. Font Mapper. Растровые и векторные шрифты. Гарнитура, кегль, питч, кернинг, интерлиньяж и т.д. Соответствие имен и гарнитур, подмена, совместимость.)
Физический шрифт – файл (образ в памяти) с описанием начертаний всех символов, известных в данном шрифте. Логический шрифт – объект 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,
DWORD fdwPitchAndFamily,
LPCTSTR lpszFace
);
Возвращаемое значение: описатель созданного инструмента или 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 (не вполне понятная характеристика из документации: "Novelty fonts. Old English is an example.").
lpszFace – имя шрифта, как правило, совпадает с именем его дискового файла; если NULL, то система подбирает шрифт, наиболее отвечающий заданным требованиям, иначе явно указанный шрифт перекрывает их.
Базовая линия (base line) символа проходит по верхней границе знакоместа слева направо (в "системе координат" символа). В этой связи необходимо отметить некоторые особенности. Во-первых, отсчет угла между базовой линией и горизонтальной осью всегда идет по часовой стрелке в действующей системе координат, вследствие чего зрительно в режиме MM_TEXT поворот происходит в обратную сторону. Направление отсчета угла поворота обратно принятому на стандартном "тригонометрическом круге"! Во-вторых, символы всегда, независимо от режима, расположены в собственной "локальной системе координат" под базовой линией, т.е. при любой ориентации нижняя часть символа отклонена от нее на 90 зрительно вправо, что необходимо учитывать в "многорежимных" программах.
Функция CreateFontIndirect(const LOGFONT* lplgFont) отличается тем, что использует в качестве аргумента структуру с полями аналогичного назначения.
Как видно, параметры шрифта не включают цвет инструмента, отображающего образ символа. Управление цветом выводимого текста осуществляется функциями:
COLORREF SetTextColor(HDC hDC, COLORREF crColor).
COLORREF GetTextColor(HDC hDC);
Кроме того, знакоместо символа, не занятое его образом, считается фоном, цветом и прозрачностью которого можно управлять (см. выше).
Базовой функцией вывода символа является:
BOOL TextOut(HDC hdc, // handle of device context
int nXStart,int nYStart,
LPCTSTR lpString,
int cbString
);
Позицией символа считается верхний левый угол его знакоместа.
Помимо собственно вывода текста часто нужно заранее определить величину занимаемого им пространства, особенно с учетом приблизительности и неопределенности ряда параметров шрифта. Горизонтальные размеры могут быть проанализированы с помощью следующих функций:
BOOL GetCharWidth(
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, имеющей следующие поля:
int abcA – т.н. "A"-spacing, отступ слева до начала видеобраза символа;
UINT abcB – "B"-spacing, ширина видеобраза символа;
int abcC – "B"-spacing, отступ справа после видеобраза символа.
Сумма всех трех значений дает общую ширину символа вместе с зазорами. Отступы "A" и "C" могут быть как положительными (символы отделены друг от друга), так и отрицательными (наложение символов).
Функция GetCharABCWidths действует подобно GetCharWidth, но заполняет массив структур ABC:
BOOL GetCharABCWidths(
HDC hdc, UINT uFirstChar, UINT uLastChar, LPABC lpabc
);
Функция нормально работает только со шрифтами TrueType.
Для преобразования значений полей ABC в логические единицы измерения используется поле omtSquare структуры OUTLINETEXTMETRIC. Там же содержится наиболее полная информация о действующем шрифте.
Наиболее "употребимые" параметры шрифта, включая вертикальные размеры, содержатся в структуре TEXTMETRIC (включена в OUTLINETEXTMETRIC). Все размеры в логических единицах измерения:
LONG tmHeight – полный вертикальный размер символов (знакоместа), равен (ascent+descent);
LONG tmAscent, LONG tmDescent – вертикальный размер символа выше и ниже линии основания (base line);
LONG tmInternalLeading – пробельное (свободное от видеобраза символа) пространство внутри знакоместа по высоте;
LONG tmExternalLeading – зазор по высоте между знакоместами (строками знакомест);
LONG tmAveCharWidth – типовая средняя ширина символа данного шрифта, т.н. ex-width (за единицу принимается ширина символа 'x');
LONG tmMaxCharWidth – наибольшая ширина символов данного шрифта;
LONG tmWeight – "жирность" шрифта;
LONG tmOverhang – дополнительный зазор по ширине, добавляемый к строками при некоторых "синтезированных" шрифтах, например, полужирном или наклонном;
LONG tmDigitizedAspectX, LONG tmDigitizedAspectY – показатели пропорциональности горизонтальных и вертикальных размеров для данного устройства;
BCHAR tmFirstChar, BCHAR tmLastChar – первый и последний символы в данном шрифте;
BCHAR tmDefaultChar – "символ по умолчанию", заменитель для образов символов, отсутствующих в шрифте;
BCHAR tmBreakChar – символ – разделитель слов в тексте;
BYTE tmItalic, BYTE tmUnderlined, BYTE tmStruckOut – флаги наклонного, подчеркнутого и перечеркнутого шрифта;
BYTE tmPitchAndFamily – "тип и семейство" шрифта, комбинация битовых полей:
4 младших разряда – шаг и технология: TMPF_FIXED_PITCH (моноширинный шрифт), TMPF_VECTOR (векторный шрифт), TMPF_TRUETYPE (шрифт TrueType), TMPF_DEVICE (шрифт, зависимый от устройства, device font); интерпретация комбинированных значений может быть неочевидной, например, шрифты PostScript и TrueType маркируются векторными, но PostScript будет также и "device";
4 старших разряда – семейство шрифта, описываемое константами (см. выше): FF_DONTCARE, FF_MODERN, FF_ROMAN, FF_SWISS, FF_SCRIPT, FF_DECORATIVE;
BYTE tmCharSet – набор символов (см. выше);
Еще более информативна структура OUTLINETEXTMETRIC, включающая также и TEXTMETRIC. Ввиду большого числа полей подробное описание данной структуры здесь опущено.
Заполнение указанных структур осуществляется функциями:
BOOL GetTextMetrics(
HDC hdc, //контекст
LPTEXTMETRIC lptm //заполняемый буфер (структура)
);
UINT GetOutlineTextMetrics(
HDC hdc, //контекст
UINT cbData, //размер буфера
LPOUTLINETEXTMETRIC lpOTM //заполняемый буфер (структура)
);
Для обоих функций возвращаемое значение TRUE (не ноль) при успешном завершении и FALSE при ошибке.