Системное_программирование. Практикум для студентов специальностей 140 01 02 Информационные системы и технологии
Скачать 1.66 Mb.
|
Список динамических библиотек процесса В комплекте системы разработки Microsoft Visual C++ входит программа dumpbin.exe, предназначенная для запуска из командной строки. С помощью этой утилиты вы сможете проанализировать содержимое любого загрузочного файла в формате COFF, в том числе DLL-библиотеки, определив имена экспортируемых функций, их порядковые номера, имена DLL-библиотек и номера функций, импортируемых из этих библиотек и т. д. 43 Лабораторная работа № 5 ГРАФИКА WINDOWS. ОСНОВЫ УПРАВЛЕНИЯ ВЫВОДОМ ГРАФИЧЕСКОЙ И ТЕКСТОВОЙ ИНФОРМАЦИИ НА БАЗЕ БИБЛИОТЕКИ GDI Цель работы: Изучить основы управления выводом текстовой и графической информации на базе библиотеки GDI. Изучаемые вопросы 1. Графическое устройство и его контекст. 2. Атрибуты системы координат, их влияние на вывод информации. 3. Шрифты, классификация, параметры шрифта, установка в кон- текст устройства. 4. Атрибуты контекста устройства, влияющие на вывод текста. 5. Методы GDI для вывода текста и векторной графики. Постановка задачи 1. Нарисовать геометрическую фигуру в заданной области. 2. Осуществить вывод текста в заданной области (по контуру фи- гуры) согласно индивидуальному заданию из приложения (вы- даётся преподавателем). Теоретические сведения Графическое устройство и его контекст Взаимодействие приложения с GDI осуществляется при непре- менном участии посредника – так называемого контекста устрой- ства. Контекст устройства (device context) – это внутренняя структура данных, которая определяет набор графических объектов и ассоциированных с ними атрибутов, а также графических режи- мов, влияющих на вывод. Контекст устройства содержит много ат- рибутов, определяющих поведение функций GDI. Если необходимо рисовать на устройстве графического вывода (экране дисплея или принтере), то сначала нужно получить де- скриптор контекста устройства. Возвращая этот дескриптор после 44 вызова соответствующих функций, Windows тем самым предостав- ляет разработчику право на использование данного устройства. По- сле этого дескриптор контекста устройства передается как параметр в функции GDI, чтобы идентифицировать устройство, на котором должно выполняться рисование. Для создания и освобождения контекста применяются пары функций: BeginPaint и EndPaint или GetDC и ReleaseDC: Для первых двух функций требуется дескриптор окна (передава- емый в оконную процедуру как параметр) и адрес переменной типа структуры PAINTSTRUCT, определяемой в оконной процедуре. Вызов BeginPaint заполняет поля этой структуры, а также возвра- щает дескриптор контекста рабочей области окна, который должен запоминаться в переменной типа HDC. Вызов функции EndPaint освобождает дескриптор контекста рабочей области окна. Метод используется при обработке сообщения WM_PAINT. Если контекст был получен с помощью функции GetDC, то по- сле завершения процедуры рисования перед выходом из обработчи- ка сообщений следует освободить полученный контекст, вызвав функцию ReleaseDC. Эту пару функций можно использовать при обработке других, не WM_PAINT сообщений. Атрибуты системы координат, их влияние на вывод информации Система координат для окна базируется на координатной систе- ме дисплея. Основной единицей измерения служит пиксел. Точки на экране задаются парой координат (х, у). При этом х-координаты возрастают слева направо, а y-координаты – сверху вниз. Направле- ние осей системы координат зависит от режима отображения. Режим отображения контекста устройства выбирается следую- щей функцией: SetMapMode(hdc,MM_HIMETRIC); Вместо MM_HIMETRIC можно задать следующие режимы отображения, приведенные в таблице 5.1 45 Таблица 5.1 Режимы отображения Режим отображения Направление по оси x Направление по оси у Логические единицы ММ_ТЕХТ MM_LOMETRIC MMJHIMETRIC MMJ.OENGLISH MM_HIENGLISH MM_TWIPS MM_ISOTROPIC MM_ANISOTROPIC Вправо Вправо Вправо Вправо Вправо Вправо Любое Любое Вниз Вверх Вверх Вверх Вверх Вверх Любое Любое Пиксель 0,1 мм 0,01 мм 0,01 дюйма 0,001 дюйма 1 / 1440 дюйма Произвольные единицы (х = = y) Произвольные единицы (х! = y) Если функция SetMapMode не вызывалась, то по умолчанию ис- пользуется режим отображения ММ_ТЕХТ. Шрифты, классификация, параметры шрифта, установка в контекст устройства Шрифты GDI подразделяются на три типа: − растровые шрифты; − векторные шрифты; − шрифты типа TrueType. Основными параметрами шрифтов являются высота, ширина, наклон шрифта, толщина шрифта и его тип. 46 Создать шрифт можно функцией CreateFontInderect: LOGFONT Font; Font.lfHeight = 500;//высота буквы Font.lfWidth = 0;//ширина буквы // (0- по умолчанию подходящий по масштабу) Font.lfEscapement =3600-atan(y/x)*1800/3.14; //угол наклона Font.lfOrientation=3600-atan(y/x)*1800/3.14; //atan(y/x)*10; Font.lfWeight = 500; //толщина шрифта 500 =FW_MEDIUM Font.lfItalic = TRUE; //курсив Font.lfUnderline = FALSE; Font.lfStrikeOut = FALSE; //определяет кодировку шрифта Font.lfCharSet = DEFAULT_CHARSET; // т ип и семейство шрифта Font.lfPitchAndFamily = DEFAULT_PITCH; Font.lfClipPrecision = CLIP_LH_ANGLES; hFont = CreateFontIndirect(&Font); Для установки шрифта в контекст устройства используется функция: HFONT hOldFont= (HFONT)SelectObject(hdc,hFont); где hdc – это контекст устройства, hFont – описатель созданного шрифта. Атрибуты контекста устройства, влияющие на вывод текста На вывод текста могут повлиять такие параметры контекста как режим отображения, цвет текста, цвет фона, на котором рисуется текст. Цвет текста устанавливается с помощью функции: SetTextColor(hdc,color); где hdc – контекст устройства , color – цвет выводимых символов. 47 Для установки фона текста используется функция SetBkColor(hdc,RGB(255,0,0)); Методы GDI для вывода текста и векторной графики GDI поддерживает множество объектов рисования: перья, кисти, шрифты, палитры, растровые изображения. Перья используются для рисования линий, кривых и контуров других фигур. Создать перо можно функцией: hPen = CreatePen(PS_SOLID, 3, RGB(0,200,0)); где первый параметр PS_SOLID указывает на стиль линий- сплошной,второй параметр указывает на толщину линии, третий параметр указывает на цвет линии. Для создания кисти используется функция: hBrush = CreateSolidBrush(RGB(255,0,0)); Для того, чтобы добавить созданный нами объект в контекст необходимо применить функцию: hOldPen = (HPEN) SelectObject(hdc1, hPen); После создания и выбора объекта для рисования могут исполь- зоваться следующие функции: // эллипс BOOL Ellipse(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRec); // отрезок BOOL LineTo(HDC hdc, int nXEnd, int nYEnd,); // серия отрезков BOOL Polyline(HDC hdc, CONST POINT *lppt, int cPoints); Для того, чтобы использовать корректно функцию LineTo, мы должны установить текущую точку в нужные нам координаты, то есть то место, откуда мы хотим нарисовать линию. Для этого есть 48 соответствующая функция MoveToEx, которая помещает текущую точку в нужные нам координаты: MoveToEx(hdc,ThirdCoord.x,ThirdCoord.y,NULL); LineTo(hdc,FirstCoord.x,FirstCoord.y); Ellipse(hdc,ThirdEllipse.x,ThirdEllipse.y,ThirdEllipse.x1 ,ThirdEllipse.y1); Для вывода текста можно использовать следующие функции: BOOL TextOut ( HDC hdc, // дескриптор контекста устройства int nXStart. // х-координата стартовой позиции int nYStart. // у-координата стартовой позиции LPCTSTR lpString, // указатель на символьную строку int cbString // число символов в строке ); Функция обеспечивает вывод строки с адресом lpString, разме- щая текст в заданной позиции с учетом текущего режима выравни- вания. При выводе используются текущие значения атрибутов кон- текста устройства – шрифт, цвет текста и цвет фона графических элементов. TextOut(hdc1,ThirdCoord.x+150,ThirdCoord.y+600,STR, wcslen(STR)); 49 Лабораторная работа № 6 РАСТРОВАЯ ГРАФИКА Цель работы: изучить структуру и основные операции по обработ- ке растровых изображений в Windows. Изучаемые вопросы 1. Структура файлов *.bmp. a) Заголовки. b) Палитра цветов. c) Битовый массив образа. 2. Структура BITMAP. a) Создание битовой карты. b) Заполнение битовой карты. c) Вывод битовой карты. 3. Растровые операции. Постановка задачи 1. Создать в графическом редакторе растровые изображения раз- мером 12×12 (16 бит), 16×16 (4 бита), 32×32 (8 бит). Рисунки и дамп включить в отчет. 2. Расшифровку дампов файлов рисунков привести в виде таблицы. 3. Написать программу, где, в соответствии с вариантом из при- ложения, фигуры из каждого сектора экрана через ∆t после за- пуска программы начинают двигаться вверх. Схема окна при- ложения приведена на рисунке 6.1. Движением каждой фигуры управляет отдельный поток. Рис. 6.1. Схема окна приложения 50 Теоретические сведения Структура файлов *.bmp. Заголовки BMP- файл состоит из четырёх частей: 1) Заголовок файла (BITMAPFILEHEADER); 2) Заголовок изображения (BITMAPINFOHEADER, может отсут- ствовать). BITMAPV4HEADER (Win95, NT4.0) BITMAPV5HEADER (Win98/Me, 2000/XP); 3) Палитра (может отсутствовать); 4) Само изображение. Файл DIB начинается с секции заголовка, определенной струк- турой BITMAPFILEHEADER. Эта структура имеет пять полей: Поле Размер Описание bfType WORD Байты"BM" для битовых образов bfSize DWORD Общий размер файла bfReserved1 WORD Установлено в 0 bfReserved2 WORD Установлено в 0 bfOffBits DWORD Смещение битов битового образа от начала файла За этой информацией следует другой заголовок, определенный структурой BITMAPINFOHEADER. Структура имеет 11 полей: Поле Размер Описание biSize DWORD Размер структуры в байтах biWidth LONG Ширина битового образа в пикселях biHeight LONG Высота битового образа в пикселях biPlanes WORD Установлено в 1 biBitCount WORD Число битов цвета на пиксель (1, 4, 8, 24) biCompression DWORD Схема компрессии (если нет — 0) biSizeImage DWORD Размер битов битового образа в байтах (нужен только при компрессии) biXPelsPerMeter LONG Разрешение в пикселях на метр по горизонтали biYPelsPerMeter LONG Разрешение в пикселях на метр по вертикали biClrUsed DWORD Число цветов, используемых в изображении biClrImportant DWORD Число важных цветов в изображении 51 Все поля, следующие за полем biBitCount, могут быть по умол- чанию установлены в 0 (или их может вообще не быть в файле). В этом случае длина структуры будет равна 16 байтам. Кроме опи- санных выше полей, она может также содержать дополнительные поля. Палитра цветов Если biClrUsed установлено в 0 и число битов цвета на пиксель равно 1, 4 или 8, то за структурой BITMAPINFOHEADER следует таблица цветов, состоящая из двух или более структур RGBQUAD. Структура RGBQUAD определяет значение RGB цвета: Поле Размер Описание rgbBlue BYTE Интенсивность голубого rgbGreen BYTE Интенсивность зеленого rgbRed BYTE Интенсивность красного rgbReserved BYTE Равно 0 Число структур RGBQUAD обычно определяется значением по- ля biBitCount : 2 структуры RGBQUAD при 1 цветовом бите, 16 при 4 цветовых битах, 256 при 8 битах цвета. Однако, если значение в поле biClrUsed не равно нулю, то в нем содержится число структур RGBQUAD, входящих в таблицу цветов. Битовый массив образа За таблицей цветов следует массив битов, определяющих бито- вый образ. Этот массив начинается с нижней строки пикселей. Каждая строка начинается с самого левого пикселя. Каждый пик- сель представлен 1, 4, 8 или 256 битами. Для монохромных битовых образов с 1 битом цвета на пиксель первый пиксель в каждой строке представляется наиболее знача- щим битом первого байта в каждой строке. Если этот бит равен 0, то цвет пикселя определяется из первой структуры RGBQUAD таб- лицы цветов. Если он равен 1, то цвет пикселя определяется из вто- рой структуры RGBQUAD таблицы цветов. В случае 16-цветного битового образа с 4 битами на пиксель первый пиксель каждой строки представляется четырьмя самыми 52 значащими битами первого байта в каждой строке. Цвет каждого пикселя определяется путем использования этого 4-х битного зна- чения как индекса для любого из 16 входов таблицы цветов. В случае 256-цветного битового образа каждый байт соответ- ствует одному пикселю. Цвет каждого пикселя определяется путем использования этого 8-ми битного значения как индекса для любого из 256 входов таблицы цветов. Если битовый образ содержит 24 бита для представления цвета одного пикселя, то каждый набор из 3-х байтов – это RGB-цвет пикселя. Таблица цветов тсутствует, если значение поля biClrUsed структуры BITMAPINFOHEADER не равно 0. В любом случае, каждая строка данных битового образа имеет размер, кратный 4 байтам. Для удовлетворения этого требования, если необходимо, строка расширяется вправо. Структура BITMAP. Создание и заполнение битовой карты Для создания битовой карты можно использовать функции CreateBitmap(), CreateBitmapInderect(), CreateCompatibleBitmap(). Для создания битового образа виртуального контекста устрой- ства использовалась функция: hdcMem = CreateCompatibleDC(hdc); Эта функция позволяет создать виртуальный контекст устрой- ства, которое связано с заданным контекстом устройства. Получен- ный контекст используется дальше для вывода изображения на экран. Следующая функция создает пустое растровое изображение в памяти размером 50*50,совместимое с контекстом устройства и по- лучаем его хэндл: hbmMem = CreateCompatibleBitmap(hdc, 1000, 1000); Выбираем изображение в совместимый контекст в памяти: SelectObject(hdcMem, hBitmFon); Для заполнения битовой карты можно использовать функцию: SetBitmapBits(HBITMAP hbmp, DWORD cBytes,CONST VOID *lpBits); 53 Эта функция устанавливает биты цветов для побитового отобра- жения в hbmp из области памяти lpBits, cBytes – количество копи- руемых байтов. Растровые операции Растровые операции предназначены для определения, как дан- ные цвета для прямоугольной области источника должны быть объ- единены с данными цветами прямоугольной области назначения для получения окончательно цвета. В таблице 6.1 приведены наиболее широко применяемые операции и их коды. Таблица 6.1 Коды растровых операций Коды Описание DSTINVERT Инвертирует целевое растровое изображение MERGECOPY Объединяет растр рисунка с исходным посредством логического оператора AND MERGEPAINT Инвертирует исходное растровое изображение и объединяет его с исходным логич. оператором OR NOTSRCCOPY Инвертирует изображение и копирует его NOTSRCERASE Объединяет целевое и исходное растровые изобра- жения, которые затем инвертирует PATCOPY Копирует рисунок в целевое растровое изображение PATINVERT Объединяет целевое растровое изображение с ри- сунком, используя логический оператор XOR PATPAINT Инвертирует исходное изображение объединяет его с рисунком операцией OR, затем объединяет ре- зультат с целевым изображением операцией OR SRCAND Объединяет целевое и исходное растровое изобра- жения, используя логический оператор AND SRCCOPY Копирует исходное растровое изображение SRCERASE Объединяет инвертированное целевое изображение с исходным, используя логический оператор AND SRCINVERT Объединяет целевое и исходное растровое изобра- жения, используя логический оператор XOR SRCPAINT Объединяет целевое и исходное растровое изобра- жения, используя логический оператор OR 54 Лабораторная работа № 7 ПЕРЕДАЧА ИНФОРМАЦИИ МЕЖДУ ПРОЦЕССАМИ Цель работы : изучить основы взаимодействия локальных процес- сов на базе файлов, проецируемых в память Изучаемые вопросы 1. Функции для работы с файлами, отображаемыми в память. 2. Файлы данных, проецируемые в память. 3. Совместный доступ процессов к данным через механизм проецирования. 4. Обработка текстового и графического файлов двумя про- цессами 5. Работа с файлами больших размеров. 6. Взаимодействие процессов через Page файл. Постановка задачи 1. Осуществить обмен текстовыми и графическими данными между двумя приложениямиP1 и P2 с выводом информации в за- данную область окна программы. 2. Реализовать обработку процессом файлов больших размеров. 3. Осуществить обмен данными между двумя приложениями P 1 и P2 через Page файл с выводом информации в заданную область окна программы. Теоретические сведения Функции для работы с файлами, отображаемыми в память Функция |