📄 graphic.inc
字号:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Programmed by 罗云彬, bigluo@telekbird.com.cn
; Website: http://asm.yeah.net
; LuoYunBin's Win32 ASM page (罗云彬的编程乐园)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 公用子程序部分:图形部分
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
;
;
;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_SetWindowShape proto :dword,:dword ;设置窗口形状为BMP图形形状
_CreateMask proto :dword,:dword,:dword ;把 DC 中的图形变成 MASK
_ScanRect proto :dword,:dword,:dword,:dword,:dword ; 在 BitMap 中查找一个相同颜色的区域
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
;
;
;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 设置窗口形状为BMP图形形状
; 参数:窗口句柄,BMP图形句柄
; 输入BMP图形要求:0,0处颜色为背景色
; 返回 eax == TRUE 为成功,eax == FALSE 为失败
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_SetWindowShape proc hWnd,hBitMap
local @hDC,@hBmpDC
local @stRect:RECT
local @stBmp:BITMAP
local @dwX,@dwY,@dwStartX
local @hRgn,@rgbBack,@dwCount
pushad
;********************************************************************
; 如果句柄无效,则返回
;********************************************************************
invoke GetObject,hBitMap,sizeof BITMAP,addr @stBmp
.if eax == 0
popad
xor eax,eax
ret
.endif
mov @dwCount,0
invoke GetWindowRect,hWnd,addr @stRect
invoke ShowWindow,hWnd,SW_HIDE
invoke MoveWindow,hWnd,@stRect.left,@stRect.top,\
@stBmp.bmWidth,@stBmp.bmHeight,FALSE
invoke GetDC,hWnd
mov @hDC,eax
invoke CreateCompatibleDC,@hDC
mov @hBmpDC,eax
invoke SelectObject,@hBmpDC,hBitMap
;********************************************************************
; 计算窗口形状
;********************************************************************
invoke GetPixel,@hBmpDC,0,0
mov @rgbBack,eax
invoke CreateRectRgn,0,0,0,0
mov @hRgn,eax
mov @dwY,0
.repeat
mov @dwX,0
mov @dwStartX,-1
.repeat
invoke GetPixel,@hBmpDC,@dwX,@dwY
.if @dwStartX == -1
.if eax != @rgbBack
;********************************************************************
; 记录第一个非背景色的位置
;********************************************************************
mov eax,@dwX
mov @dwStartX,eax
.endif
.else
.if eax == @rgbBack
;********************************************************************
; 本行中已经有非背景色又遇到背景色,添加 Rgn
;********************************************************************
mov ecx,@dwY
inc ecx
invoke CreateRectRgn,@dwStartX,@dwY,@dwX,ecx
push eax
invoke CombineRgn,@hRgn,@hRgn,eax,RGN_OR
pop eax
invoke DeleteObject,eax
inc @dwCount
mov @dwStartX,-1
.else
;********************************************************************
; 本行中已经有非背景色且到行尾,添加 Rgn
;********************************************************************
mov eax,@dwX
.if eax == @stBmp.bmWidth
inc eax
mov ecx,@dwY
inc ecx
invoke CreateRectRgn,@dwStartX,@dwY,eax,ecx
push eax
invoke CombineRgn,@hRgn,@hRgn,eax,RGN_OR
pop eax
invoke DeleteObject,eax
inc @dwCount
mov @dwStartX,-1
.endif
.endif
.endif
inc @dwX
mov eax,@dwX
.until eax > @stBmp.bmWidth
inc @dwY
mov eax,@dwY
.until eax > @stBmp.bmHeight
;********************************************************************
; 将窗口设置为图片的形状画图
;********************************************************************
.if @dwCount
invoke SetWindowRgn,hWnd,@hRgn,TRUE
.endif
invoke DeleteObject,@hRgn
invoke BitBlt,@hDC,0,0,@stBmp.bmWidth,@stBmp.bmHeight,\
@hBmpDC,0,0,SRCCOPY
;********************************************************************
invoke DeleteDC,@hBmpDC
invoke ReleaseDC,hWnd,@hDC
invoke InvalidateRect,hWnd,NULL,-1
popad
mov eax,TRUE
ret
_SetWindowShape endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 把 DC 中的图形变成 MASK(和 0,0 处相同的设为黑,不同的设置为白)
; 参数:DC句柄
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_CreateMask proc _hDcDest,_dwWidth,_dwHeight
local @dwX,@dwY,@rgbBack
pushad
invoke GetPixel,_hDcDest,0,0
mov @rgbBack,eax
mov @dwY,0
.while TRUE
mov @dwX,0
.while TRUE
invoke GetPixel,_hDcDest,@dwX,@dwY
.if eax == @rgbBack
invoke SetPixel,_hDcDest,@dwX,@dwY,0
.else
invoke SetPixel,_hDcDest,@dwX,@dwY,0ffffffh
.endif
inc @dwX
mov eax,@dwX
.break .if eax > _dwWidth
.endw
inc @dwY
mov eax,@dwY
.break .if eax > _dwHeight
.endw
popad
ret
_CreateMask endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 在 BitMap 中查找一个相同颜色的区域
; 输入:位图句柄,区域宽度,区域高度,关键颜色
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ScanRect proc _hWnd,_hBmp,_dwWidth,_dwHeight,_rgbKeyColor
local @hBmpDC,@stBmp:BITMAP
local @dwReturn
local @dwNowX,@dwNowY,@dwEndX,@dwEndY
pushad
mov @dwReturn,-1
;********************************************************************
; 检查参数合法性
;********************************************************************
.if _dwWidth >= 10000h || _dwHeight >= 10000h
jmp _SR_Quit
.endif
.if _dwWidth == 0 || _dwHeight == 0
jmp _SR_Quit
.endif
invoke GetObject,_hBmp,sizeof BITMAP,addr @stBmp
.if ! eax
jmp _SR_Quit
.endif
mov eax,@stBmp.bmWidth
mov ebx,@stBmp.bmHeight
.if eax >= 10000h || ebx >= 10000h
jmp _SR_Quit
.endif
.if eax <= _dwWidth || ebx <= _dwHeight
jmp _SR_Quit
.endif
;********************************************************************
; 建立临时 DC
;********************************************************************
invoke GetDC,_hWnd
push eax
invoke CreateCompatibleDC,eax
mov @hBmpDC,eax
invoke SelectObject,@hBmpDC,_hBmp
pop eax
invoke ReleaseDC,_hWnd,eax
;********************************************************************
xor esi,esi
xor edi,edi
.repeat
.repeat
invoke GetPixel,@hBmpDC,esi,edi
.if eax == _rgbKeyColor
;********************************************************************
; 如果有一个点颜色符合,则比较整个指定区域的点
;********************************************************************
pushad
mov eax,esi
add eax,_dwWidth
mov @dwEndX,eax
mov eax,edi
add eax,_dwHeight
mov @dwEndY,eax
mov @dwNowX,esi
mov @dwNowY,edi
.repeat
.repeat
invoke GetPixel,@hBmpDC,esi,edi
.if eax != _rgbKeyColor
popad
mov eax,-1
jmp @F
.endif
inc esi
.until esi == @dwEndX
mov esi,@dwNowX
inc edi
.until edi == @dwEndY
popad
.endif
;********************************************************************
; 整个区域的点符合,则保存位置
;********************************************************************
@@:
.if eax == _rgbKeyColor
shl esi,16
mov @dwReturn,esi
add @dwReturn,edi
jmp @F
.endif
inc esi
.until esi == @stBmp.bmWidth
xor esi,esi
inc edi
.until edi == @stBmp.bmHeight
@@:
;********************************************************************
; 释放临时 DC
;********************************************************************
invoke DeleteDC,@hBmpDC
_SR_Quit:
popad
mov eax,@dwReturn
ret
_ScanRect endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -