⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 用masmplus 学习汇编语言(5) .txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
用MasmPlus 学习汇编语言(5) 
相关的例子:下载>>>  作者:Zoologist 于2007-12-16上传   

--------------------------------------------------------------------------------

    这一期,我们会讲述很多关于绘制图形方面的知识,其中最简单的莫过于画线的语句了。MoveToEx 相当于“拿着画笔到”X,Y位置,LineTo 相当于“落笔,画到”X,Y位置。凭借着两个简单的语句,我们就能够创建很多有意思的图形。

分形
    下面是一个绘图程序,能够绘制一个类似于树的图形。核心是一段递归程序:

           Tree 起始X坐标,起始Y坐标,长度,方向

              绘制树枝,长度取2/3

              if 达到需要的精度 then

                 只绘制树干

              else

                 绘制左树干

                 绘制右树干

              endif    

        (这个只是基本框架,用来描述算法思想)

;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: ;从这里开始执行

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 ;下面计算要绘制一个枝干的坐标
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 ;绘制一个枝干

.if (Len>1) ;如果这个长度大于1就继续绘制

mov eax,Direction ;下一个方向左侧=(方向+5) mod 4
add eax,5
xor edx,edx
mov ebx,4
div ebx
mov Dir1,edx
invoke Tree,xPos,yPos,Len,Dir1 
;这个地方可以添加一个循环,为绘制延时,创造动画效果
;xor cx,cx
;@@:
;loop @b
mov eax,Direction ;下一个方向左侧=(方向+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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -