Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


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





5.4. Рисование геометрических фигур
Процесс рисования простейших геометрических фигур в Windows требует вызова некоторых функций графического интерфейса Windows. Например, чтобы нарисовать линию в окне приложения, необходимо вызвать по крайней мере две функции — MoveToEx и LineTo. Функция MoveToEx перемещает указанную точку на позицию с другими координатами. Функция имеет следующий синтаксис:

BOOL MoveToEx(HDC hdc, // дескриптор контекста
Int X, // х — координата новой позиции
int Y, //у — координата новой позиции
LPPOINT lpPoint); // предыдущие координаты точки
Непосредственное рисование линии выполняется с помощью функции LineTo, которая в качестве параметров принимает дескриптор контекста устройства и координаты конечной точки. Функция имеет синтаксис:
BOOL LineTo(HDC hdc, // дескриптор контекста
int nXEnd, // x - координата конечной точки
int nYEnd //у - координата конечной точки
) ;

Рассмотрим пример, в котором требуется нарисовать диагональ прямоугольника клиентской области. Начальная точка известна — это (0, 0), а координаты конечной (правый нижний угол) вычисляются так:
х = rect. right — rect. left,
у = rect.bottom - rect.top.
Исходный текст приложения приведен в листинге 5.13.
Листинг 5.13. Программа, рисующая диагональю окна приложения s-./v
; DRAWLINE.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 О
DD О
DD О
DB "Demo Class", 0
hWnd
hlnstance
szClassName
.code
push
push NULL
push hlnstance
call WinMain
mov
CommandLine
CommandLine, EAX
push EAX
call ExitProcess
WinMain proc hlnst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD

Локальные переменные процедуры
LOCAL цс :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.hbrBackground, COLOR_BTNFACE+6
mov wc.IpszMenuName, NULL
mov wc.IpszClassName, offset szClassName
push IDI_APPLICATION
NULL call LoadCursor
mov wc.hCursor, EAX
mov wc.hlconSm, 0
lea EAX, wc
push EAX
call RegisterClassEx
push NULL
push hlnst
push NULL
push NULL
push CWJJSEDEFAULT
push CWJJSEDEFAULT
push CWJJSEDEFAULT
push CWJJSEDEFAULT
push WS_OVERLAPPEDWINDOW
push offset szDisplayName
push offset szClassName
push WS_EX_OVERLAPPEDWINDOW
call CreateWindowEx
mov hWnd, EAX
push hWnd
call Updatewindow

Цикл обработки сообщений
StartLoop:
push О
push О
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
WinMain endp
WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
; Локальные переменные
LOCAL hdc :HDC
LOCAL ps :PAINTSTRUCT
LOCAL rect :RECT
LOCAL x, у :DWORD
cmp uMsg, WM_PAINT
jne next_l
lea EDX, ps
push EDX
316 Гпава 5
push
call
mov
lea
push
push
call
push
push
push
push
call
mov
sub
push
mov
sub
push
push
call
lea
push
push
call
ret
next_l:
cmp
jne
push
call
xor
ret
next_2:
push
push
hWnd
BeginPaint
hdc, EAX
ESI, rect
ESI
hWin
GetciientRect
0
0
0
hdc
MoveToEx
EAX, rect.bottom
EAX, rect.top
EAX
EAX, rect.right
EAX, rect.left
EAX
hdc
LineTo
EDX, ps
EDX
hWnd
EndPaint
uMsg, WM_DESTROY
next_2
NULL
PostQuitMessage
EAX, EAX
lParam
wParam
push uMsg
push hWin
call DefWindowProc
ret
WndProc endp
end start


 
 
 

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