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

📄 xp.asm

📁 用ASM实现Server及sql操作
💻 ASM
📖 第 1 页 / 共 5 页
字号:
				mov TempRgn,eax
				invoke CombineRgn,CurRgn,CurRgn,TempRgn,RGN_DIFF
				invoke DeleteObject,TempRgn
			.endif
			inc edi
		.endw
		inc esi
		xor edi,edi
	.endw
	xor esi,esi
	mov edi,rct.right
	sub edi,5
	invoke SelectObject,hMemDC,hBmp2
	mov ebx,BMP_TITLE_WIDTH
	sub ebx,5
	.while esi <= 5
		.while edi <= rct.right
			invoke GetPixel,hMemDC,ebx,esi
			.if eax == tcol
				lea eax,[edi+1]
				lea ecx,[esi+1]
				invoke CreateRectRgn,edi,esi,eax,ecx
				mov TempRgn,eax
				invoke CombineRgn,CurRgn,CurRgn,TempRgn,RGN_DIFF
				invoke DeleteObject,TempRgn
			.endif
			inc edi
			inc ebx
		.endw
		inc esi
		mov edi,rct.right
		sub edi,5
		mov ebx,BMP_TITLE_WIDTH
		sub ebx,5
	.endw
	invoke SetWindowRgn,hWin,CurRgn,TRUE
	invoke DeleteObject,CurRgn
	invoke SelectObject,hMemDC,hBakBmp
	invoke DeleteDC,hMemDC
	invoke ReleaseDC,hWin,hdc
	ret
MakeRegion ENDP

; 向下移动子窗口,以适应XP风格的窗口
MoveSubWindowToDown	proc hWin:DWORD
	LOCAL rct:RECT
	invoke BeginDeferWindowPos,2
	.if eax != 0
		mov hdwp,eax
		invoke EnumChildWindows,hWin,addr EnumAndMoveChild,hdwp
		invoke EndDeferWindowPos,hdwp
		invoke GetWindowRect,hWin,addr rct
		invoke CalcWindowHighWidth,addr rct
		invoke GetSystemMetrics,SM_CYCAPTION
		xor eax,26
		add rct.bottom,eax
		invoke SetWindowPos,hWin,0,0,0,rct.right,rct.bottom,SWP_NOMOVE+SWP_NOZORDER+SWP_FRAMECHANGED
	.endif
	ret
MoveSubWindowToDown	endp


InitFloatTitleButton	proc hWin:DWORD,lpButtonID:DWORD,x:DWORD,y:DWORD,w:DWORD,h:DWORD
	LOCAL	@hWinTemp:DWORD
	szText szButtonClass,"STATIC"
	invoke CreateWindowEx,0,addr szButtonClass,0,WS_CHILD or WS_VISIBLE or SS_OWNERDRAW,
		x,y,w,h,hWin,lpButtonID,hInstance,NULL
	mov @hWinTemp,eax
	invoke SetWindowLong,@hWinTemp,GWL_WNDPROC,addr FloatButtonProc
	invoke SetWindowLong,@hWinTemp,GWL_USERDATA,eax
	mov eax,@hWinTemp
	ret
InitFloatTitleButton	endp
InitXpResource	proc
	invoke GetModuleHandle,NULL
	mov hInstance,eax
	invoke CreateSolidBrush,XPBKCOLOR
	mov hXpBrush,eax
	invoke LoadBitmap,hInstance,91
	mov hBmpTitleLeft,eax				; 标题栏左边图片
	invoke LoadBitmap,hInstance,92
	mov hBmpTitleRight,eax				; 标题栏右边图片
	invoke LoadBitmap,hInstance,93
	mov hBmpTitleCenter,eax				; 标题栏中间图片
	invoke LoadBitmap,hInstance,97
	mov hBmpCloseNoActive,eax			; 关闭按钮未激活状态
	invoke LoadBitmap,hInstance,98
	mov hBmpCloseActive,eax				; 关闭按钮激活状态
	invoke LoadBitmap,hInstance,99
	mov hBmpCloseDown,eax				; 关闭按钮按下状态

		invoke LoadBitmap,hInstance,90		; 最大化按钮禁用状态
		mov hBmpMaxDisable,eax
		invoke LoadBitmap,hInstance,94
		mov hBmpMinNoActive,eax				; 最小化按钮未激活状态
		invoke LoadBitmap,hInstance,95
		mov hBmpMinActive,eax				; 最小化按钮激活状态
		invoke LoadBitmap,hInstance,96
		mov hBmpMinDown,eax					; 最小化按钮按下状态

	invoke LoadBitmap,hInstance,31
	invoke SetBmpColor,eax,XPBKCOLOR,7,21
	mov hButtonBmpNoActive,eax			; 按钮未激活状态
	invoke LoadBitmap,hInstance,32
	invoke SetBmpColor,eax,XPBKCOLOR,7,21
	mov hButtonBmpSetFocus,eax			; 按钮有热点时状态
	invoke LoadBitmap,hInstance,33
	invoke SetBmpColor,eax,XPBKCOLOR,7,21
	mov hButtonBmpActive,eax			; 按钮激活时状态
	invoke LoadBitmap,hInstance,34
	invoke SetBmpColor,eax,XPBKCOLOR,7,21
	mov hButtonBmpDown,eax				; 按钮按下时状态
	invoke LoadBitmap,hInstance,35
	invoke SetBmpColor,eax,XPBKCOLOR,7,21
	mov hButtonBmpDisable,eax			; 按钮禁用时状态
	ret
InitXpResource	endp

; 设置透明位图
SetBmpColor proc hBitmap:DWORD,hColor:DWORD,x:DWORD,y:DWORD
    LOCAL mDC       :DWORD
    LOCAL hBrush    :DWORD
    LOCAL hOldBmp   :DWORD
    LOCAL hReturn   :DWORD
    LOCAL hOldBrush :DWORD
	dec x
	dec y
	invoke CreateCompatibleDC,NULL
	mov mDC,eax
	invoke SelectObject,mDC,hBitmap
	mov hOldBmp,eax
	invoke CreateSolidBrush,hColor
	mov hBrush,eax
	invoke SelectObject,mDC,hBrush
	mov hOldBrush,eax
	invoke GetPixel,mDC,0,0
	invoke ExtFloodFill,mDC,0,0,eax,FLOODFILLSURFACE
	invoke GetPixel,mDC,0,y
	invoke ExtFloodFill,mDC,0,y,eax,FLOODFILLSURFACE
	invoke GetPixel,mDC,x,0
	invoke ExtFloodFill,mDC,x,0,eax,FLOODFILLSURFACE
	invoke GetPixel,mDC,x,y
	invoke ExtFloodFill,mDC,x,y,eax,FLOODFILLSURFACE
	invoke SelectObject,mDC,hOldBrush
	invoke DeleteObject,hBrush
	invoke SelectObject,mDC,hOldBmp
	invoke DeleteDC,mDC
	mov eax,hBitmap
	ret
SetBmpColor endp
; 绘制标题按钮
DrawTitleButton	Proc lParam:DWORD
	LOCAL hMemDC:DWORD
	LOCAL hBakBmp:DWORD
	LOCAL lpDrawInfo	:DRAWITEMSTRUCT
	invoke MemCopy,lParam,addr lpDrawInfo,sizeof lpDrawInfo
	invoke CreateCompatibleDC,NULL
	mov hMemDC,eax
	.if lpDrawInfo.CtlID == SC_CLOSE
		mov eax,lpDrawInfo.hwndItem
		.if lpFloatButtonDown == 1 && lpFloatButtonWin == eax
			mov eax,hBmpCloseDown
		.else
			.if lpFloatButtonItalic == 1 && lpFloatButtonWin == eax
				mov eax,hBmpCloseActive
			.else
				mov eax,hBmpCloseNoActive
			.endif
		.endif
	.elseif lpDrawInfo.CtlID == SC_MAXIMIZE
		mov eax,hBmpMaxDisable
	.elseif lpDrawInfo.CtlID == SC_MINIMIZE
		mov eax,lpDrawInfo.hwndItem
		.if lpFloatButtonDown == 1 && lpFloatButtonWin == eax
			mov eax,hBmpMinDown
		.else
			.if lpFloatButtonItalic == 1 && lpFloatButtonWin == eax
				mov eax,hBmpMinActive
			.else
				mov eax,hBmpMinNoActive
			.endif
		.endif
	.endif
	invoke SelectObject,hMemDC,eax
	mov hBakBmp,eax
	invoke BitBlt,lpDrawInfo.hdc,lpDrawInfo.rcItem.left,lpDrawInfo.rcItem.top,lpDrawInfo.rcItem.right,lpDrawInfo.rcItem.bottom,hMemDC,0,0,SRCCOPY
	invoke SelectObject,hMemDC,hBakBmp
	invoke DeleteDC,hMemDC
	m2m eax,1
	ret
DrawTitleButton	endp

; 子类化浮动按钮
.data
lpFloatButtonItalic		db 0
lpFloatButtonDown		db 0
lpFloatButtonDraw		db 0
lpFloatButtonMove		db 0
lpFloatButtonSend		db 0
lpFloatButtonWin		dd 0
.code
FloatButtonProc	proc	hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
	LOCAL	hdc			:DWORD,hBakBlt:DWORD
	LOCAL	hMemDC		:DWORD,hButtonFont:DWORD,hBakFont:DWORD
	LOCAL	hBakBmp		:DWORD,hBakMode:DWORD,hTxtColor:DWORD
	LOCAL	rct			:RECT
	LOCAL	Ps			:PAINTSTRUCT
	LOCAL	TempBuffer	[MAX_PATH]:BYTE
	LOCAL	@stFont		:LOGFONT
	mov	eax,uMsg
	.if eax == WM_PAINT
		invoke IsWindowEnabled,hWin
		.if eax == FALSE	; 如果按钮是禁用状态,则绘制禁用状态,否则使用默认。
			invoke BeginPaint,hWin,addr Ps
			mov    hdc,eax
			invoke GetWindowText,hWin,addr TempBuffer,sizeof TempBuffer
			invoke GetClientRect,hWin,addr rct
			invoke GetBkMode,hdc
			mov hBakMode,eax
			invoke GetTextColor,hdc
			mov hTxtColor,eax
			invoke SetBkMode,hdc,TRANSPARENT
			invoke GetSysColor,COLOR_GRAYTEXT
			invoke SetTextColor,hdc,eax
			invoke CreateCompatibleDC,NULL
			mov hMemDC,eax
			invoke SelectObject,hMemDC,hButtonBmpDisable
			mov hBakBmp,eax

			invoke StretchBlt,hdc,0,0,3,3,hMemDC,0,0,3,3,SRCCOPY
			m2m rct.top,rct.bottom
			sub rct.top,3
			invoke StretchBlt,hdc,0,rct.top,3,3,hMemDC,0,18,3,3,SRCCOPY
			m2m rct.left,rct.right
			sub rct.left,3
			invoke StretchBlt,hdc,rct.left,0,3,3,hMemDC,4,0,3,3,SRCCOPY
			invoke StretchBlt,hdc,rct.left,rct.top,3,3,hMemDC,4,18,3,3,SRCCOPY
			invoke GetStretchBltMode,hdc
			mov hBakBlt,eax
			invoke SetStretchBltMode,hdc,STRETCH_ANDSCANS
			sub rct.left,3
			invoke StretchBlt,hdc,3,0,rct.left,3,hMemDC,3,0,1,3,SRCCOPY
			invoke StretchBlt,hdc,3,rct.top,rct.left,3,hMemDC,3,18,1,3,SRCCOPY
			sub rct.top,3
			invoke StretchBlt,hdc,0,3,3,rct.top,hMemDC,0,3,3,15,SRCCOPY
			add rct.left,3
			invoke StretchBlt,hdc,rct.left,3,3,rct.top,hMemDC,4,3,3,15,SRCCOPY
			sub rct.left,3
			invoke StretchBlt,hdc,3,3,rct.left,rct.top,hMemDC,3,3,1,15,SRCCOPY

			invoke SelectObject,hMemDC,hBakBmp
			invoke SetStretchBltMode,hdc,hBakBlt
			invoke DeleteDC,hMemDC
			invoke GetClientRect,hWin,addr rct
			invoke SendMessage,hWin,BM_GETIMAGE,IMAGE_ICON,0
			.if eax != 0
				mov ecx,rct.right
				sub ecx,rct.left
				sub ecx,32
				shr ecx,1
				mov edx,rct.bottom
				sub edx,rct.top
				sub edx,32
				shr edx,1
				invoke DrawState,hdc,0,0,eax,0,ecx,edx,32,32,DST_ICON or DSS_DISABLED
			.else
				invoke SendMessage,hWin,WM_GETTEXT,sizeof TempBuffer,addr TempBuffer
				.if eax != 0
					inc rct.top
					add rct.left,3
					invoke SendMessage,hWin,WM_GETFONT,0,0
					lea edx,@stFont
					invoke GetObject,eax,sizeof LOGFONT,edx
					invoke CreateFontIndirect,addr @stFont
					mov hButtonFont,eax
					invoke SelectObject,hdc,eax
					mov hBakFont,eax
					invoke DrawText,hdc,addr TempBuffer,-1,addr rct,DT_CENTER or DT_SINGLELINE or DT_VCENTER
					invoke SelectObject,hdc,hBakFont
					invoke DeleteObject,hButtonFont
				.endif
			.endif
			invoke SetTextColor,hdc,hTxtColor
			invoke SetBkMode,hdc,hBakMode
			invoke EndPaint,hWin,addr Ps
			xor eax,eax
			ret
		.endif
	.endif
	invoke UpdateFloatButton,hWin,uMsg,wParam,lParam
	ret
FloatButtonProc	endp
UpdateFloatButton	proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
	LOCAL hPoint		:POINT
	LOCAL TempBuffer	[MAX_PATH]:BYTE
	mov eax,uMsg
	.if	eax ==	WM_NCHITTEST
		m2m eax,1
		ret
	.elseif eax == WM_MOUSEMOVE
		invoke GetCursorPos,addr hPoint
		invoke WindowFromPoint,hPoint.x,hPoint.y
		.if eax != hWin
			.if wParam != MK_LBUTTON
				invoke ReleaseCapture
				mov lpFloatButtonMove,0
			.elseif lpFloatButtonMove == 0
				invoke ReleaseCapture
			.else
				invoke SetCapture,hWin
				mov lpFloatButtonSend,1
			.endif
			mov lpFloatButtonDown,0
			invoke PostMessage,hWin,WM_USER+100,lpFloatButtonWin,0
			mov lpFloatButtonDraw,0
			m2m lpFloatButtonWin,0
		.else
			.if lpFloatButtonMove == 1
				.if lpFloatButtonDraw == 0
					invoke PostMessage,hWin,WM_USER+101,hWin,1
					inc lpFloatButtonDraw
				.endif
				mov lpFloatButtonSend,1
			.elseif eax != lpFloatButtonWin
				.if lpFloatButtonWin != 0
					invoke PostMessage,hWin,WM_USER+100,lpFloatButtonWin,0
				.endif
				invoke PostMessage,hWin,WM_USER+100,hWin,1
			.endif
			invoke SetCapture,hWin
			m2m lpFloatButtonWin,hWin
		.endif
	.elseif eax == WM_LBUTTONUP
		mov lpFloatButtonItalic,0
		m2m lpFloatButtonWin,0
		mov lpFloatButtonDown,0
		invoke PostMessage,hWin,WM_MOUSEMOVE,0,0
		invoke GetCursorPos,addr hPoint
		invoke WindowFromPoint,hPoint.x,hPoint.y
		.if eax == hWin && lpFloatButtonMove == 1
			invoke GetClassName,hWin,addr TempBuffer,sizeof TempBuffer
			invoke lstrcmpi,addr TempBuffer,addr szButtonClass
			.if lpFloatButtonSend == 1 || eax == 0
				invoke GetDlgCtrlID,hWin
				push eax
				invoke GetParent,hWin
				pop ecx
				invoke PostMessage,eax,WM_COMMAND,ecx,0
			.endif
		.endif
		mov lpFloatButtonMove,0
		mov lpFloatButtonDraw,0
		mov lpFloatButtonSend,0
	.elseif eax == WM_LBUTTONDOWN
		mov lpFloatButtonMove,1
		mov lpFloatButtonDraw,0
		invoke PostMessage,hWin,WM_USER+101,hWin,1
	.elseif eax == WM_USER+101
		mov al,byte ptr lParam
		mov lpFloatButtonDown,al
		invoke RedrawWindow,wParam,0,0,RDW_INVALIDATE
		invoke UpdateWindow,hWin
	.elseif eax == WM_USER+100
		mov al,byte ptr lParam
		mov lpFloatButtonItalic,al
		invoke RedrawWindow,wParam,0,0,RDW_INVALIDATE
		invoke UpdateWindow,hWin
	.elseif eax == WM_SETTEXT || eax == WM_ENABLE	; 处理这两个消息以响应修改窗口文本或状态时重绘窗口
		invoke RedrawWindow,hWin,0,0,RDW_INVALIDATE
	.elseif eax == WM_CANCELMODE
		mov lpFloatButtonItalic,0
		mov lpFloatButtonDown,0
		mov lpFloatButtonDraw,0
		mov lpFloatButtonMove,0
		m2m lpFloatButtonWin,0
		invoke ReleaseCapture
		invoke DefWindowProc,hWin,uMsg,wParam,lParam
		ret
	.endif
	invoke	GetWindowLong,hWin,GWL_USERDATA
	invoke	CallWindowProc,eax,hWin,uMsg,wParam,lParam
	ret
UpdateFloatButton	endp

; 子类化位图按钮
ClassBmpButton	proc lpDlg:DWORD
	invoke SendMessage,lpDlg,BM_SETSTYLE,BS_OWNERDRAW,0
	invoke SetWindowLong,lpDlg,GWL_WNDPROC,addr FloatButtonProc
	invoke SetWindowLong,lpDlg,GWL_USERDATA,eax
	ret
ClassBmpButton	endp
; 绘制位图按钮
DrawBmpButton	proc lParam:DWORD
	LOCAL hMemDC:DWORD
	LOCAL hBakBmp:DWORD,hTxtColor:DWORD,hBakMode:DWORD,hBakBlt:DWORD
	LOCAL rct:RECT
	LOCAL lpDrawInfo:DRAWITEMSTRUCT
	LOCAL TempBuffer[MAX_PATH]:BYTE
	invoke MemCopy,lParam,addr lpDrawInfo,sizeof lpDrawInfo
	invoke GetBkMode,lpDrawInfo.hdc
	mov hBakMode,eax
	invoke GetTextColor,lpDrawInfo.hdc
	mov hTxtColor,eax
	invoke SetBkMode,lpDrawInfo.hdc,TRANSPARENT
	invoke CreateCompatibleDC,NULL
	mov hMemDC,eax
		invoke SetTextColor,lpDrawInfo.hdc,Black
		mov eax,lpDrawInfo.hwndItem
		.if lpFloatButtonDown == 1 && lpFloatButtonWin == eax
			mov eax,hButtonBmpDown
		.else
			.if lpFloatButtonItalic == 1 && lpFloatButtonWin == eax
				mov eax,hButtonBmpActive
			.else
				.if lpDrawInfo.itemState & ODS_FOCUS
					mov eax,hButtonBmpSetFocus
				.else
					mov eax,hButtonBmpNoActive
				.endif
			.endif
		.endif
		invoke SelectObject,hMemDC,eax
		mov hBakBmp,eax
		invoke MemCopy,addr lpDrawInfo.rcItem,addr rct,sizeof RECT
		invoke StretchBlt,lpDrawInfo.hdc,0,0,3,3,hMemDC,0,0,3,3,SRCCOPY
		m2m rct.top,rct.bottom
		sub rct.top,3
		invoke StretchBlt,lpDrawInfo.hdc,0,rct.top,3,3,hMemDC,0,18,3,3,SRCCOPY
		m2m rct.left,rct.right
		sub rct.left,3
		invoke StretchBlt,lpDrawInfo.hdc,rct.left,0,3,3,hMemDC,4,0,3,3,SRCCOPY

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -