Графика в Windows

 

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


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


. Теория

графика программный 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-функций


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

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-битном ассемблере.


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

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2019 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ