📄 rbrect.asm
字号:
; RBrect.asm "Demonstrates a rubber-band rectangle"
; by Ron Thomas
; Ron_Thom@Compuserve.com 28/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 Rectangle. 'Press LH button and move mouse to make rectangle'",0
RectCoords STRUCT ; 2 pairs of DWORD coordinates (x,y), (8 bytes/pair)
corn1 POINT {} ; First diagonal corner
corn2 POINT {} ; Second "
RectCoords ENDS
coords RectCoords {}
hdc HDC ?
cxClient DD ?
cyClient DD ?
bluepen DD ? ; Pen handle
cornerset db ? ; Flag for first corner
.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 cornerset ; Do we have corner1 set ?
invoke GetDC, hWnd
mov hdc,eax
invoke GetStockObject, WHITE_PEN
invoke SelectObject, hdc, eax
call drawrectangle ; erase old rectangle
LOWORD lParam
mov coords.corn2.x,eax ; coords of diagonal corner
HIWORD lParam
mov coords.corn2.y,ebx ;
invoke SelectObject, hdc, bluepen
call drawrectangle ; make new rectangle visible
invoke ReleaseDC, hWnd, hdc
.ELSE
LOWORD lParam
mov coords.corn1.x,eax ; Set 1st corner coordinates
HIWORD lParam
mov coords.corn1.y ,ebx ;
mov cornerset,TRUE ; We have the 1st corner set
.ENDIF
.ENDIF
.ELSEIF eax==WM_CREATE
finit ; Initialise coprocessor
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 drawrectangle ; 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
drawrectangle PROC ; Use to erase/show the rubber-band rectangle
invoke MoveToEx, hdc, coords.corn1.x, coords.corn1.y, NULL ; Set 1st corner
invoke LineTo, hdc, coords.corn2.x, coords.corn1.y ; Draw line to 2nd
invoke LineTo, hdc, coords.corn2.x, coords.corn2.y ; Draw line to 3rd
invoke LineTo, hdc, coords.corn1.x, coords.corn2.y ; Draw line to 4th
invoke LineTo, hdc, coords.corn1.x, coords.corn1.y ; Draw line to 1st
ret
drawrectangle ENDP
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -