📄 cws2.asm
字号:
; =======================================
; CUSTOM WINDOWS SHAPE without extern
; region data, this version should be
; more flexible i think...
; oh before i forget, this's by mob but
; anyway, write to drcmda@gmx.de :)
; =======================================
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
MakeRegion proto :DWORD, :DWORD, :DWORD
.DATA
ClassName db "cws_class",0
DisplayName db "custom windows shape",0
Text db "good bye...",0
ButtonClassName db "button",0
ButtonText db "Click Me!",0
.DATA?
hInstance dd ?
hBitmap dd ?
hwndButton dd ?
.CONST
BitmapID equ 1000
ButtonID equ 1001
PictureW equ 300
PictureH equ 300
.CODE
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke WinMain, hInstance,NULL,NULL, SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain PROC hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,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
push hInstance
pop wc.hInstance
mov wc.hbrBackground,NULL
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
mov wc.hIcon,NULL
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_CROSS
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
invoke GetSystemMetrics,SM_CXSCREEN
shr eax,1
sub eax,PictureW/2
push eax
invoke GetSystemMetrics,SM_CYSCREEN
shr eax,1
sub eax,PictureH/2
pop ebx
INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR ClassName,\
WS_POPUP,ebx,eax,PictureW,PictureH,NULL,
NULL,hInst,NULL
mov hwnd,eax
invoke ShowWindow, hwnd,SW_SHOWNORMAL
invoke UpdateWindow, hwnd
_Start:
invoke GetMessage,ADDR msg,NULL,0,0
test eax, eax
jz _Exit
invoke TranslateMessage,ADDR msg
invoke DispatchMessage,ADDR msg
jmp _Start
_Exit:
mov eax,msg.wParam
ret
WinMain ENDP
WndProc PROC hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
LOCAL ps:PAINTSTRUCT
LOCAL hdc:HDC
LOCAL hMemDC:HDC
LOCAL rect:RECT
LOCAL myDC:HDC
LOCAL point:RECT
.IF uMsg == WM_CREATE
invoke LoadBitmap,hInstance,BitmapID
mov hBitmap,eax
invoke GetWindowDC,hWnd
mov hdc,eax
invoke CreateCompatibleDC,NULL
mov hMemDC,eax
invoke SelectObject,hMemDC,hBitmap
invoke GetClientRect,hWnd,ADDR rect
invoke MakeRegion,hMemDC,rect.right,rect.bottom
invoke SetWindowRgn,hWnd,eax,TRUE
invoke ReleaseDC,hWnd,hdc
invoke DeleteDC,hMemDC
; --> CREATE A SIMPLE BUTTON
invoke CreateWindowEx,NULL, ADDR ButtonClassName,ADDR ButtonText,\
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
150,185,100,25,hWnd,ButtonID,hInstance,NULL
mov hwndButton,eax
.ELSEIF uMsg == WM_PAINT
invoke GetClientRect,hWnd,addr rect
invoke BeginPaint,hWnd,addr ps
mov hdc,eax
invoke CreateCompatibleDC,NULL
mov hMemDC,eax
invoke SelectObject,hMemDC,hBitmap
invoke BitBlt,hdc,0,0,rect.right,rect.bottom,hMemDC,0,0,SRCCOPY
invoke DeleteDC,hMemDC
invoke EndPaint,hWnd,addr ps
.ELSEIF uMsg == WM_COMMAND
mov eax,wParam
.IF ax == ButtonID
invoke MessageBox,hWnd,addr Text,addr DisplayName,MB_OK
invoke SendMessage,hWnd,WM_DESTROY,NULL,NULL
.ENDIF
.ELSEIF uMsg == WM_DESTROY
invoke DeleteObject,hBitmap
invoke PostQuitMessage,NULL
xor eax,eax
ret
.ELSEIF uMsg == WM_LBUTTONDOWN
invoke SendMessage,hWnd,WM_NCLBUTTONDOWN, HTCAPTION,0
.ENDIF
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
WndProc endp
MakeRegion PROC USES ESI EDI EBX _hdc:HDC, _wdt:DWORD, _hgt:DWORD
LOCAL flag: DWORD
LOCAL frun: DWORD
LOCAL d_dc: DWORD
LOCAL f_dc: DWORD
LOCAL oldx: DWORD
LOCAL tcol: DWORD
mov flag,FALSE
mov frun,TRUE
mov oldx,0
xor edi,edi
xor esi,esi
invoke GetPixel,_hdc,0,0
mov tcol,eax
_xloop: invoke GetPixel,_hdc,edi,esi
cmp eax,tcol
jz _letsgo
cmp edi,_wdt
jnz _foundone
_letsgo:
cmp flag,TRUE
jnz _nextone
mov flag,FALSE
mov eax,esi
inc eax
invoke CreateRectRgn,ebx,esi,edi,eax
mov d_dc,eax
cmp frun,TRUE
jnz _nofrun
mov frun,FALSE
push d_dc
pop f_dc
jmp _nextone
_nofrun:
invoke CombineRgn,f_dc,f_dc,d_dc,RGN_OR
invoke DeleteObject,d_dc
jmp _nextone
_foundone:
cmp flag,FALSE
jnz _nextone
mov flag,TRUE
mov ebx,edi
_nextone:
inc edi
cmp edi,_wdt
jbe _xloop
xor edi,edi
inc esi
cmp esi,_hgt
jb _xloop
_exit: mov eax,f_dc
ret
MakeRegion ENDP
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -