?? 用masmplus 學(xué)習(xí)匯編語言(5) .txt
字號(hào):
用MasmPlus 學(xué)習(xí)匯編語言(5)
相關(guān)的例子:下載>>> 作者:Zoologist 于2007-12-16上傳
--------------------------------------------------------------------------------
這一期,我們會(huì)講述很多關(guān)于繪制圖形方面的知識(shí),其中最簡(jiǎn)單的莫過于畫線的語句了。MoveToEx 相當(dāng)于“拿著畫筆到”X,Y位置,LineTo 相當(dāng)于“落筆,畫到”X,Y位置。憑借著兩個(gè)簡(jiǎn)單的語句,我們就能夠創(chuàng)建很多有意思的圖形。
分形
下面是一個(gè)繪圖程序,能夠繪制一個(gè)類似于樹的圖形。核心是一段遞歸程序:
Tree 起始X坐標(biāo),起始Y坐標(biāo),長(zhǎng)度,方向
繪制樹枝,長(zhǎng)度取2/3
if 達(dá)到需要的精度 then
只繪制樹干
else
繪制左樹干
繪制右樹干
endif
(這個(gè)只是基本框架,用來描述算法思想)
;MASMPlus 代碼模板 - 普通的 Windows 程序代碼
.386
.Model Flat, StdCall
Option Casemap :None
Include windows.inc
Include user32.inc
Include kernel32.inc
Include gdi32.inc
includelib gdi32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
include macro.asm
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.DATA
szAppName db "Tree 1",0
.DATA?
hInstance dd ?
cxClient dd ?
cyClient dd ?
hdc dd ?
.CODE
START: ;從這里開始執(zhí)行
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke WinMain,hInstance,NULL,NULL,SW_SHOWDEFAULT
invoke ExitProcess,0
WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,iCmdShow:DWORD
LOCAL wndclass :WNDCLASSEX
LOCAL msg :MSG
local hWnd :HWND
mov wndclass.cbSize,sizeof WNDCLASSEX
mov wndclass.style,CS_HREDRAW or CS_VREDRAW
mov wndclass.lpfnWndProc,offset WndProc
mov wndclass.cbClsExtra,0
mov wndclass.cbWndExtra,0
push hInst
pop wndclass.hInstance
invoke LoadIcon,NULL,IDI_APPLICATION
mov wndclass.hIcon,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wndclass.hCursor,eax
invoke GetStockObject,WHITE_BRUSH
mov wndclass.hbrBackground,EAX
mov wndclass.lpszMenuName,NULL
mov wndclass.lpszClassName,offset szAppName
mov wndclass.hIconSm,0
invoke RegisterClassEx, ADDR wndclass
.if (EAX==0)
invoke MessageBox,NULL,CTXT("This program requires Windows NT!"),addr szAppName,MB_ICONERROR
ret
.endif
invoke CreateWindowEx,
NULL,
ADDR szAppName, ;window class name
CTXT("Tree 1 demo"), ;window caption
WS_OVERLAPPEDWINDOW, ;window style
CW_USEDEFAULT, ;initial x position
CW_USEDEFAULT, ;initial y position
CW_USEDEFAULT, ;initial x size
CW_USEDEFAULT, ;initial y size
NULL, ;parent window handle
NULL, ;window menu handle
hInstance, ;program instance handle
NULL ;creation parameters
mov hWnd,eax
invoke ShowWindow,hWnd,iCmdShow
invoke UpdateWindow,hWnd
StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0
cmp eax, 0
je ExitLoop
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp StartLoop
ExitLoop:
mov eax,msg.wParam
ret
WinMain endp
Tree Proc xPos:DWORD,yPos:DWORD,Len:DWORD,Direction:DWORD
LOCAL Dir1,Dir2:DWORD
xor edx,edx ;Len= Len * 2 / 3
mov eax,Len
shl eax,1
mov ebx,3
div ebx
mov Len,eax
invoke MoveToEx,hdc,xPos,yPos,NULL
mov ecx,Len ;下面計(jì)算要繪制一個(gè)枝干的坐標(biāo)
mov eax,xPos
mov ebx,yPos
.if (Direction==0) ;左
sub eax,ecx
.endif
.if (Direction==1) ;下
add ebx,ecx
.endif
.if (Direction==2) ;右
add eax,ecx
.endif
.if (Direction==3) ;上
sub ebx,ecx
.endif
mov xPos,eax
mov yPos,ebx
invoke LineTo,hdc,xPos,yPos ;繪制一個(gè)枝干
.if (Len>1) ;如果這個(gè)長(zhǎng)度大于1就繼續(xù)繪制
mov eax,Direction ;下一個(gè)方向左側(cè)=(方向+5) mod 4
add eax,5
xor edx,edx
mov ebx,4
div ebx
mov Dir1,edx
invoke Tree,xPos,yPos,Len,Dir1
;這個(gè)地方可以添加一個(gè)循環(huán),為繪制延時(shí),創(chuàng)造動(dòng)畫效果
;xor cx,cx
;@@:
;loop @b
mov eax,Direction ;下一個(gè)方向左側(cè)=(方向+3) mod 4
add eax,3
xor edx,edx
mov ebx,4
div ebx
mov Dir2,edx
invoke Tree,xPos,yPos,Len,Dir2
.endif
ret
Tree Endp
WndProc proc hwnd:DWORD,message:DWORD,wParam :DWORD,lParam :DWORD
LOCAL ps :PAINTSTRUCT
.if message == WM_SIZE
mov eax,lParam ;cxClient = LOWORD (lParam)
and eax,0FFFFh
mov cxClient,eax
mov eax,lParam
shr eax,16
mov cyClient,eax ;cyClient = HIWORD (lParam)
ret
.elseif message == WM_PAINT
invoke BeginPaint,hwnd,addr ps
mov hdc,eax
mov eax,cxClient
shr eax,1
mov ebx,cyClient
shr ebx,1
add ebx,100
invoke Tree,eax,cyClient,ebx,3
invoke EndPaint,hwnd,addr ps
ret
.elseif message == WM_DESTROY
invoke PostQuitMessage,NULL
ret
.endif
invoke DefWindowProc,hwnd, message, wParam, lParam
ret
WndProc endp
END START
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -