📄 rbline.asm
字号:
; Rbline.asm "Demonstrates a rubber-band line"
; by Ron Thomas
; Ron_Thom@Compuserve.com 27/5/99
;---------------------------------------------
.386 ; 32 bit when .386 appears before .MODEL
.MODEL FLAT,STDCALL
include windows.inc
include user32.inc
include kernel32.inc
include gdi32.inc
includelib user32.lib
includelib kernel32.lib
includelib gdi32.lib
WinMain PROTO :DWORD, :DWORD, :DWORD, :SDWORD
.data
ClassName db "SimpleWinClass",0
AppName db "Rubber-Band Line. 'Press LH button and hold down to make line'",0
LineCoords STRUCT ; 2 pairs of DWORD coordinates (x,y), (8 bytes/pair)
Spt POINT {} ; Line start point X1,Y1
Ept POINT {} ; Line end point X2,Y2
LineCoords ENDS
coords LineCoords {}
hdc HDC ?
cxClient DD ?
cyClient DD ?
bluepen DD ? ; Pen handle
startset db ? ; Flag for line's start point
.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
LOWORD MACRO bigword ;; Retrieves the low word from double word argument
mov eax,bigword
and eax,0FFFFh ;; Set to low word
ENDM
HIWORD MACRO bigword ;; Retrieves the high word from double word argument
mov ebx,bigword
shr ebx,16 ;; Shift 16 for high word to set to high word
ENDM
;----------------------------------------------------------------------------
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:SDWORD
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,0
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
hInst,NULL
mov hwnd,eax
INVOKE ShowWindow, hwnd,SW_SHOWNORMAL
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 uses ebx, hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL ps:PAINTSTRUCT
mov eax,uMsg
.IF eax==WM_MOUSEMOVE
jmp fallthr ; Fall through
.ELSEIF eax==WM_LBUTTONDOWN
fallthr:
.IF wParam & MK_LBUTTON ; If LH Button down
.IF startset ; Do we have the start point yet ?
invoke GetDC, hWnd
mov hdc,eax
invoke GetStockObject, WHITE_PEN
invoke SelectObject, hdc, eax
call drawline ; erase old line
LOWORD lParam
mov coords.Ept.x,eax ; Get X2 coord
HIWORD lParam
mov coords.Ept.y,ebx ; Get Y2 coord
invoke SelectObject, hdc, bluepen
call drawline ; make new line visible
invoke ReleaseDC, hWnd, hdc
.ELSE
LOWORD lParam
mov coords.Spt.x,eax ; Set line start point X1,Y1
HIWORD lParam
mov coords.Spt.y,ebx
mov startset,TRUE ; Flag we have start point
.ENDIF
.ENDIF
.ELSEIF eax==WM_CREATE
invoke CreatePen, PS_SOLID, 1, 0FF0000h ; Solid, thin & blue
mov bluepen,eax
.ELSEIF eax==WM_SIZE
LOWORD lParam
mov cxClient,eax
HIWORD lParam
mov cyClient,ebx
.ELSEIF eax==WM_PAINT
invoke InvalidateRect, hWnd, NULL, TRUE
invoke BeginPaint,hWnd, ADDR ps
mov hdc,eax
invoke SelectObject, hdc, bluepen
call drawline ; Repaint if resized
invoke EndPaint,hWnd, ADDR ps
.ELSEIF eax==WM_DESTROY
invoke DeleteObject, bluepen
invoke PostQuitMessage,NULL
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
drawline PROC ; Use to erase/show the rubber-band line
invoke MoveToEx, hdc, coords.Spt.x, coords.Spt.y, NULL ; Set start point
invoke LineTo, hdc, coords.Ept.x, coords.Ept.y ; Draw line to end point
ret
drawline ENDP
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -