📄 sin.asm
字号:
include .\head.inc
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
MakeRect PROTO:DWORD,:DWORD,:DWORD,:DWORD
Sin PROTO :DWORD,:DWORD
XFORMCOUNTERFEIT STRUCT
eM11 DWORD 0.0
eM12 DWORD 0.0
eM21 DWORD 0.0
eM22 DWORD 0.0
ex DWORD 0.0
ey DWORD 0.0
XFORMCOUNTERFEIT ENDS
.const
IDR_MENU equ 101
IDM_MESS equ 40001
IDM_EXIT equ 40002
IDM_LOMETRIC equ 40003
IDM_ISO equ 40004
IDM_ANISO equ 40005
.data
ClassName db "WinClass",0
TitleName db "可变比例映射模式(不同比)",0
xForm XFORMCOUNTERFEIT <1.0,1.0,0.0,1.0,0,0>
MenuMess db "Menu Success!",0
MenuItem0 db "Message",0
MenuItem1 db "Exit",0
Caption db "window",0
MenuName db "MyMenu",0
base_180 dd 180
.data?
pt POINT <>
menu MENUITEMINFO<>
hInstance HINSTANCE ?
hMenu HMENU ?
hp HPEN ?
oldhp HPEN ?
hBrush HBRUSH ?
oldhBrush HBRUSH ?
hPopupMenu HMENU ?
Color COLORREF ?
Rect RECT <>
NewRect RECT <>
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke WinMain, NULL,NULL,NULL, 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 or CS_DBLCLKS
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
mov eax, hInstance
mov wc.hInstance,eax
invoke GetStockObject,WHITE_BRUSH
mov wc.hbrBackground,eax
mov eax,IDR_MENU
mov wc.lpszMenuName,eax
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_ASTERISK
mov wc.hIcon,eax
mov wc.hIconSm,0
invoke LoadCursor,NULL,IDC_HAND
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
invoke CreateWindowEx,WS_EX_CLIENTEDGE+WS_EX_APPWINDOW+WS_EX_TOPMOST,addr ClassName,\
addr TitleName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,400,200,\
NULL,NULL,hInst,NULL
mov hwnd,eax
invoke ShowWindow,hwnd,CmdShow
invoke UpdateWindow,hwnd
invoke GetMenu,hwnd
mov hMenu,eax
.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 hdc:HDC
.if uMsg==WM_DESTROY
invoke DeleteObject,hp
invoke DeleteObject,oldhp
invoke DeleteObject,hBrush
invoke DeleteObject,oldhBrush
invoke PostQuitMessage,NULL
.elseif uMsg==WM_CREATE
invoke CreatePopupMenu
mov hPopupMenu,eax
mov menu.cbSize,sizeof MENUITEMINFO
mov menu.fMask,MIIM_STRING+MIIM_ID
mov menu.wID,IDM_MESS
mov menu.dwTypeData,offset MenuItem0
invoke InsertMenuItem,hPopupMenu,0,TRUE,addr menu
mov menu.dwTypeData,offset MenuItem1
mov menu.wID,IDM_EXIT
invoke InsertMenuItem,hPopupMenu,1,TRUE,addr menu
.elseif uMsg==WM_COMMAND
mov eax,wParam
.if ax==IDM_MESS
mov eax,IDR_MENU
invoke MessageBox,hWnd,addr MenuMess,addr Caption,MB_OK
.elseif ax==IDM_LOMETRIC
invoke GetDC,hWnd
mov hdc,eax
invoke SetGraphicsMode,hdc,GM_ADVANCED
invoke SetMapMode,hdc,MM_LOMETRIC
invoke SetWorldTransform,hdc, addr xForm
invoke GetClientRect,hWnd,addr Rect
invoke GetStockObject,HOLLOW_BRUSH
invoke SelectObject,hdc,eax
invoke DPtoLP,hdc,addr Rect,2
invoke MakeRect,-100,100,100,-100
invoke Ellipse,hdc,NewRect.left,NewRect.top,NewRect.right,NewRect.bottom
invoke MakeRect,-94,94,94,-94
invoke Ellipse,hdc,NewRect.left,NewRect.top,NewRect.right,NewRect.bottom
invoke MakeRect,-13,113,13,50
invoke Rectangle,hdc,NewRect.left,NewRect.top,NewRect.right,NewRect.bottom
invoke MakeRect,-13,96,13,50
invoke Rectangle,hdc,NewRect.left,NewRect.top,NewRect.right,NewRect.bottom
invoke MakeRect,-150,0,-16,0
invoke MoveToEx,hdc,NewRect.left,NewRect.top,NULL
invoke LineTo,hdc,NewRect.right,NewRect.bottom
invoke MakeRect,-13,0,13,0
invoke MoveToEx,hdc,NewRect.left,NewRect.top,NULL
invoke LineTo,hdc,NewRect.right,NewRect.bottom
invoke MakeRect,16,0,150,0
invoke MoveToEx,hdc,NewRect.left,NewRect.top,NULL
invoke LineTo,hdc,NewRect.right,NewRect.bottom
invoke MakeRect,0,-150,0,-16
invoke MoveToEx,hdc,NewRect.left,NewRect.top,NULL
invoke LineTo,hdc,NewRect.right,NewRect.bottom
invoke MakeRect,0,-13,0,13
invoke MoveToEx,hdc,NewRect.left,NewRect.top,NULL
invoke LineTo,hdc,NewRect.right,NewRect.bottom
invoke MakeRect,0,16,0,150
invoke MoveToEx,hdc,NewRect.left,NewRect.top,NULL
invoke LineTo,hdc,NewRect.right,NewRect.bottom
invoke ReleaseDC,hWnd,hdc
.elseif ax==IDM_ISO
invoke GetClientRect,hWnd,addr Rect
invoke GetDC,hWnd
mov hdc,eax
RGB 0FFh,0,0
invoke CreatePen,PS_INSIDEFRAME,2,eax
mov hp,eax
invoke SelectObject,hdc,hp
mov oldhp,eax
RGB 0,0,0ffh
invoke CreateHatchBrush,HS_DIAGCROSS,eax
mov hBrush,eax
invoke SelectObject,hdc,hBrush
mov oldhBrush,eax
invoke SetMapMode,hdc,MM_ISOTROPIC
mov eax,Rect.bottom
shr eax,1
invoke SetViewportOrgEx,hdc,Rect.right,eax,NULL
invoke SetViewportExtEx,hdc,Rect.right,Rect.bottom,NULL
invoke SetWindowOrgEx,hdc,-700,500,NULL
invoke SetWindowExtEx,hdc,-10000,10000,NULL
invoke MoveToEx,hdc,500,-500,NULL
invoke LineTo,hdc,300,9500
invoke LineTo,hdc,-700,500
invoke LineTo,hdc,500,-500
invoke SelectObject,hdc,oldhp
invoke SelectObject,hdc,oldhBrush
invoke ReleaseDC,hWnd,hdc
.elseif ax==IDM_ANISO
invoke GetClientRect,hWnd,addr Rect
invoke GetDC,hWnd
mov hdc,eax
RGB 0,44h,0ffh
invoke CreatePen,PS_INSIDEFRAME,1,eax
mov hp,eax
invoke SelectObject,hdc,hp
mov oldhp,eax
mov eax,Rect.bottom
shr eax,1
push eax
invoke MoveToEx,hdc,0,eax,NULL
pop eax
invoke LineTo,hdc,Rect.right,eax
invoke SetMapMode,hdc,MM_ISOTROPIC
mov eax,Rect.bottom
shr eax,1
invoke SetViewportOrgEx,hdc,0,eax,NULL
invoke SetViewportExtEx,hdc,Rect.right,Rect.bottom,NULL
invoke SetWindowExtEx,hdc,400,-80,NULL
invoke SetWindowOrgEx,hdc,0,0,NULL
RGB 0FFh,0,0
mov Color,eax
mov ecx,0
again:
invoke Sin,ecx,80
push ecx
invoke SetPixel,hdc,ecx,eax,Color
pop ecx
inc ecx
cmp ecx,360
jnz again
invoke SelectObject,hdc,oldhp
invoke ReleaseDC,hWnd,hdc
.elseif ax==IDM_EXIT
invoke DestroyWindow,hWnd
.endif
.elseif uMsg==WM_RBUTTONDOWN
invoke GetCursorPos,addr pt
invoke TrackPopupMenuEx,hPopupMenu,TPM_BOTTOMALIGN+TPM_RIGHTBUTTON,pt.x,pt.y,hWnd,NULL
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WndProc endp
MakeRect proc x1:dword,y1:dword,x2:dword,y2:dword
mov eax,Rect.right
sar eax,1
add eax,x1
push eax
pop NewRect.left
mov eax,Rect.bottom
sar eax,1
add eax,y1
push eax
pop NewRect.top
mov eax,Rect.right
sar eax,1
add eax,x2
push eax
pop NewRect.right
mov eax,Rect.bottom
sar eax,1
add eax,y2
push eax
pop NewRect.bottom
ret
MakeRect endp
Sin proc angle:dword,amplification:dword
local RetVal:dword
finit
fild angle
fldpi
fmul
fild base_180
fdivp st(1),st(0)
fsin
fild amplification
fmul
fist RetVal
mov eax,RetVal
ret
Sin endp
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -