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

📄 rbline.asm

📁 拖动鼠标画线
💻 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 + -