Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Попробуем нарисовать что-нибудь посложнее, например эллипс. Для рисования эллипса или окружности в заданной прямоугольной области предназначена функция Ellipse. Функция имеет следующий синтаксис:
BOOL Ellipse(HDC hdc,
int nLeftRect,
int nTopRect,
int nRightRect,
int nBottomRect
);
// дескриптор контекста устройства
// координата х левого верхнего угла
// ограничительного прямоугольника
// координата у левого вернего угла
// координата х правого нижнего угла
// координата у правого нижнего угла

Рассмотрим простую программу, выполняющую рисование эллипса. Пусть центром эллипса является центр воображаемого прямоугольника, описываемого координатами левого верхнего (хо, уо) и правого нижнего (xi, yi) углов. Пусть координаты (хо, уо) отстоят от начала координат на '/з, а координаты (xi, yi) — на 2/з- Вывод изображения выполняется в обработчике WMPAINT. Исходный текст программы (назовем ее DRAWEL) приведен в листинге 5.14.
Листинг 5.14. Программа, рисующая эллипс в клиентской области : окна приложения
DRAWEL.ASM
.386
.model flat, stdcaii
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
; WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.data
szDisplayName DB "РИСОВАНИЕ ЭЛЛИПСА", О
CommandLine DD 0
hWnd DD 0
hlnstance DD 0
szClassName DB "Demo_Class", 0
. code
start:
mov hlnstance, EAX
call WinMain
push EAX
call ExitProcess
WinMain proc hlnst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD


Локальные переменные процедуры
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG

Заполнение структуры WNDCLASSEX требуемыми параметрами
mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, offset WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
push hlnst
pop wc.hlnstance
mov wc.hb rBa с kg round, COLOR_BTN FACE+9
mov wc.IpszMenuName, NULL
mov wc.IpszClassName, offset szClassName
push IDI_APPLICATION
push NULL
call Loadlcon
mov wc.hlcon, EAX
push IDC_ARROW
push NULL
call LoadCursor
mov wc.hCursor, EAX
mov wc.hlconSm, 0
WinMain endp

Оконная процедура
WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
LOCAL hdc :HDC
LOCAL ps :PAINTSTRUCT
LOCAL rect :RECT

Переменные, где хранятся значения координат эллипса
LOCAL хО, уО, xl, yl :DWORD
cmp uMsg, WM_PAINT
jne next_l
lea EDX, ps
push EDX
push hWnd
call BeginPaint
mov hdc, EAX
lea ESI, rect
push ESI
push hWin
call GetciientRect

Вычисление координаты хО
mov EAX, rect.right
sub EAX, rect.left
push EAX
mov EBX, 3
xor EDX, EDX
div EBX
mov ECX, rect.left
320 Гпава 5
lea ЕАХ, wc
push ЕАХ
call RegisterClassEx
invoke CreateWindowEx, WS_EX_OVERLAPPEDWINDOW, ADDR szClassName,\
ADDR szDisplayName, WSJDVERLAPPEDWINDOW,\
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,\
CW_USEDEFAULT, NULL, NULL, hlnst, NULL
call ShowWindow
push hWnd
call UpdateWindow

Цикл обработки сообщений
StartLoop:
push 0
push 0
push NULL
lea EAX, msg
push EAX
call GetMessage
cmp EAX, 0
je ExitLoop
lea EAX, msg
push EAX
call TranslateMessage
lea EAX, msg
push EAX
call DispatchMessage
jmp StartLoop
ExitLoop:
mov EAX, msg.wParam
ret
322 Гпава 5
add ЕСХ, ЕАХ
mov хО, ЕСХ

Вычисление координаты xl
pop ЕАХ
mov ЕВХ, 3
xor EDX, EDX
div EBX
mov ECX, rect.right
sub ECX, EAX
mov xl, ECX

Вычисление координаты yO
mov EAX, rect.bottom
sub EAX, rect.top
push EAX
mov EBX, 3
xor EDX, EDX
div EBX
mov ECX, rect.top
add ECX, EAX
mov yO, ECX

Вычисление координаты yl
pop EAX
mov EBX, 3
xor EDX, EDX
div EBX
mov ECX, rect.bottom
sub ECX, EAX
mov yl, ECX

Рисование эллипса
push yl xl yO xO Ellipse lea EDX, ps
push EDX
push hWnd
call EndPaint
ret
next_l:
cmp uMsg, WM_DESTROY
jne next_2
next_2:
push lParam
push wParam
push uMsg
push hWin
call DefWindowProc
ret
WndProc endp
end start


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru