Графика в 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