Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет ОМТ 123.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
478 Кб
Скачать
☆
    1. Особенности работы с графикой

Для отображения несложной графики используется GDI (graphics device interface). Особенности GDI - простота использования и низкая скорость, что делает его пригодным, в основном, для создания нестандартных элементов интерфейса и приложений со "слабой" графикой.

Для создания изображений часто применяются команды FPU и SIMD инструкции (MMX;XMM;3DNow!), поэтому изложенные материалы о GDI будут использоваться в следующих главах для наглядного изучения дополнительных инструкций процессора.

Основное понятие GDI - это Device Context -DC. - Представляет из себя набор свойств среды рисования: изображение, используемые шрифты, цвета и т.д.

Для того, чтобы добавить/заменить в DC какой-либо элемент, нужно создать его, а после использовать функцию SelectObject. Рисование производится на объекте типа Bitmap.

Цвета, передаваемые функциям GDI - RGB: байт #0 определяет уровень красного цвета, #1 - зеленого, #2 - синего, и #3=0

Чаще всего GDI используется для отображения графики в окне.

При необходимости обновить часть изображения окна, Windows добавляет этот регион в т.н Update Region и, позже, посылает сообщение WM_PAINT. Обработчик сообщения обычно вызывает функцию BeginPaint, возвращающую хэндл DC клиент - части окна, с установленным clipping region'ом равным update region'у. Т.е рисование будет происходить только в части окна, необходимой для обновления. Это сделано для избежание мерцания при рисовании. Далее Update Region очищается и следующее сообщение WM_PAINT произойдет только при следующей необходимости прорисовки изображения. В случае надобности перерисовки всего клиент - содержимого окна кроме WM_PAINT посылается также WM_ERASEBKGND, а для обновления не клиент - части - WM_NCPAINT.

Для добавления части/всего окна в update region используются функции InvalidateRect/ InvalidateRgn. Автоматическое добавление происходит при смене размера окна, удаления перекрытия другими окнами и т.д.

Можно получить DC окна функциями GetDC, GetWindowDC, и вывести изображение, но при появлении update region'а оно будет не действительным. Эти ф-ции не влияют и не зависят от Update Region'а

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

Можно создать DC, существующее только в памяти и не отображаемое на экране - Memory DC, вызвав функцию CreateCompatibleDC. Memory DC чаще всего используется для:

• Избежание мерцания (Flicker) изображения при прорисовке.

Мерцание происходит если пользователь видит процесс создания изображения, при прорисовке перекрывающихся элементов т.к графика, выводимая в DC окна, сразу же отображается. Для устранения мерцания можно использовать объекты типа Region, но чаще создается DC в памяти, на котором происходит рисование, а по завершению процесса создания изображения производится копирование из Memory DC в DC окна (обычно функцией BitBlt).

Объект Bitmap в таких случаях можно создать ф-цией CreateCompatibleBitmap

• Рисование изображения для последующих манипуляций с данными изображения. В таком случае объект Bitmap обычно создается функцией CreateDIBSection что позволяет иметь непосредственный доступ (чтение/запись) к массиву точек изображения. Функции рисования в DC также влияют на массив точек изображения в памяти. Такое изображение можно легко сохранить в .bmp файл, записав сначала структуру BITMAPFILEHEADER, за ней BITMAPINFOHEADER, далее палитру (если есть), и массив точек изображения (с выравниванием строк на dword)

2 СПЕЦИАЛЬНАЯ ЧАСТЬ

2.1 Постановка задачи №1

Нарисовать 2 треугольника разных цветов .

2.1.1 Выходные данные программы №1

2.1.2 Листинг программы №1

Dosseg ; Директива задает

;Расположение сегментов в памяти

.model small ;директива описание модели памяти

.stack 100h ;директива определяет размерность стека

.code ;директива,отмечаю начало

;расположение информации в сегменте

;Кода.

mov ah,06h ;Функция установки окна на экране.

mov bh,70h ;цвет окна и символа

mov ch,0 ;левая врехняя координата y

mov cl,0 ;левая верхняя координата x

mov dh,4 ;правая нижняя координата y

mov dl,79 ;правая нижняя координата x

int 10h ;прерывания,по которому управлению

;передается BIOS для выполнения

;вышеназванной функции.

xor ax,ax ;обнуление регистра ах

mov ah,06h ;Функция установки окна на экране.

mov bh,90h ;цвет окна и символа

mov ch,4 ;левая врехняя координата y

mov cl,0 ;левая верхняя координата x

mov dh,8 ;правая нижняя координата y

mov dl,79 ;правая нижняя координата x

int 10h ;прерывания,по которому управлению

xor ax,ax ;обнуление регистра ах

mov ah,06h ;Функция установки окна на экране.

mov bh,60h ;цвет окна и символа

mov ch,8 ;левая врехняя координата y

mov cl,0 ;левая верхняя координата x

mov dh,12 ;правая нижняя координата y

mov dl,79 ;правая нижняя координата x

int 10h ;прерывания,по которому управлению

xor ax,ax ;обнуление регистра ах

mov ah,06h ;Функция установки окна на экране.

mov bh,40h ;цвет окна и символа

mov ch,12 ;левая врехняя координата y

mov cl,0 ;левая верхняя координата x

mov dh,16 ;правая нижняя координата y

mov dl,79 ;правая нижняя координата x

int 10h ;прерывания,по которому управлению

xor ax,ax ;обнуление регистра ах

mov ah,06h ;Функция установки окна на экране.

mov bh,30h ;цвет окна и символа

mov ch,16 ;левая верхняя координата y

mov cl,0 ;левая верхняя координата х

mov dh,22 ;правая нижняя координата y

mov dl,79 ;правая нижняя координата x

int 10h ;прерывания, по которому управлению

xor ax,ax ;обнуление регистра ах

mov ah,06h ;Функция установки окна на экране.

mov bh,10h ;цвет окна и символа

mov ch,22 ;левая врехняя координата y

mov cl,0 ;левая врехняя координата x

mov dh,26 ;правая нижняя координата y

mov dl,79 ;правая нижняя координата x

int 10h ;прерывания, по которому управлению

xor ax,ax ;обнуление регистра ах

mov ah,06h ;Функция установки окна на экране

mov bh,24 ;цвет окна и символа

mov ch,22 ;левая верхняя координата y

mov cl,0 ;левая верхняя координата x

mov dh,32 ;правая нижняя координата y

mov dl,79 ;правая нижняя координата x

int 10h ;прерывания, по которому управлению

mov ah,01h ;приостановка программы до нажатия любой

int 21h ;клавиши

mov ah,4ch ;функция ДОС завершения программы.

int 21h ;прерывания по которому происходит

;передача управления ОС для выполнения

; ранее объявленной функции.

end ;директива завершения программы на ассемблер