Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
vazhnoe.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
843.48 Кб
Скачать

12. Системы координат. Трансформации. Матрица трансформаций. Виды трансформаций и их представление в матрице трансформаций. Преобразования в страничной системе координат. Режимы масштабирования.

    • Мировая – world coordinate space (2^32). Обеспечивает параллельный перенос, масштабирование, отражение, поворот, наклон.

    • Логическая (страничная) – page coordinate space (2^32). Устаревшая система координат, основанная на режимах масштабирования (mapping modes). Обеспечивает параллельный перенос, масштабирование, отражение.

    • Устройства – device coordinate space (2^27). Обеспечивает параллельный перенос (к началу координат на устройстве).

    • Физическая – physical device coordinate space. Например, клиентская область окна на экране.

Трансформации

  • Включить расширенный графический режим:

    • int SetGraphicsMode(HDC hdc, int iMode); GM_ADVANCED

Матрица трансформации:

Struct XFORM

{FLOAT eM11,eM12,eM21,eM22, eDx,eDy}

|eM11 eM12 0|

|eM21 eM22 0|

|eDx eDy 1| (ris_1)

Применение матрицы трансформации:

|x` y` 1| = |x y 1| * (ris_1)

  • Формулы:

    • x' = x * eM11 + y * eM21 + eDx

    • y' = x * eM12 + y * eM22 + eDy

Страничная система координат

  • Преобразования в страничной системе координат:

    • DX = (LX – ­XWO) * XVE/XWE + XVO

    • DY = (LY – YWO) * YVE/YWE + YVO

    • LX, LY – координаты в логической системе

    • DX, DY – координаты в физической системе

  • Функции:

    • bool LPtoDP(HDC hdc, POINT* lpPoints, int nCount), DPtoLP.

    • SetWindowOrgEx, SetViewportOrgEx – смещения.

    • SetViewportExtEx, SetWindowExtEx – масштабные коэффициенты. Взятые отдельно, эти функции смысла не имеют.

  • Режимы масштабирования:

    • int SetMapMode(HDC hdc, int fnMapMode), GetMapMode.

13. Понятие ресурсов программ Windows. Виды ресурсов. Операции с ресурсами.

Ресурсы – двоичные данные, записываемые в исполняемый модуль приложения. Стандартные типы ресурсов:

Курсор – Cursor,Картинка – Bitmap,Значок – Icon,Меню – Menu,Окно диалога – Dialog Box,Таблица строк – String Table,Таблица сообщений (об ошибках) – Message Table,Шрифт – Font,Таблица горячих клавиш – Accelerator Table

Ресурсы могут быть разделяемыми, когда несколько процессов могут их использовать одновременно или параллельно, и неделимыми.

Cхема выделения ресурсов такова: При необходимости использовать какой-либо ресурс задача обращается к супервизору ОС и сообщает о своем требовании. Директива обращения задачи к операционной системе передает ей управление, переводя процессор в привилегированный режим работы, если такой существует. Получив запрос, операционная система удовлетворяет его и после выполнения запроса ОС возвращает управление задаче, выдавшей данный запрос, или, если ресурс занят, ставит задачу в очередь, переводя ее в состояние ожидания (блокируя).

Ресурс может быть выделен задаче, в следующих случаях:1.) ресурс свободен, и в системе нет запросов от задач более высокого приоритета к запрашиваемому ресурсу;2.) текущий запрос и ранее выданные запросы допускают совместное использование ресурсов;3.) ресурс используется задачей низшего приоритета и может быть временно отобран (разделяемый ресурс).

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

Основные функции ядра ОС, распределение ресурсов:

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

1)порождение процессов, уничтожение процессов (завершение) и реализация механизмов связи между процессами;2.) обработка прерываний;3.) реализация основных функций распределения ресурсов.

Функция BeginUpdateResource возвращает дескриптор, который может быть использован функцией UpdateResource для добавления, удаления или замены ресурсов в исполняемом файле.Процесс записи ресурсов в файл начинается с вызова BeginUpdateResource. При этом флаг bDeleteExistingResources задает режим записи: с удалением существующих ресурсов или без.Заканчивается процесс записи вызовом EndUpdateResource. Если флаг bDiscard установлен в TRUE, то запись ресурсов отменяется, в противном случае ресурсы записываются в файл.

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

Функция FindResource выясняет место ресурса с заданным типом и именем в указанном модуле.

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

Файл ресурсов описывает и диалоговые окна. Все компоненты окна - кнопки, элементы управления и даже статический текст, имеют свои идентификаторы, координаты в окне и номера, как имеют их и элементы меню. Для каждого окна нужная своя функция окна, поэтому в программу помимо WndProc - функции главного окна, придётся включить PifProc() - функцию диалогового окна. Аргументы у неё будут такие же, как и у WndProc.

14. Понятие динамически-загружаемой библиотеки. Создание DLL-библиотеки. Использование DLL-библиотеки в программе методом статического импорта процедур. Соглашения о вызовах процедур DLL-библиотеки. Точка входа-выхода DLL-библиотеки.

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

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

·  При разработке DLL Вы сначала создаете заголовочный файл, в котором содержатся экспортируемые из нее переменные (типы и имена) и функции (прототипы и имена). В этом же файле надо определить все идентификаторы и структуры данных, используемые экспортируемыми функциями и переменными. Заголовочный файл включается во все модули исходного кода Вашей DLL. Более того, Вы должны поставлять его вместе со своей DLL, чтобы другие разработчики могли включать его в свои модули исходного кода, которые импортируют Ваши функции или переменные. Единый заголовочный файл, используемый при сборке DLL и любых исполняемых модулей, существенно облегчает поддержку приложения.

При компиляции исходного файла DLL, показанного на предыдущем листинге, MYLIBAPI определяется как __declspec(dllexport) до включения заголовочного файла MyLib.h. Такой модификатор означает, что данная переменная, функция или C++􏰀класс экспортируется из DLL. Заметьте, что идентификатор MYLIBAPI помещен в заголовоч􏰀 ный файл до определения экспортируемой переменной или функции.

Также обратите внимание, что в файле MyLibFile1.cpp перед экспортируемой пе􏰀 ременной или функцией не ставится идентификатор MYLIBAPI. Он здесь не нужен: проанализировав заголовочный файл, компилятор запоминает, какие переменные и функции являются экспортируемыми.

Идентификатор MYLIBAPI включает extern. Пользуйтесь этим модификатором только в коде на C++, но ни в коем случае не в коде на стандартном C. Обычно ком􏰀 пиляторы C++ искажают (mangle) имена функций и переменных, что может приво􏰀 дить к серьезным ошибкам при компоновке. Представьте, что DLL написана на C++, а исполняемый код — на стандартном C. При сборке DLL имя функции будет искаже􏰀 но, но при сборке исполняемого модуля — нет. Пытаясь скомпоновать исполняемый модуль, компоновщик сообщит об ошибке: исполняемый модуль обращается к несу􏰀 ществующему идентификатору. Модификатор extern не дает компилятору искажать имена переменных или функций, и они становятся доступными исполняемым моду􏰀 лям, написанным на C, C++ или любом другом языке программирования.

Теперь Вы знаете, как используется заголовочный файл в исходных файлах DLL. А как насчет исходных файлов EXE􏰀модуля? В них MYLIBAPI определять не надо: вклю􏰀 чая заголовочный файл, Вы определяете этот идентификатор как __declspec(dllimport), и при компиляции исходного кода EXE􏰀модуля компилятор поймет, что переменные и функции импортируются из DLL.

Просмотрев стандартные заголовочные файлы Windows (например, WinBase.h), Вы обнаружите, что практически тот же подход исповедует и Microsoft.

Соглашения о вызовах подпрограмм:

-  __declspec(dllimport) int __stdcall Min(int X, int Y);

-  __cdecl – Параметры передаются на стек в обратном порядке. За освобождение стека после вызова под-программы отвечает вызывающая программа.

- __pascal – Передача параметров на стек в прямом порядке. Освобождение стека осуществляет сама вызванная подпрограмма.

-  __stdcall – Соглашение для стандартных DLL ОС Windows. Передача параметров на стек происходит в обратном порядке. Освобождение стека выполняет вызванная подпрограмма.

__register – Передача параметров преимущественно через регистры процессора. Не используется при создании DLL, поскольку не стандартизировано.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]