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

📄 cws2.asm

📁 win32asm IDE和masm32 sdk 打包
💻 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 + -