Графика в Windows
1. Цель работы
Изучить графику в Windows. Написать программу на 32-битном ассемблере, используя API-функции.
. Теория
графика программный windows
В операционной системе Windows реализована объектно-ориентированная идеология. Базовый объект системы - окно, поведение которого определяется методом, называемым функцией окна. Графический образ окна на экране дисплея - прямоугольная рабочая область.
Независимо от своего типа любой объект Windows идентифицируется описателем или дескриптором (handle). Дескриптор - это ссылка на объект. Все взаимоотношения программного кода с объектом осуществляются только через его дескриптор.
Интерфейс прикладного программирования (API - Application Programming Interface) представляет собой совокупность 32-битных функций (Win32 API), которые предназначены для создания приложений (программ), работающих под управлением Microsoft Windows. Функции объявлены в заголовочных файлах. Главный из них - файл windows.h, в котором содержатся ссылки на другие заголовочные файлы.
В Win32 единицей работы компьютера является поток - ход выполнения программы в рамках процесса (в контексте процесса). Поток выполняет программный код, принадлежащий процессу. Процесс - это экземпляр выполняемой программы (но не ход ее выполнения). Он не является динамическим объектом и включает виртуальное адресное пространство, код и данные, файлы, синхронизирующие объекты, динамические библиотеки.
Каждое приложение создает, по меньшей мере, один первичный поток, но может создать и много потоков.
Любое приложение Windows представлено на экране дисплея как минимум одним окном с набором стандартных элементов управления. Различают следующие типы окон:
Перекрывающие окна создаются функцией CreateWindowEx() со стилем WS_OVERLAPPEDWINDOW. Этот стиль определяет наличие заголовка, системного меню, кнопок минимизации и максимизации, кнопки закрытия окна и «толстой» рамки, позволяющей изменять размеры окна. Перекрывающие окна предназначены для главных окон приложений и могут иметь меню.
Всплывающие окна создаются функцией CreateWindowEx() со стилем WS_POPUP и предназначены для окон диалогов, окон сообщений и других окон временного использования, которые могут находиться вне главного окна приложения. Для того чтобы временное окно имело заголовок, рамку и системное меню, необходимо при его создании использовать комбинацию стилей WS_POPUPWINDOW | WS_CAPTION .
Дочерние окна создаются функцией CreateWindowEx() со стилем WS_CHILD и обычно используются для разделения клиентской области родительского окна на отдельные функциональные области.Дочерние окна могут иметьзаголовок, системное меню, кнопки минимизации и максимизации, рамку и полосы прокрутки, но не могут иметь меню. Дочерние окна всегда находятся в пределах клиентской области родительского окна, т.е. их координаты всегда отсчитываются от левого верхнего углародительского окна. Родительское окно может быть перекрывающим, всплывающим или даже другим дочерним окном.
3. Описание используемых API-функций
Вызывает процедуру окна по умолчанию, чтобы обеспечить стандартную обработку сообщения для любого окна. Эта функция гарантирует, что каждое сообщение обрабатывается.
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 <#"justify">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 <#"justify">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 <#"justify">BOOL EndPaint(
__in HWND hWnd, // Дескриптор окна.
__in const PAINTSTRUCT *lpPaint // Указатель на PAINTSTRUCT <#"justify">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 // Интервал времени, на который выполнение будет приостановлено, в миллисекундах.
);
Функция обновляет текущую позицию в указанную точку.
BOOL MoveToEx(
__in HDC hdc, // Дескриптор контекста устройства.
__in int X, // X-координата нового положения.
__in int Y, // Y-координата.
__out LPPOINT lpPoint // Указатель на POINT <#"justify">LineTo
Функция рисует линию от текущей позиции до указанной.
WINGDIAPI BOOL WINAPI LineTo(
HDC hdc, // Дескриптор контекста устройства.nXEnd, // X-координата конца линии.nYEnd // Y-координата.
);
4 Исходный текст отлаженной программы
/*graph1.inc*/_DESTROY equ2_CREATE equ 1_LBUTTONDOWN equ 201h_RBUTTONDOWN equ 204h_NUMLOCKequ90h_SCROLLequ91h_CAPITALequ14h_HOME equ24h_ESCAPEequ1Bh_LEFT equ25h _UP equ26h_RIGHT equ 27h _DOWN equ28h_KEYDOWNequ100h_PAINT equ 0FH_VREDRAW equ 1h_HREDRAW equ 2h_GLOBALCLASS equ 4000h_OVERLAPPEDWINDOW equ 000CF0000Hequ CS_HREDRAW + CS_VREDRAW + CS_GLOBALCLASS_WARNING equ 32515_HAND equ32649_SHOWNORMAL equ 1DefWindowProcA@16 :NEARInvalidateRect@12 :NEARPROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORDPROTO :DWORDPROTO :DWORDPROTO :DWORD, :DWORD,:DWORD, :DWORDPROTO :DWORDPROTO :DWORD, :DWORDPROTO :DWORD, :DWORDPROTO :DWORDPROTO :DWORDPROTO :DWORD, :DWORDPROTO :DWORDPROTO :DWORDPROTO :DWORD, :DWORDPROTO :DWORD, :DWORDPROTO :DWORDPROTO :DWORDPROTO :DWORDPROTO :DWORDPROTO :DWORD, :DWORDPROTO :DWORD, :DWORD, :DWORDPROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORDPROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORDPROTO :DWORD, :DWORDPROTO :DWORDPROTO :DWORDPROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD:DWORD, :DWORD, :DWORD, :DWORD, :DWORD:DWORD:DWORD, :DWORD, :DWORD, :DWORD:DWORD, :DWORD, :DWORDSTRUCDD?DD ? DD ? DD ?DD ?DD ? ENDSSTRUCDD ?? DD ? DD ? DD ?DD ?DD ? DD ? DD ?DD ? ENDSSTRUCDD 0DD 0DD 0DD 0DD 0DD 0DD 0DD 0DB 32 dup(0)ENDS STRUCDD? DD ? DD ?DD ?ENDS
/*graph.asm*/
.386P
; плоская модель
.MODEL FLAT, stdcall../include/graph1.inc
; подключение библиотек../lib/user32.lib../lib/kernel32.lib../lib/gdi32.lib
;=====================================================; ====================== СЕГМЕНТ ДАННЫХ
;======================================================
_DATA SEGMENT DWORD PUBLIC USE32 'DATA'DWORD 0MSGSTRUCT <?>WNDCLASS <?>PAINTSTR <?>DWORD 0BYTE 'Графика в Windows. Рыбаков Константин.',0
NAM BYTE 'CLASS32',0
XM DWORD ?DWORD ?DWORD ?DWORD ??BEBEBEH?H ? ? FF00H? H? FFH ? FFFFFFH ? H ? H? FFFFH0 ; признак нажатия левой кнопки мыши0 ; признак нажатия клавиши HOME0 ; признак нажатия клавиши RIGTH0 ; признак нажатия клавиши LEFT1 ; признак нажатия клавиши UP 1 ; признак нажатия клавиши DOWN
; координаты для движения автомобиля
; координаты кузова
KUZ1DWORD300
KUZ2DWORD366
; координаты кабины
KAB1DWORD365
KAB2DWORD385
KAB3DWORD405
; координаты передней и задних фар
PFARDWORD397
ZFAR1DWORD300
ZFAR2DWORD308
ZFAR3DWORD306
; координаты заднего и переднего колёс
ZKOL1DWORD323
ZKOL2DWORD343
PKOL1DWORD375
PKOL2DWORD395
; координаты для отрисовки дыма
dim0DWORD140 DWORD115 DWORD90 DWORD65 DWORD40DWORD15DWORD-10; признак перерисовки дыма; координата начала дома
_DATA ENDS
;======================================================
;======================== СЕГМЕНТ КОДА
;======================================================
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE':
; ---------- получить дескриптор приложения ----------GetModuleHandleA,0[HINST], EAX_CLASS:
; ---------- заполнить структуру окна ----------
MOV [WC.CLSSTYLE],stylcl ; стиль
MOV [WC.CLSLPFNWNDPROC], OFFSET WNDPROC ; процедура обработки сообщений
MOV [WC.CLSCBCLSEXTRA],0[WC.CLSCBWNDEXTRA], 0EAX, [HINST][WC.CLSHINSTANCE], EAX
; ---------- иконка окна ----------LoadIconA,0,IDI_WARNING[WC.CLSHICON], EAX
; ---------- курсор окна ---------- LoadCursorA,0,IDC_HAND[WC.CLSHCURSOR], EAXCreateSolidBrush,0FFFFFFh [WC.CLSHBRBACKGROUND], EAX DWORD PTR [WC.MENNAME],0DWORD PTR [WC.CLSNAME], OFFSET NAM 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,0AX, 0END_LOOPTranslateMessage,OFFSET MSGDispatchMessageA,OFFSET MSGMSG_LOOP_LOOP:
; ---------- выход из программы ----------
INVOKE ExitProcess,[MSG.MSWPARAM]
_ERR: END_LOOP
; ---------- процедура окна ----------
; ---------- расположение параметров в стеке ----------
; [EBP+014Н]; LPARAM
; [EBP+10H]; WPARAM
; [EBP+0CH]; MES
; [EBP+8]; HWND
;---------------------------------------------------------------PROCEBPEBP,ESPEBXESIEDI DWORD PTR [EBP+0CH],WM_PAINT ; сообщение WM_PAINT - при рисовании окнаWMPAINT DWORD PTR [EBP+0CH],WM_DESTROY ; сообщение WM_DESTROY - при закрытии окнаWMDESTROYDWORD PTR [EBP+0CH],WM_CREATE ; сообщение WM CREATE - при создании окнаWMCREATEDWORD PTR [EBP+0CH],WM_LBUTTONDOWN ; сообщение WM_LBUTTONDOWN - при нажатии левой кнопки мыши LBUTTONDWORD PTR [EBP+0CH],WM_KEYDOWN ; сообщение WM_KEYDOWN - при нажатии клавишKEY_DOWNDEFWNDPROC: PL ; признак нажатия левой кнопки мыши
KEY_DOWN:DWORD PTR [EBP+10H],VK_HOMEHOME_NODOWNPHOME ; признак нажатия клавиши HOME_NODOWN:DWORD PTR [EBP+10H],VK_UPUP_NODOWNPUP ; признак нажатия клавиши UP PDOWN,1 ; признак нажатия клавиши DOWN
UP_NODOWN:DWORD PTR [EBP+10H],VK_DOWNDOWN_NODOWNPDOWN ; признак нажатия клавиши DOWN PUP,1 ; признак нажатия клавиши UP
DOWN_NODOWN:DWORD PTR [EBP+10H],VK_RIGHTR_NODOWNPRIGHT,1 ; признак нажатия клавиши RIGTH PUP,1 ; признак нажатия клавиши UP
MOV PDOWN,1 ; признак нажатия клавиши DOWN
R_NODOWN:DWORD PTR [EBP+10H],VK_LEFTL_NODOWNPLEFT,1 ; признак нажатия клавиши LEFT PUP,1 ; признак нажатия клавиши UP
MOV PDOWN,1 ; признак нажатия клавиши DOWN
L_NODOWN:
;---------- перерисовка окна ----------
PUSH 0
PUSH OFFSET RECTDWORD PTR [EBP+08H]InvalidateRect@12
;------------------------------------------------------------- :BeginPaint, DWORD PTR [EBP+08H],OFFSET PNT HDC,EAX ; сохранить контекст (дескриптор)
INVOKE CreateSolidBrush,08B8B83h ; фонSelectObject,MEMDC,EAX
; ---------- заполнить данную прямоугольную область ----------
; 0F00021H РАТСОРУ - заполнить данным цветом
INVOKE PatBlt,MEMDC,0,0,XM,YM,0F00021H
; ---------- ПЕЙЗАЖ ----------
; ---------- ночь ----------SelectObject,MEMDC,HBRUSHDBLUERectangle,MEMDC,0,0,640,276 ; ночное небо SelectObject,MEMDC,HBRUSHDGREENRectangle,MEMDC,0,275,640,480 ; ночная трава SelectObject,MEMDC,HBRUSHBLACKRectangle,MEMDC,50,250,55,300 ; ствол дереваSelectObject,MEMDC,HBRUSHDGREENEllipse,MEMDC,25,210,45,230 ; ночная кронаEllipse,MEMDC,27,210,77,280 ; ночная кронаEllipse,MEMDC,50,230,80,260 ; ночная крона
; ---------- звёзды ---------- SelectObject,MEMDC,HBRUSHWHITEEllipse,MEMDC,50,50,55,55 Ellipse,MEMDC,500,100,505,105 Ellipse,MEMDC,80,200,85,205 Ellipse,MEMDC,550,175,555,180 Ellipse,MEMDC,350,75,355,80 Ellipse,MEMDC,75,50,125,100 ; Луна
; ---------- день ----------PL,0LBUTTON_NO_DOWN SelectObject,MEMDC,HBRUSHBLUERectangle,MEMDC,0,0,640,276 ; дневное небоSelectObject,MEMDC,HBRUSHYELLOWEllipse,MEMDC,475,50,525,100 ; СолнцеSelectObject,MEMDC,HBRUSHGREENRectangle,MEMDC,0,275,640,480 ; дневная траваSelectObject,MEMDC,HBRUSHBLACKRectangle,MEMDC,50,250,55,300 ; ствол SelectObject,MEMDC,HBRUSHGREENEllipse,MEMDC,25,210,45,230 ; дневная кронаEllipse,MEMDC,27,210,77,280 ; дневная кронаEllipse,MEMDC,50,230,80,260 ; дневная крона_NO_DOWN:
; ---------- ДОМ ---------- SelectObject,MEMDC,HBRUSHGREYRectangle,MEMDC,100,200,250,350 ; домRectangle,MEMDC,60,340,101,350 ; ступенька 1Rectangle,MEMDC,70,330,101,341 ; ступенька 2Rectangle,MEMDC,80,320,101,331 ; ступенька 3SelectObject,MEMDC,HBRUSHDGREYRectangle,MEMDC,150,250,200,300 ; тёмное окно
; ---------- включить свет ----------PHOME,0HOME_NO_DOWN SelectObject,MEMDC,HBRUSHYELLOWRectangle,MEMDC,150,250,200,300 ; светлое окно_NO_DOWN:
; ---------- рамы окна ----------MoveToEx ,MEMDC,150,265,0 LineTo,MEMDC,200,265MoveToEx ,MEMDC,175,265,0 LineTo,MEMDC,175,300
; ---------- крыша ----------MoveToEx ,MEMDC,100,200,0 ; крышаLineTo,MEMDC,175,110LineTo,MEMDC,250,200SelectObject,MEMDC,HBRUSHREDKRN,100:MoveToEx ,MEMDC,175,110,0 LineTo,MEMDC,KRN,200KRNKRN,250metka3
; ---------- дым ----------PPERERIS,0ne_men1MoveToEx ,MEMDC,200,dim0,0 LineTo,MEMDC,225,dim1LineTo,MEMDC,200,dim2LineTo,MEMDC,225,dim3LineTo,MEMDC,200,dim4LineTo,MEMDC,225,dim5LineTo,MEMDC,200,dim6MET_men1:MoveToEx ,MEMDC,225,dim0,0 LineTo,MEMDC,200,dim1LineTo,MEMDC,225,dim2LineTo,MEMDC,200,dim3LineTo,MEMDC,225,dim4LineTo,MEMDC,200,dim5LineTo,MEMDC,225,dim6:
; ---------- изменение координат дыма ----------
DEC dim0
DEC dim1dim2dim3dim4dim5dim6 dim5,-10 ; выход дыма за пределы экрана
JNE ne_vishel PPERERISdim0,140dim1,115dim2,90dim3,65dim4,40dim5,15dim6,-10_vishel:
; ---------- труба ----------SelectObject,MEMDC,HBRUSHBLACK Rectangle,MEMDC,198,115,227,190
; ---------- ДВИЖЕНИЕ АВТОМОБИЛЯ ----------
; ---------- движение автомобиля в цикле по кругу вправо ----------
CMP PUP,1
JNE @2
; ---------- движение вправо ----------
CMP PRIGHT,1
JNE metka1
@2:
; ---------- увеличение координат ----------
ADD KUZ1,2KUZ2,2KAB1,2KAB2,2KAB3,2PFAR,2ZFAR1,2ZFAR2,2ZFAR3,2ZKOL1,2ZKOL2,2PKOL1,2PKOL2,2PRIGHT,0@71:
; ---------- движение автомобиля в цикле по кругу влево ----------
CMP PDOWN,1
JNE @6
; ---------- движение влево ----------
CMP PLEFT,1
JNE metka2
@6:
; ---------- уменьшение координат ----------
SUB KUZ1,2KUZ2,2KAB1,2KAB2,2KAB3,2PFAR,2ZFAR1,2ZFAR2,2ZFAR3,2ZKOL1,2ZKOL2,2PKOL1,2PKOL2,2:
@7:
; ---------- АВТОМОБИЛЬ ----------SelectObject,MEMDC,HBRUSHDGREYRectangle,MEMDC,KUZ1,300,KUZ2,350 ; кузовSelectObject,MEMDC,HBRUSHBLUERectangle,MEMDC,KAB1,310,KAB2,331 ; кабинаRectangle,MEMDC,KAB1,330,KAB3,350 ; кабинаSelectObject,MEMDC,HBRUSHWHITEKAB1,2KAB2,2Rectangle,MEMDC,KAB1,312,KAB2,329 ; стекло KAB2,2KAB1,2SelectObject,MEMDC,HBRUSHREDRectangle,MEMDC,ZFAR1,332,ZFAR2,343 ; задняя фараSelectObject,MEMDC,HBRUSHWHITERectangle,MEMDC,PFAR,332,KAB3,338 ; передняя фара
; ---------- включение заднего габарита ----------
CMP PDOWN,1
JNE @8PLEFT,1ne_garit
@8:SelectObject,MEMDC,HBRUSHWHITERectangle,MEMDC,ZFAR1,334,ZFAR3,341 ; задний габаритPLEFT,0_garit:SelectObject,MEMDC,HBRUSHBLACKEllipse,MEMDC,ZKOL1,340,ZKOL2,360 ; заднее колесоEllipse,MEMDC,PKOL1,340,PKOL2,360 ; переднее колесоSelectObject,MEMDC,HBRUSHGREY
; ---------- изменение координат колеса для рисования дисков ----------ZKOL1,3ZKOL2,3PKOL1,3PKOL2,3Ellipse,MEMDC,ZKOL1,343,ZKOL2,357 ; задний дискEllipse,MEMDC,PKOL1,343,PKOL2,357 ; передний диск
; ---------- восстановление координат колеса ----------
ADD ZKOL2,3
SUB ZKOL1,3PKOL2,3PKOL1,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:
;---------- перерисовка окна ----------Sleep,230OFFSET RECTDWORD PTR [EBP+08H] InvalidateRect@12
; ---------- скопировать виртуальное окно на реальное ----------
INVOKE BitBlt,HDC,0,0,XM,YM,MEMDC,0,0,0CC0020h
; ---------- закрыть контекст окна ----------EndPaint, DWORD PTR [EBP+08H],OFFSET PNTEAX, 0FINISH
;--------------------------------------------------------------- :
; ---------- размеры экрана ----------GetSystemMetrics,0XM, EAXGetSystemMetrics,1YM, EAX
; ---------- открыть контекст окна ----------GetDC,DWORD PTR [EBP+08H] HDC,EAX
; ---------- создать совместимый с данным окном контекст ----------
INVOKE CreateCompatibleDC,EAXMEMDC, EAX
; ----- создать в памяти растровое изображение, совместимое с hdc ------
INVOKE CreateCompatibleBitmap,HDC,XM,YM
; ---------- выбрать растровое изображение в данном контексте ----------
INVOKE SelectObject,MEMDC,EAX
; ---------- создать кисти ----------CreateSolidBrush,GREY HBRUSHGREY,EAXCreateSolidBrush,BLACKHBRUSHBLACK,EAXCreateSolidBrush,GREEN HBRUSHGREEN,EAX CreateSolidBrush,RED HBRUSHRED,EAX CreateSolidBrush,WHITE HBRUSHWHITE,EAXCreateSolidBrush,BLUE HBRUSHBLUE,EAX CreateSolidBrush,YELLOW HBRUSHYELLOW,EAX CreateSolidBrush,DGREY HBRUSHDGREY,EAXCreateSolidBrush,DBLUE HBRUSHDBLUE,EAXCreateSolidBrush,DGREEN HBRUSHDGREEN,EAX
; ---------- удалить контекст ----------ReleaseDC,DWORD PTR [EBP+08H],HDCEAX, 0FINISH
; ---------------------------------------------------------------:DWORD PTR [EBP+14H]DWORD PTR [EBP+10H]DWORD PTR [EBP+0CH]DWORD PTR [EBP+08H]DefWindowProcA@16FINISH
; --------------------------------------------------------------- :
; ---------- удалить кисти ----------DeleteDC,HBRUSHGREY DeleteDC,HBRUSHBLACKDeleteDC,HBRUSHGREEN DeleteDC,HBRUSHRED DeleteDC,HBRUSHWHITEDeleteDC,HBRUSHBLUE DeleteDC,HBRUSHDBLUE DeleteDC,HBRUSHYELLOWDeleteDC,HBRUSHDGREYDeleteDC,HBRUSHDGREEN
; ---------- удалить виртуальное окно ----------
INVOKE DeleteDC,MEMDC
INVOKE PostQuitMessage,0 EAX, 0
;---------------------------------------------------------------:EDIESIEBXEBP16ENDP
_TEXT ENDS START
. Результаты выполнения программы
Вывод
В результате выполнения курсовой работы была изучена графика в Windows, написана программа на 32-битном ассемблере.
Больше работ по теме:
Предмет: Информационное обеспечение, программирование
Тип работы: Курсовая работа (т)
Новости образования
КОНТАКТНЫЙ EMAIL: [email protected]
Скачать реферат © 2019 | Пользовательское соглашение
ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ