Графика в Windows

Основные характеристики графики в операционной системе Windows, реализация объектно-ориентированной идеологии. Специфика и этапы разработки программного продукта, описывающего графический объект, на 32-битном ассемблере с использованием API-функции.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 18.05.2014
Размер файла 82,3 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

1. Цель работы

Изучить графику в Windows. Написать программу на 32-битном ассемблере, используя API-функции.

2. Теория

графика программный windows

В операционной системе Windows реализована объектно-ориентированная идеология. Базовый объект системы - окно, поведение которого определяется методом, называемым функцией окна. Графический образ окна на экране дисплея - прямоугольная рабочая область.

Независимо от своего типа любой объект Windows идентифицируется описателем или дескриптором (handle). Дескриптор - это ссылка на объект. Все взаимоотношения программного кода с объектом осуществляются только через его дескриптор.

Интерфейс прикладного программирования (API - Application Programming Interface) представляет собой совокупность 32-битных функций (Win32 API), которые предназначены для создания приложений (программ), работающих под управлением Microsoft Windows. Функции объявлены в заголовочных файлах. Главный из них - файл windows.h, в котором содержатся ссылки на другие заголовочные файлы.

В Win32 единицей работы компьютера является поток -- ход выполнения программы в рамках процесса (в контексте процесса). Поток выполняет программный код, принадлежащий процессу. Процесс -- это экземпляр выполняемой программы (но не ход ее выполнения). Он не является динамическим объектом и включает виртуальное адресное пространство, код и данные, файлы, синхронизирующие объекты, динамические библиотеки.

Каждое приложение создает, по меньшей мере, один первичный поток, но может создать и много потоков.

Любое приложение Windows представлено на экране дисплея как минимум одним окном с набором стандартных элементов управления. Различают следующие типы окон:

перекрывающие (overlapped window);

всплывающие (pop-up window);

дочерние (Child window);

слоистые (1ayered window) - особые окна, которые позволяют улучшить визуальный эффект, включая прозрачность.

Перекрывающие окна создаются функцией CreateWindowEx() со стилем WS_OVERLAPPEDWINDOW. Этот стиль определяет наличие заголовка, системного меню, кнопок минимизации и максимизации, кнопки закрытия окна и «толстой» рамки, позволяющей изменять размеры окна. Перекрывающие окна предназначены для главных окон приложений и могут иметь меню.

Всплывающие окна создаются функцией CreateWindowEx() со стилем WS_POPUP и предназначены для окон диалогов, окон сообщений и других окон временного использования, которые могут находиться вне главного окна приложения. Для того чтобы временное окно имело заголовок, рамку и системное меню, необходимо при его создании использовать комбинацию стилей WS_POPUPWINDOW | WS_CAPTION .

Дочерние окна создаются функцией CreateWindowEx() со стилем WS_CHILD и обычно используются для разделения клиентской области родительского окна на отдельные функциональные области.Дочерние окна могут иметьзаголовок, системное меню, кнопки минимизации и максимизации, рамку и полосы прокрутки, но не могут иметь меню. Дочерние окна всегда находятся в пределах клиентской области родительского окна, т.е. их координаты всегда отсчитываются от левого верхнего углародительского окна. Родительское окно может быть перекрывающим, всплывающим или даже другим дочерним окном.

3. Описание используемых API-функций

DefWindowProc

Вызывает процедуру окна по умолчанию, чтобы обеспечить стандартную обработку сообщения для любого окна. Эта функция гарантирует, что каждое сообщение обрабатывается.

LRESULT WINAPI DefWindowProc (

__in HWND HWND, // Дескриптор окна, процедуры, которые получили это сообщение.

__in UINT Msg, // Сообщение.

__in WPARAM WPARAM, // Дополнительная информация о сообщении. Содержание этого параметра зависит от значения параметра Msg.

__in LPARAM LPARAM // Дополнительная информация о сообщении. Содержание этого параметра зависит от значения параметра Msg.

);

InvalidateRect

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

BOOL InvalidateRect (

__in HWND HWND, // Дескриптор окна, процедуры, которые получили это сообщение.

__in CONST RECT * LPRECT, // Указатель на RECT структуру, которая содержит клиентские координаты прямоугольника, которые будут добавлены к области модификации. Если этот параметр равен NULL, вся клиентская область добавлена к области модификации.

__in BOOL bErase // Указывает, будет ли фон внутри области модификации удален при обновлении области обработки. Если этот параметр имеет значение TRUE, фон стирается при BeginPaint. Если этот параметр имеет значение FALSE, фон остается неизменным.

);

CreateWindowEx

Создает перекрывающее, всплывающее или дочернее окно с расширенным стилем окна.

HWND WINAPI CreateWindowEx (

__in DWORD dwExStyle, // Расширенный стиль создаваемого окна.

__in_opt LPCTSTR lpClassName, // Имя класса окна.

__in_opt LPCTSTR lpWindowName, // Заголовок окна.

__in DWORD dwStyle, // Стиль создаваемого окна.

__in Int х, // Первоначальное горизонтальное положение окна.

__in Int у, // Первоначальное вертикальное положение окна.

__in Int nWidth, // Ширина окна.

__in Int nHeight, // Высота окна.

__in_opt HWND hWndParent, // Окно владельца создаваемого окна.

__in_opt HMENU HMENU, // Дескриптор меню.

__in_opt HINSTANCE HINSTANCE, // Дескриптор экземпляра модуля, который будет связан с окном.

__in_opt LPVOID lpParam // Указатель на значение, которое будет передано через структуры (lpCreateParams члена), на которую указывает параметр LPARAM сообщения WM_CREATE. Это сообщение посылается в окно, созданное этой функцией перед возвратом.

);

DispatchMessage

Отправляет сообщение в оконную процедуру.

LRESULT WINAPI DispatchMessage (

__in сопзЬ MSG * LPMSG // Указатель на структуру, содержащую сообщение.

);

ExitProcess

Завершает процесс и все его нити.

VOID WINAPI ExitProcess (

__in UINT uExitCode // Код выхода из процесса.

);

GetMessage

Извлекает сообщение из очереди сообщений вызывающего потока.

BOOL WINAPI GetMessage (

__out LPMSG LPMSG, // Указатель на MSG структура, которая получает информационное сообщение из очереди сообщений потока.

__in_opt HWND HWND, // Дескриптор окна, сообщения которого должны быть восстановлены. Окно должно принадлежать текущему потоку.

__in UINT wMsgFilterMin, // Самый маленький номер сообщения, которое должно быть найдено.

__in UINT wMsgFilterMax // Самый большой номер сообщения, которое должно быть найдено.

);

GetModuleHandle

Возвращает дескриптор модуля для указанного модуля.

HMODULE WINAPI GetModuleHandle (

__in_opt LPCTSTR lpModuleName // Имя загружаемого модуля (либо .DLL, либо .EXE-файл).

);

LoadCursor

Загружает указанный курсор.

LoadCursor HCURSOR WINAPI (

__in_opt HINSTANCE HINSTANCE, // Дескриптор экземпляра модуля, исполняемый файл которого содержит курсор и должен быть загружен.

__in LPCTSTR lpCursorName // Имя курсора для загрузки.

);

LoadIcon

Загружает указанную иконку.

HICON WINAPI LoadIcon(

__in_opt HINSTANCE hInstance, // Дескриптор экземпляра модуля, исполняемый файл содержит иконку для загрузки. Этот параметр должен быть NULL, если загружается стандартная иконка.

__in LPCTSTR lpIconName // Имя иконки для загрузки.

);

PostQuitMessage

Указывает системе, что поток просит завершение.

VOID WINAPI PostQuitMessage(

__in int nExitCode // Код выхода из приложения.

);

RegisterClass

Регистрирует класс окна для последующего использования при вызове CreateWindow или CreateWindowEx функции.

ATOM WINAPI RegisterClass (

__in сопзЬ WNDCLASS * lpWndClass // Указатель на WNDCLASS структуры.

);

ShowWindow

Устанавливает состояние показа указанного окна.

BOOL WINAPI ShowWindow (

__in HWND HWND, // Дескриптор окна.

__in Int nCmdShow // Управление, как окно должно быть показано.

);

TranslateMessage

Переводит virtual-key сообщения в character сообщения.

BOOL WINAPI TranslateMessage (

__in сопзЬ MSG * LPMSG // Указатель на MSG структуру, содержащую сообщение.

);

UpdateWindow

Обновление клиентской области заданного окна.

BOOL UpdateWindow(

__in HWND hWnd // Дескриптор окна.

);

BeginPaint

Готовит указанное окно для рисования.

HDC BeginPaint(

__in HWND hwnd,

__out LPPAINTSTRUCT lpPaint

);

EndPaint

Знаменует собой конец рисования в указанном окне. Эта функция необходима для каждого вызова BeginPaint.

BOOL EndPaint(

__in HWND hWnd, // Дескриптор окна.

__in const PAINTSTRUCT *lpPaint // Указатель на PAINTSTRUCT структуру.

);

CreateSolidBrush

Создает логическую кисть с заданным цветом.

HBRUSH CreateSolidBrush(

__in COLORREF crColor // Цвет кисти.

);

GetSystemMetrics

Возвращает метрики указанной системы или настройки конфигурации системы.

int WINAPI GetSystemMetrics(

__in int nIndex // Системные метрики.

);

GetDC

Извлекает дескриптор контекста устройства (DC) для клиентской области заданного окна или для всего экрана.

HDC GetDC(

__in HWND hWnd // Дескриптор окна.

);

CreateCompatibleDC

Создает контекст устройства (DC), совместимый с указанным устройством.

HDC CreateCompatibleDC(

__in HDC hdc // Дескриптор контекста устройства.

);

SelectObject

Выбирает объект в заданный контекст устройства (DC).

HGDIOBJ SelectObject(

__in HDC hdc, // Дескриптор контекста устройства.

__in HGDIOBJ hgdiobj // Дескриптор объекта, который будет выбран.

);

CreateCompatibleBitmap

Создает растровое изображение, совместимое с устройством, которое связано с указанным контекстом устройства.

HBITMAP CreateCompatibleBitmap(

__in HDC hdc, // Дескриптор контекста устройства.

__in int nWidth, // Растровая ширина в пикселях.

__in int nHeight // Растровая высота в пикселях.

);

PatBlt

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

BOOL PatBlt(

__in HDC hdc, // Дескриптор контекста устройства.

__in int nXLeft, // Х-координата, в логических единицах измерения, левого верхнего угла прямоугольника, который должен быть заполнен.

__in int nYLeft, // Y-координата.

__in int nWidth, // Ширина прямоугольника.

__in int nHeight, // Высота прямоугольника.

__in DWORD dwRop // Код растровой операции.

);

BitBlt

Функция выполняет несколько передач блоков данных о цвете соответствующего прямоугольника пикселей из указанного DC-источника в контекст устройства назначения.

BOOL BitBlt(

__in HDC hdcDest, // Дескриптор контекста устройства.

__in int nXDest, // Х-координата, в логических единицах измерения, левого верхнего угла прямоугольника, который должен быть заполнен.

__in int nYDest, // Y-координата.

__in int nWidth, // Ширина прямоугольника.

__in int nHeight, // Высота прямоугольника.

__in HDC hdcSrc, // Дескриптор контекста устройства источника.

__in int nXSrc, // Х-координата, в логических единицах измерения, левого верхнего угла исходного прямоугольника.

__in int nYSrc, // Y-координата.

__in DWORD dwRop // Код растровой операции.

);

ReleaseDC

Эта функция освобождает контекст устройства (DC), для использования другими приложениями.

int ReleaseDC(

HWND hWnd, // Дескриптор окна, контекст устройства которого должен быть освобожден.

HDC hDC // Дескриптор, контекста устройства которого должен быть освобожден.

);

DeleteObject

Удаляет логические перья, кисти, шрифты, растровые изображения, регионы или палитры, освобождая все системные ресурсы, связанные с объектом.

BOOL DeleteObject(

__in HGDIOBJ hObject // Дескриптор логического пера, кисти, шрифта, растрового изображения, региона или палитры.

);

DeleteDC

Функция удаляет указанный контекст устройства (DC).

BOOL DeleteDC(

__in HDC hdc // Дескриптор контекста устройства.

);

Rectangle

Функция рисует прямоугольник.

BOOL Rectangle(

__in HDC hdc, // Дескриптор контекста устройства.

__in int nLeftRect, // Х-координата, в логических единицах измерения, левого верхнего угла прямоугольника.

__in int nTopRect, // Y-координата.

__in int nRightRect, // Х-координата, в логических единицах измерения, правого нижнего угла прямоугольника.

__in int nBottomRect // Y-координата.

);

Ellipse

Функция рисует эллипс.

BOOL Ellipse(

__in HDC hdc, // Дескриптор контекста устройства.

__in int nLeftRect, // Х-координата, в логических единицах измерения, левого верхнего угла ограничивающего прямоугольника.

__in int nTopRect, // Y-координата.

__in int nRightRect, // Х-координата, в логических единицах измерения, правого нижнего угла ограничивающего прямоугольника.

__in int nBottomRect // Y-координата.

);

Sleep

Приостанавливает выполнение текущего потока.

VOID WINAPI Sleep(

__in DWORD dwMilliseconds // Интервал времени, на который выполнение будет приостановлено, в миллисекундах.

);

MoveToEx

Функция обновляет текущую позицию в указанную точку.

BOOL MoveToEx(

__in HDC hdc, // Дескриптор контекста устройства.

__in int X, // X-координата нового положения.

__in int Y, // Y-координата.

__out LPPOINT lpPoint // Указатель на POINT структуру, которая получает предыдущее текущее положение.

);

LineTo

Функция рисует линию от текущей позиции до указанной.

WINGDIAPI BOOL WINAPI LineTo(

HDC hdc, // Дескриптор контекста устройства.

int nXEnd, // X-координата конца линии.

int nYEnd // Y-координата.

);

4 Исходный текст отлаженной программы

/*graph1.inc*/

WM_DESTROY equ2

WM_CREATE equ 1

WM_LBUTTONDOWN equ 201h

WM_RBUTTONDOWN equ 204h

VK_NUMLOCKequ90h

VK_SCROLLequ91h

VK_CAPITALequ14h

VK_HOME equ24h

VK_ESCAPEequ1Bh

VK_LEFT equ25h

VK_UP equ26h

VK_RIGHT equ 27h

VK_DOWN equ28h

WM_KEYDOWNequ100h

WM_PAINT equ 0FH

CS_VREDRAW equ 1h

CS_HREDRAW equ 2h

CS_GLOBALCLASS equ 4000h

WS_OVERLAPPEDWINDOW equ 000CF0000H

stylcl equ CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS

IDI_WARNING equ 32515

IDC_HAND equ32649

SW_SHOWNORMAL equ 1

EXTERN DefWindowProcA@16 :NEAR

EXTERN InvalidateRect@12 :NEAR

CreateWindowExA PROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD

DispatchMessageA PROTO :DWORD

ExitProcess PROTO :DWORD

GetMessageA PROTO :DWORD, :DWORD,:DWORD, :DWORD

GetModuleHandleA PROTO :DWORD

LoadCursorA PROTO :DWORD, :DWORD

LoadIconA PROTO :DWORD, :DWORD

PostQuitMessage PROTO :DWORD

RegisterClassA PROTO :DWORD

ShowWindow PROTO :DWORD, :DWORD

TranslateMessage PROTO :DWORD

UpdateWindow PROTO :DWORD

BeginPaint PROTO :DWORD, :DWORD

EndPaint PROTO :DWORD, :DWORD

CreateSolidBrush PROTO :DWORD

GetSystemMetrics PROTO :DWORD

GetDC PROTO :DWORD

CreateCompatibleDC PROTO :DWORD

SelectObject PROTO :DWORD, :DWORD

CreateCompatibleBitmap PROTO :DWORD, :DWORD, :DWORD

PatBlt PROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD

BitBlt PROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD

ReleaseDC PROTO :DWORD, :DWORD

DeleteObject PROTO :DWORD

DeleteDC PROTO :DWORD

Rectangle PROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD

EllipsePROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD

SleepPROTO :DWORD

MoveToExPROTO :DWORD, :DWORD, :DWORD, :DWORD

LineToPROTO :DWORD, :DWORD, :DWORD

MSGSTRUCT STRUC

MSHWND DD?

MSMESSAGE DD ?

MSWPARAM DD ?

MSLPARAM DD ?

MSTIME DD ?

MSPT DD ?

MSGSTRUCT ENDS

WNDCLASS STRUC

CLSSTYLE DD ?

CLSLPFNWNDPROCDD ?

CLSCBCLSEXTRA DD ?

CLSCBWNDEXTRA DD ?

CLSHINSTANCE DD ?

CLSHICON DD ?

CLSHCURSOR DD ?

CLSHBRBACKGROUND DD ?

MENNAME DD ?

CLSNAME DD ?

WNDCLASS ENDS

PAINTSTR STRUC

hdc DD 0

fErase DD 0

left DD 0

top DD 0

right DD 0

bottom DD 0

fRes DD 0

fIncUp DD 0

Reserv DB 32 dup(0)

PAINTSTR ENDS

RECT STRUC

L DD?

T DD ?

R DD ?

B DD ?

RECT ENDS

/*graph.asm*/

.386P

; плоская модель

.MODEL FLAT, stdcall

include ../include/graph1.inc

; подключение библиотек

includelib ../lib/user32.lib

includelib ../lib/kernel32.lib

includelib ../lib/gdi32.lib

;=====================================================; ====================== СЕГМЕНТ ДАННЫХ

;======================================================

_DATA SEGMENT DWORD PUBLIC USE32 'DATA'

NEWHWND DWORD 0

MSG MSGSTRUCT <?>

WC WNDCLASS <?>

PNT PAINTSTR <?>

HINST DWORD 0

TITLENAME BYTE 'Графика в Windows. Рыбаков Константин.',0

NAM BYTE 'CLASS32',0

XM DWORD ?

YM DWORD ?

HDC DWORD ?

MEMDC DWORD ?

HBRUSHGREYDWORD ?

GREYDWORD0BEBEBEH

HBRUSHDGREYDWORD ?

DGREYDWORD0808080H

HBRUSHBLACKDWORD ?

BLACKDWORD0

HBRUSHGREENDWORD ?

GREENDWORD000FF00H

HBRUSHDGREENDWORD ?

DGREENDWORD008000H

HBRUSHREDDWORD ?

REDDWORD0FFH

HBRUSHWHITEDWORD ?

WHITEDWORD0FFFFFFH

HBRUSHBLUEDWORD ?

BLUEDWORDFFBF00H

HBRUSHDBLUEDWORD ?

DBLUEDWORD0800000H

HBRUSHYELLOWDWORD ?

YELLOWDWORD00FFFFH

PLBYTE 0 ; признак нажатия левой кнопки мыши

PHOMEBYTE 0 ; признак нажатия клавиши HOME

PRIGHTBYTE 0 ; признак нажатия клавиши RIGTH

PLEFTBYTE 0 ; признак нажатия клавиши LEFT

PUPBYTE 1 ; признак нажатия клавиши UP

PDOWNBYTE 1 ; признак нажатия клавиши DOWN

; координаты для движения автомобиля

; координаты кузова

KUZ1DWORD300

KUZ2DWORD366

; координаты кабины

KAB1DWORD365

KAB2DWORD385

KAB3DWORD405

; координаты передней и задних фар

PFARDWORD397

ZFAR1DWORD300

ZFAR2DWORD308

ZFAR3DWORD306

; координаты заднего и переднего колёс

ZKOL1DWORD323

ZKOL2DWORD343

PKOL1DWORD375

PKOL2DWORD395

; координаты для отрисовки дыма

dim0DWORD140

dim1DWORD115

dim2DWORD90

dim3DWORD65

dim4DWORD40

dim5DWORD15

dim6DWORD-10

PPERERISDWORD0 ; признак перерисовки дыма

KRNDWORD100 ; координата начала дома

_DATA ENDS

;======================================================

;======================== СЕГМЕНТ КОДА

;======================================================

_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'

START:

; ---------- получить дескриптор приложения ----------

INVOKE GetModuleHandleA,0

MOV [HINST], EAX

REG_CLASS:

; ---------- заполнить структуру окна ----------

MOV [WC.CLSSTYLE],stylcl ; стиль

MOV [WC.CLSLPFNWNDPROC], OFFSET WNDPROC ; процедура обработки сообщений

MOV [WC.CLSCBCLSEXTRA],0

MOV [WC.CLSCBWNDEXTRA], 0

MOV EAX, [HINST]

MOV [WC.CLSHINSTANCE], EAX

; ---------- иконка окна ----------

INVOKE LoadIconA,0,IDI_WARNING

MOV [WC.CLSHICON], EAX

; ---------- курсор окна ----------

INVOKE LoadCursorA,0,IDC_HAND

MOV [WC.CLSHCURSOR], EAX

INVOKE CreateSolidBrush,0FFFFFFh

MOV [WC.CLSHBRBACKGROUND], EAX

MOV DWORD PTR [WC.MENNAME],0

MOV DWORD PTR [WC.CLSNAME], OFFSET NAM

INVOKE RegisterClassA, OFFSET WC

; ---------- создать окно зарегистрированного класса ----------

INVOKE CreateWindowExA,0,OFFSET NAM, OFFSET TITLENAME, WS_OVERLAPPEDWINDOW,250,200,640,480,0,0,[HINST],0

; ---------- проверка на ошибку ----------

CMP EAX, 0

JZ _ERR

MOV [NEWHWND], EAX ; дескриптор окна

INVOKE ShowWindow,[NEWHWND],SW_SHOWNORMAL ; показать созданное окно

INVOKE UpdateWindow,[NEWHWND] ; перерисовать видимую часть окна

; ---------- петля обработки сообщений ----------

MSG_LOOP:

INVOKE GetMessageA, OFFSET MSG,0,0,0

CMP AX, 0

JE END_LOOP

INVOKE TranslateMessage,OFFSET MSG

INVOKE DispatchMessageA,OFFSET MSG

JMP MSG_LOOP

END_LOOP:

; ---------- выход из программы ----------

INVOKE ExitProcess,[MSG.MSWPARAM]

_ERR:

JMP END_LOOP

; ---------- процедура окна ----------

; ---------- расположение параметров в стеке ----------

; [EBP+014Н]; LPARAM

; [EBP+10H]; WPARAM

; [EBP+0CH]; MES

; [EBP+8]; HWND

;---------------------------------------------------------------

WNDPROC PROC

PUSH EBP

MOV EBP,ESP

PUSH EBX

PUSH ESI

PUSH EDI

CMP DWORD PTR [EBP+0CH],WM_PAINT ; сообщение WM_PAINT - при рисовании окна

JE WMPAINT

CMP DWORD PTR [EBP+0CH],WM_DESTROY ; сообщение WM_DESTROY - при закрытии окна

JE WMDESTROY

CMP DWORD PTR [EBP+0CH],WM_CREATE ; сообщение WM CREATE - при создании окна

JE WMCREATE

CMP DWORD PTR [EBP+0CH],WM_LBUTTONDOWN ; сообщение WM_LBUTTONDOWN - при нажатии левой кнопки мыши

JE LBUTTON

CMP DWORD PTR [EBP+0CH],WM_KEYDOWN ; сообщение WM_KEYDOWN - при нажатии клавиш

JE KEY_DOWN

JMP DEFWNDPROC

LBUTTON:

NOT PL ; признак нажатия левой кнопки мыши

KEY_DOWN:

CMP DWORD PTR [EBP+10H],VK_HOME

JNE HOME_NODOWN

NOT PHOME ; признак нажатия клавиши HOME

HOME_NODOWN:

CMP DWORD PTR [EBP+10H],VK_UP

JNE UP_NODOWN

NOT PUP ; признак нажатия клавиши UP

MOV PDOWN,1 ; признак нажатия клавиши DOWN

UP_NODOWN:

CMP DWORD PTR [EBP+10H],VK_DOWN

JNE DOWN_NODOWN

NOT PDOWN ; признак нажатия клавиши DOWN

MOV PUP,1 ; признак нажатия клавиши UP

DOWN_NODOWN:

CMP DWORD PTR [EBP+10H],VK_RIGHT

JNE R_NODOWN

MOV PRIGHT,1 ; признак нажатия клавиши RIGTH

MOV PUP,1 ; признак нажатия клавиши UP

MOV PDOWN,1 ; признак нажатия клавиши DOWN

R_NODOWN:

CMP DWORD PTR [EBP+10H],VK_LEFT

JNE L_NODOWN

MOV PLEFT,1 ; признак нажатия клавиши LEFT

MOV PUP,1 ; признак нажатия клавиши UP

MOV PDOWN,1 ; признак нажатия клавиши DOWN

L_NODOWN:

;---------- перерисовка окна ----------

PUSH 0

PUSH OFFSET RECT

PUSH DWORD PTR [EBP+08H]

CALL InvalidateRect@12

;-------------------------------------------------------------

WMPAINT:

INVOKE BeginPaint, DWORD PTR [EBP+08H],OFFSET PNT

MOV HDC,EAX ; сохранить контекст (дескриптор)

INVOKE CreateSolidBrush,08B8B83h ; фон

INVOKE SelectObject,MEMDC,EAX

; ---------- заполнить данную прямоугольную область ----------

; 0F00021H РАТСОРУ - заполнить данным цветом

INVOKE PatBlt,MEMDC,0,0,XM,YM,0F00021H

; ---------- ПЕЙЗАЖ ----------

; ---------- ночь ----------

INVOKE SelectObject,MEMDC,HBRUSHDBLUE

INVOKE Rectangle,MEMDC,0,0,640,276 ; ночное небо

INVOKE SelectObject,MEMDC,HBRUSHDGREEN

INVOKE Rectangle,MEMDC,0,275,640,480 ; ночная трава

INVOKE SelectObject,MEMDC,HBRUSHBLACK

INVOKE Rectangle,MEMDC,50,250,55,300 ; ствол дерева

INVOKE SelectObject,MEMDC,HBRUSHDGREEN

INVOKE Ellipse,MEMDC,25,210,45,230 ; ночная крона

INVOKE Ellipse,MEMDC,27,210,77,280 ; ночная крона

INVOKE Ellipse,MEMDC,50,230,80,260 ; ночная крона

; ---------- звёзды ----------

INVOKE SelectObject,MEMDC,HBRUSHWHITE

INVOKE Ellipse,MEMDC,50,50,55,55

INVOKE Ellipse,MEMDC,500,100,505,105

INVOKE Ellipse,MEMDC,80,200,85,205

INVOKE Ellipse,MEMDC,550,175,555,180

INVOKE Ellipse,MEMDC,350,75,355,80

INVOKE Ellipse,MEMDC,75,50,125,100 ; Луна

; ---------- день ----------

CMP PL,0

JNE LBUTTON_NO_DOWN

INVOKE SelectObject,MEMDC,HBRUSHBLUE

INVOKE Rectangle,MEMDC,0,0,640,276 ; дневное небо

INVOKE SelectObject,MEMDC,HBRUSHYELLOW

INVOKE Ellipse,MEMDC,475,50,525,100 ; Солнце

INVOKE SelectObject,MEMDC,HBRUSHGREEN

INVOKE Rectangle,MEMDC,0,275,640,480 ; дневная трава

INVOKE SelectObject,MEMDC,HBRUSHBLACK

INVOKE Rectangle,MEMDC,50,250,55,300 ; ствол

INVOKE SelectObject,MEMDC,HBRUSHGREEN

INVOKE Ellipse,MEMDC,25,210,45,230 ; дневная крона

INVOKE Ellipse,MEMDC,27,210,77,280 ; дневная крона

INVOKE Ellipse,MEMDC,50,230,80,260 ; дневная крона

LBUTTON_NO_DOWN:

; ---------- ДОМ ----------

INVOKE SelectObject,MEMDC,HBRUSHGREY

INVOKE Rectangle,MEMDC,100,200,250,350 ; дом

INVOKE Rectangle,MEMDC,60,340,101,350 ; ступенька 1

INVOKE Rectangle,MEMDC,70,330,101,341 ; ступенька 2

INVOKE Rectangle,MEMDC,80,320,101,331 ; ступенька 3

INVOKE SelectObject,MEMDC,HBRUSHDGREY

INVOKE Rectangle,MEMDC,150,250,200,300 ; тёмное окно

; ---------- включить свет ----------

CMP PHOME,0

JNE HOME_NO_DOWN

INVOKE SelectObject,MEMDC,HBRUSHYELLOW

INVOKE Rectangle,MEMDC,150,250,200,300 ; светлое окно

HOME_NO_DOWN:

; ---------- рамы окна ----------

INVOKE MoveToEx ,MEMDC,150,265,0

INVOKE LineTo,MEMDC,200,265

INVOKE MoveToEx ,MEMDC,175,265,0

INVOKE LineTo,MEMDC,175,300

; ---------- крыша ----------

INVOKE MoveToEx ,MEMDC,100,200,0 ; крыша

INVOKE LineTo,MEMDC,175,110

INVOKE LineTo,MEMDC,250,200

INVOKE SelectObject,MEMDC,HBRUSHRED

MOV KRN,100

metka3:

INVOKE MoveToEx ,MEMDC,175,110,0

INVOKE LineTo,MEMDC,KRN,200

INC KRN

CMP KRN,250

JNE metka3

; ---------- дым ----------

CMP PPERERIS,0

JE ne_men1

INVOKE MoveToEx ,MEMDC,200,dim0,0

INVOKE LineTo,MEMDC,225,dim1

INVOKE LineTo,MEMDC,200,dim2

INVOKE LineTo,MEMDC,225,dim3

INVOKE LineTo,MEMDC,200,dim4

INVOKE LineTo,MEMDC,225,dim5

INVOKE LineTo,MEMDC,200,dim6

JMP MET

ne_men1:

INVOKE MoveToEx ,MEMDC,225,dim0,0

INVOKE LineTo,MEMDC,200,dim1

INVOKE LineTo,MEMDC,225,dim2

INVOKE LineTo,MEMDC,200,dim3

INVOKE LineTo,MEMDC,225,dim4

INVOKE LineTo,MEMDC,200,dim5

INVOKE LineTo,MEMDC,225,dim6

MET:

; ---------- изменение координат дыма ----------

DEC dim0

DEC dim1

DEC dim2

DEC dim3

DEC dim4

DEC dim5

DEC dim6

CMP dim5,-10 ; выход дыма за пределы экрана

JNE ne_vishel

NOT PPERERIS

MOV dim0,140

MOV dim1,115

MOV dim2,90

MOV dim3,65

MOV dim4,40

MOV dim5,15

MOV dim6,-10

ne_vishel:

; ---------- труба ----------

INVOKE SelectObject,MEMDC,HBRUSHBLACK

INVOKE Rectangle,MEMDC,198,115,227,190

; ---------- ДВИЖЕНИЕ АВТОМОБИЛЯ ----------

; ---------- движение автомобиля в цикле по кругу вправо ----------

CMP PUP,1

JNE @2

; ---------- движение вправо ----------

CMP PRIGHT,1

JNE metka1

@2:

; ---------- увеличение координат ----------

ADD KUZ1,2

ADD KUZ2,2

ADD KAB1,2

ADD KAB2,2

ADD KAB3,2

ADD PFAR,2

ADD ZFAR1,2

ADD ZFAR2,2

ADD ZFAR3,2

ADD ZKOL1,2

ADD ZKOL2,2

ADD PKOL1,2

ADD PKOL2,2

MOV PRIGHT,0

JMP @7

metka1:

; ---------- движение автомобиля в цикле по кругу влево ----------

CMP PDOWN,1

JNE @6

; ---------- движение влево ----------

CMP PLEFT,1

JNE metka2

@6:

; ---------- уменьшение координат ----------

SUB KUZ1,2

SUB KUZ2,2

SUB KAB1,2

SUB KAB2,2

SUB KAB3,2

SUB PFAR,2

SUB ZFAR1,2

SUB ZFAR2,2

SUB ZFAR3,2

SUB ZKOL1,2

SUB ZKOL2,2

SUB PKOL1,2

SUB PKOL2,2

metka2:

@7:

; ---------- АВТОМОБИЛЬ ----------

INVOKE SelectObject,MEMDC,HBRUSHDGREY

INVOKE Rectangle,MEMDC,KUZ1,300,KUZ2,350 ; кузов

INVOKE SelectObject,MEMDC,HBRUSHBLUE

INVOKE Rectangle,MEMDC,KAB1,310,KAB2,331 ; кабина

INVOKE Rectangle,MEMDC,KAB1,330,KAB3,350 ; кабина

INVOKE SelectObject,MEMDC,HBRUSHWHITE

ADD KAB1,2

SUB KAB2,2

INVOKE Rectangle,MEMDC,KAB1,312,KAB2,329 ; стекло

ADD KAB2,2

SUB KAB1,2

INVOKE SelectObject,MEMDC,HBRUSHRED

INVOKE Rectangle,MEMDC,ZFAR1,332,ZFAR2,343 ; задняя фара

INVOKE SelectObject,MEMDC,HBRUSHWHITE

INVOKE Rectangle,MEMDC,PFAR,332,KAB3,338 ; передняя фара

; ---------- включение заднего габарита ----------

CMP PDOWN,1

JNE @8

CMP PLEFT,1

JNE ne_garit

@8:

INVOKE SelectObject,MEMDC,HBRUSHWHITE

INVOKE Rectangle,MEMDC,ZFAR1,334,ZFAR3,341 ; задний габарит

MOV PLEFT,0

ne_garit:

INVOKE SelectObject,MEMDC,HBRUSHBLACK

INVOKE Ellipse,MEMDC,ZKOL1,340,ZKOL2,360 ; заднее колесо

INVOKE Ellipse,MEMDC,PKOL1,340,PKOL2,360 ; переднее колесо

INVOKE SelectObject,MEMDC,HBRUSHGREY

; ---------- изменение координат колеса для рисования дисков ----------

ADD ZKOL1,3

SUB ZKOL2,3

ADD PKOL1,3

SUB PKOL2,3

INVOKE Ellipse,MEMDC,ZKOL1,343,ZKOL2,357 ; задний диск

INVOKE Ellipse,MEMDC,PKOL1,343,PKOL2,357 ; передний диск

; ---------- восстановление координат колеса ----------

ADD ZKOL2,3

SUB ZKOL1,3

ADD PKOL2,3

SUB PKOL1,3

; ---------- выход машины за пределы правой границы окна ----------

CMP KUZ1,640

JNE ne_vishla

; ------ задание координат машины за пределами левой границы окна ---

MOV KUZ1, 300-410 ; координаты

MOV KUZ2, 366-410 ; кузова

MOV KAB1, 365-410 ; координаты

MOV KAB2, 385-410 ; кабины

MOV KAB3, 405-410 ; кабины

MOV PFAR, 397-410 ; координаты передней фары

MOV ZFAR1, 300-410 ; координаты

MOV ZFAR2, 308-410 ; задней фары

MOV ZFAR3, 306-410 ; заднего габарита

MOV ZKOL1, 323-410 ; координаты

MOV ZKOL2, 343-410 ; заднего колеса

MOV PKOL1, 375-410 ; координаты

MOV PKOL2, 395-410 ; переднего колеса

JMP @1

ne_vishla:

; ---------- выход машины за пределы левой границы окна ----------

CMP KUZ1,-110

JNE ne_vishla1

; ----- задание координат машины за пределами правой границы окна ---

MOV KUZ1, 300+340 ; координаты

MOV KUZ2, 366+340 ; кузова

MOV KAB1, 365+340 ; координаты

MOV KAB2, 385+340 ; кабины

MOV KAB3, 405+340 ; кабины

MOV PFAR, 397+340 ; координаты передней фары

MOV ZFAR1, 300+340 ; координаты

MOV ZFAR2, 308+340 ; задней фары

MOV ZFAR3, 306+340 ; заднего габарита

MOV ZKOL1, 323+340 ; координаты

MOV ZKOL2, 343+340 ; заднего колеса

MOV PKOL1, 375+340 ; координаты

MOV PKOL2, 395+340 ; переднего колеса

ne_vishla1:

@1:

;---------- перерисовка окна ----------

INVOKE Sleep,23

PUSH 0

PUSH OFFSET RECT

PUSH DWORD PTR [EBP+08H]

CALL InvalidateRect@12

; ---------- скопировать виртуальное окно на реальное ----------

INVOKE BitBlt,HDC,0,0,XM,YM,MEMDC,0,0,0CC0020h

; ---------- закрыть контекст окна ----------

INVOKE EndPaint, DWORD PTR [EBP+08H],OFFSET PNT

MOV EAX, 0

JMP FINISH

;---------------------------------------------------------------

WMCREATE:

; ---------- размеры экрана ----------

INVOKE GetSystemMetrics,0

MOV XM, EAX

INVOKE GetSystemMetrics,1

MOV YM, EAX

; ---------- открыть контекст окна ----------

INVOKE GetDC,DWORD PTR [EBP+08H]

MOV HDC,EAX

; ---------- создать совместимый с данным окном контекст ----------

INVOKE CreateCompatibleDC,EAX

MOV MEMDC, EAX

; ----- создать в памяти растровое изображение, совместимое с hdc ------

INVOKE CreateCompatibleBitmap,HDC,XM,YM

; ---------- выбрать растровое изображение в данном контексте ----------

INVOKE SelectObject,MEMDC,EAX

; ---------- создать кисти ----------

INVOKE CreateSolidBrush,GREY

MOV HBRUSHGREY,EAX

INVOKE CreateSolidBrush,BLACK

MOV HBRUSHBLACK,EAX

INVOKE CreateSolidBrush,GREEN

MOV HBRUSHGREEN,EAX

INVOKE CreateSolidBrush,RED

MOV HBRUSHRED,EAX

INVOKE CreateSolidBrush,WHITE

MOV HBRUSHWHITE,EAX

INVOKE CreateSolidBrush,BLUE

MOV HBRUSHBLUE,EAX

INVOKE CreateSolidBrush,YELLOW

MOV HBRUSHYELLOW,EAX

INVOKE CreateSolidBrush,DGREY

MOV HBRUSHDGREY,EAX

INVOKE CreateSolidBrush,DBLUE

MOV HBRUSHDBLUE,EAX

INVOKE CreateSolidBrush,DGREEN

MOV HBRUSHDGREEN,EAX

; ---------- удалить контекст ----------

INVOKE ReleaseDC,DWORD PTR [EBP+08H],HDC

MOV EAX, 0

JMP FINISH

; ---------------------------------------------------------------

DEFWNDPROC:

PUSH DWORD PTR [EBP+14H]

PUSH DWORD PTR [EBP+10H]

PUSH DWORD PTR [EBP+0CH]

PUSH DWORD PTR [EBP+08H]

CALL DefWindowProcA@16

JMP FINISH

; ---------------------------------------------------------------

WMDESTROY:

; ---------- удалить кисти ----------

INVOKE DeleteDC,HBRUSHGREY

INVOKE DeleteDC,HBRUSHBLACK

INVOKE DeleteDC,HBRUSHGREEN

INVOKE DeleteDC,HBRUSHRED

INVOKE DeleteDC,HBRUSHWHITE

INVOKE DeleteDC,HBRUSHBLUE

INVOKE DeleteDC,HBRUSHDBLUE

INVOKE DeleteDC,HBRUSHYELLOW

INVOKE DeleteDC,HBRUSHDGREY

INVOKE DeleteDC,HBRUSHDGREEN

; ---------- удалить виртуальное окно ----------

INVOKE DeleteDC,MEMDC

INVOKE PostQuitMessage,0

MOV EAX, 0

;---------------------------------------------------------------

FINISH:

POP EDI

POP ESI

POP EBX

POP EBP

RET 16

WNDPROC ENDP

_TEXT ENDS

END START

5. Результаты выполнения программы

Вывод

В результате выполнения курсовой работы была изучена графика в Windows, написана программа на 32-битном ассемблере.

Размещено на Allbest.ru


Подобные документы

  • Прикладные программы и утилиты. Простейшие функции операционной системы. История разработки корпорацией Microsoft Corporation графической операционной оболочки Windows. Версия семейства сетевых ОС Windows NT (Millennium Edition, 2000, XP, Vista, Seven)

    презентация [965,2 K], добавлен 12.10.2013

  • Основы программирования в операционной системе Windows. Создание процессов в 32-битных операционных системах. Основное отличие дескриптора от идентификатора. Понятие критической секции. Основы вызова API-функций. Методы многозадачного программирования.

    курсовая работа [501,1 K], добавлен 18.05.2014

  • Назначение, состав и виды операционной системы, ее управленческие функции. Порядок загрузки ОС. Назначение графического интерфейса Windows, характеристика его объектов и операций, проводимых с ними. Средства и система настройки программного продукта.

    контрольная работа [25,1 K], добавлен 27.11.2010

  • Изучение технических возможностей операционной системы Windows XP – ОС семейства Windows NT корпорации Microsoft. Особенности интегрированного программного обеспечения. Дополнительные аплеты в панели управления Windows. Графический интерфейс пользователя.

    презентация [7,4 M], добавлен 23.05.2010

  • Появление первых версий Windows, их графические интерфейсы и расширения для DOS. Семейства Windows 3.x и Windows 9.x, их особенности и основные функции. Эволюция технологии Plug and Play. Наиболее существенные улучшения в современных версиях Windows.

    реферат [162,3 K], добавлен 13.06.2014

  • Работа с объектами операционной системы Windows: основные понятия и горячие клавиши. Создание и редактирование файлов и папок. Скриншоты и графический редактор Paint. Редактирование простейших текстовых документов в Блокноте. Работа с калькулятором.

    лабораторная работа [16,6 K], добавлен 30.11.2010

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

    курсовая работа [352,8 K], добавлен 15.02.2009

  • Совместное функционирование всех устройств компьютера и доступ к его ресурсам. Понятие и функции графической операционной системы Windows. Справочная служба Windows. Управление файловой системой. Технология "Plug and Play". Графический интерфейс Windows.

    контрольная работа [22,2 K], добавлен 22.01.2011

  • Приемы и правила объектно-ориентированного программирования с использованием языка С++. Общие принципы разработки объектно-ориентированных программ. Основные конструкции языка С++. Разработка различных программ для Windows с использованием WIN32 API.

    учебное пособие [1,6 M], добавлен 28.12.2013

  • Общее понятие об оперативной системе Windows Vista. Сравнительный анализ систем Windows XP и Windows Vista. Специфика процесса установки, трехмерный интерфейс Aero Glass, действие некоторых мини-приложений. Новости управления папками, работа в интернете.

    реферат [2,4 M], добавлен 01.02.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.