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

📄 graphic.inc

📁 月下情人 汇编程序写的 并运行成功
💻 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 + -