;运行效果

;win32汇编环境,在窗口程序中画五边形与六边形
;展示五边形与六边形的画法
;将代码复制进radasm软件里,直接编译可运行.重要部分加备注。
;下面为asm文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
include gdi32.inc
includelib kernel32.lib
includelib user32.lib
includelib gdi32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.DATA
ClassName db "SimpleWinClass",0
AppName db "窗口程序的模版",0
@Polygon01 dd 5 dup (50,100, 100,100, 115,53, 75,24, 35,53) ;画五边形的坐标,按逆时针的五个点的坐标比例大概是(100,100)(150,100)(165,53)(125,24)(85,53),可以以此推论出各坐标点
@Polygon02 dd 5 dup (150,100, 200,100, 215,53, 175,24, 135,53)
@Polygon03 dd 6 dup (30,180, 55,217, 105,217, 130,180, 105,143, 55,143) ;画正六边形的坐标比例,大概是(100,100)(125,137)(175,137)(200,100)(175,63)(125,63)
@Polygon04 dd 6 dup (140,180, 165,217, 215,217, 240,180, 215,143, 165,143) ;以第1个坐标为基准,不是很精确,有兴趣的可以自已重算,但原理是这个。
.DATA?
hInstance HINSTANCE ?
CommandLine LPSTR ?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;颜色宏
RGB macro red,green,blue
xor eax,eax
mov ah,blue
shl eax,8
mov ah,green
mov al,red
endm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.CODE
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
invoke ExitProcess, eax
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
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 hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
invoke CreateWindowEx,NULL, ADDR ClassName,ADDR AppName,WS_CAPTION or WS_SYSMENU or WS_MINIMIZEBOX ,100,100,260,280, NULL,NULL,hInst, NULL
mov hwnd,eax
invoke ShowWindow, hwnd,CmdShow
invoke UpdateWindow, hwnd
.while TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.break .if (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.endw
mov eax,msg.wParam
ret
WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL @stPs:PAINTSTRUCT
LOCAL @stRect:RECT
LOCAL @hDc
LOCAL @RGB
LOCAL @hPen,@oldhPen
LOCAL @hBrush:HBRUSH,@oldhBrush:HBRUSH
.if uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
.elseif uMsg == WM_PAINT
invoke BeginPaint,hWnd,addr @stPs ;得到设备,就是屏幕,才能显示出来
mov @hDc,eax
invoke Polygon,@hDc,addr @Polygon01,5 ;画正五边形
invoke SetPolyFillMode,@hDc,ALTERNATE ;设置填充模式
;下面的画法加画笔与画刷,就是填充里面的颜色
RGB 0,178,238
mov @RGB,eax
invoke CreatePen,PS_SOLID,1,@RGB ;创建新画笔,就是用来画后面形状的
mov @hPen,eax
invoke SelectObject,@hDc,@hPen ;把画笔塞进去,在它被顶替之前一直用这个
mov @oldhPen,eax ;保留原来的画笔,即前面函数的返回值eax,后面恢复原状时使用
invoke CreateSolidBrush,@RGB
mov @hBrush,eax
invoke SelectObject,@hDc,@hBrush ;把画刷塞进去,在它被顶替之前一直用这个
mov @oldhBrush,eax
invoke Polygon,@hDc,addr @Polygon02,5 ;画有填充的正五边形
invoke SelectObject,@hDc,@oldhPen ;恢复原来的画笔
invoke SelectObject,@hDc,@oldhBrush ;恢复原来的画刷
invoke DeleteObject,@hPen ;删除自创的画笔
invoke DeleteObject,@hBrush ;删除自创的画刷
invoke Polygon,@hDc,addr @Polygon03,6 ;画正六边形
invoke SetPolyFillMode,@hDc,ALTERNATE ;设置填充模式
;下面画正六边形
RGB 0,178,238
mov @RGB,eax
invoke CreatePen,PS_SOLID,1,@RGB ;创建新画笔,就是用来画后面形状的
mov @hPen,eax
invoke SelectObject,@hDc,@hPen ;把画笔塞进去,在它被顶替之前一直用这个
mov @oldhPen,eax ;保留原来的画笔,即前面函数的返回值eax,后面恢复原状时使用
invoke CreateSolidBrush,@RGB
mov @hBrush,eax
invoke SelectObject,@hDc,@hBrush ;把画刷塞进去,在它被顶替之前一直用这个
mov @oldhBrush,eax
invoke Polygon,@hDc,addr @Polygon04,6 ;画有填充的正六边形
invoke SelectObject,@hDc,@oldhPen ;恢复原来的画笔
invoke SelectObject,@hDc,@oldhBrush ;恢复原来的画刷
invoke DeleteObject,@hPen ;删除自创的画笔
invoke DeleteObject,@hBrush ;删除自创的画刷
invoke EndPaint,hWnd,addr @stPs
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WndProc endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start

1942

被折叠的 条评论
为什么被折叠?



