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

📄 xp.asm

📁 用ASM实现Server及sql操作
💻 ASM
📖 第 1 页 / 共 5 页
字号:
		invoke StretchBlt,lpDrawInfo.hdc,rct.left,rct.top,3,3,hMemDC,4,18,3,3,SRCCOPY
		invoke GetStretchBltMode,lpDrawInfo.hdc
		mov hBakBlt,eax
		invoke SetStretchBltMode,lpDrawInfo.hdc,STRETCH_ANDSCANS
		sub rct.left,3
		invoke StretchBlt,lpDrawInfo.hdc,3,0,rct.left,3,hMemDC,3,0,1,3,SRCCOPY
		invoke StretchBlt,lpDrawInfo.hdc,3,rct.top,rct.left,3,hMemDC,3,18,1,3,SRCCOPY
		sub rct.top,3
		invoke StretchBlt,lpDrawInfo.hdc,0,3,3,rct.top,hMemDC,0,3,3,15,SRCCOPY
		add rct.left,3
		invoke StretchBlt,lpDrawInfo.hdc,rct.left,3,3,rct.top,hMemDC,4,3,3,15,SRCCOPY
		sub rct.left,3
		invoke StretchBlt,lpDrawInfo.hdc,3,3,rct.left,rct.top,hMemDC,3,3,1,15,SRCCOPY
		invoke SelectObject,hMemDC,hBakBmp
		invoke SetStretchBltMode,lpDrawInfo.hdc,hBakBlt
		invoke DeleteDC,hMemDC
	invoke MemCopy,addr lpDrawInfo.rcItem,addr rct,sizeof RECT
	invoke SendMessage,lpDrawInfo.hwndItem,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
		push eax
		mov eax,lpDrawInfo.hwndItem
		.if lpFloatButtonDown == 1 && lpFloatButtonWin == eax
			inc edx
			inc ecx
		.endif
		pop eax
		invoke DrawIcon,lpDrawInfo.hdc,ecx,edx,eax
	.else
		invoke SendMessage,lpDrawInfo.hwndItem,WM_GETTEXT,sizeof TempBuffer,addr TempBuffer
		.if eax != 0
			inc rct.top
			add rct.left,3
			invoke DrawText,lpDrawInfo.hdc,addr TempBuffer,-1,addr rct,DT_CENTER or DT_SINGLELINE or DT_VCENTER
		.endif
	.endif
	invoke SetTextColor,lpDrawInfo.hdc,hTxtColor
	invoke SetBkMode,lpDrawInfo.hdc,hBakMode
	m2m eax,1
	ret
DrawBmpButton	endp

; 按指定的颜色绘制边框
DrawRectEdge	proc hdc:DWORD,rect:DWORD,lpColor:DWORD,lpLeft:DWORD
	LOCAL hBakColor:DWORD
	LOCAL rct:RECT
	invoke GetBkColor,hdc
	mov hBakColor,eax
	invoke SetBkColor,hdc,lpColor
	invoke MemCopy,rect,addr rct,sizeof RECT
	push rct.bottom
	push rct.bottom
	m2m rct.bottom,rct.top
	inc rct.bottom
	invoke ExtTextOut,hdc,0,0,ETO_OPAQUE,addr rct,0,0,0
	pop rct.top
	pop rct.bottom
	dec rct.top
	invoke ExtTextOut,hdc,0,0,ETO_OPAQUE,addr rct,0,0,0
	invoke MemCopy,rect,addr rct,sizeof RECT
	push rct.right
	push rct.right
	.if lpLeft != 0
		m2m rct.right,rct.left
		inc rct.right
		invoke ExtTextOut,hdc,0,0,ETO_OPAQUE,addr rct,0,0,0
	.endif
	pop rct.left
	pop rct.right
	.if lpLeft != 2
		dec rct.left
		invoke ExtTextOut,hdc,0,0,ETO_OPAQUE,addr rct,0,0,0
	.endif
	invoke SetBkColor,hdc,hBakColor
	ret
DrawRectEdge	endp
; 根据窗口范围计算窗口高度
CalcWindowHighWidth	proc	rct:DWORD
	mov eax,rct
	mov ecx,[eax.RECT].top
	sub [eax.RECT].bottom,ecx
	mov ecx,[eax.RECT].left
	sub [eax.RECT].right,ecx
	ret
CalcWindowHighWidth	endp

.data
hEnumChildWin	dd 0
.code
EnumAndMoveChild	proc	hCtl:DWORD,lParam:DWORD
	LOCAL hWin:DWORD,hDlg:DWORD
	LOCAL rct:RECT
	LOCAL ClassBuffer[100]:BYTE
	mov eax,hCtl
	.if eax == hEnumChildWin
		m2m eax,1
		ret
	.endif
	mov hEnumChildWin,eax
	invoke GetClassName,hCtl,addr ClassBuffer,sizeof ClassBuffer
	invoke lstrcmpi,addr ClassBuffer,STEXT('SysHeader32')
	.if eax != 0
		invoke GetParent,hCtl
		mov hWin,eax
		invoke GetWindowRect,hCtl,addr rct
		invoke MapWindowPoints,HWND_DESKTOP,hWin,addr rct,2
		invoke CalcWindowHighWidth,addr rct
		add rct.top,BMP_TITLE_HEIGHT
		add rct.left,3
		invoke MoveWindow,hCtl,rct.left,rct.top,rct.right,rct.bottom,FALSE
	.else
		invoke ClassesWinProc,hCtl,addr DrawSysList32Head
	.endif
	invoke lstrcmpi,addr ClassBuffer,STEXT('BUTTON')
	.if eax == 0
		invoke GetWindowLong,hCtl,GWL_STYLE
		and al,0fh
		.if al == BS_GROUPBOX
			invoke ClassesWinProc,hCtl,addr DrawGroupBox
		.elseif al == BS_PUSHBUTTON || al == BS_DEFPUSHBUTTON
			invoke SendMessage,hCtl,BM_SETSTYLE,BS_OWNERDRAW,0
			invoke ClassesWinProc,hCtl,addr FloatButtonProc
		.elseif al == BS_AUTOCHECKBOX || al == BS_AUTORADIOBUTTON
			invoke ClassesWinProc,hCtl,addr DrawCheckButton
		.endif
	.else
		invoke lstrcmpi,addr ClassBuffer,STEXT('ComboBox')
		.if eax == 0
			invoke ClassesWinProc,hCtl,addr DrawComboBoxItem
		.else
			invoke lstrcmpi,addr ClassBuffer,STEXT('msctls_updown32')
			.if eax == 0
				invoke ClassesWinProc,hCtl,addr DrawUdmItem
			.else
				invoke lstrcmpi,addr ClassBuffer,STEXT('Static')
				.if eax == 0
					invoke GetWindowLong,hCtl,GWL_STYLE
					.if eax & SS_NOPREFIX
						;and eax,not SS_NOPREFIX
						;invoke SetWindowLong,hCtl,GWL_STYLE,eax
						invoke ClassesWinProc,hCtl,addr HyperLinkProc
					.endif
				.else
					invoke lstrcmpi,addr ClassBuffer,STEXT('EDIT')
					.if eax == 0
						invoke GetWindowLong,hCtl,GWL_EXSTYLE
						and eax,not (WS_EX_STATICEDGE or WS_EX_DLGMODALFRAME or WS_EX_OVERLAPPEDWINDOW)
						invoke SetWindowLong,hCtl,GWL_EXSTYLE,eax
						invoke GetWindowLong,hCtl,GWL_STYLE
						.if eax & ES_READONLY
							invoke ClassesWinProc,hCtl,addr DrawReadOnlyEdit
						.else
							invoke ClassesWinProc,hCtl,addr DrawReadWriteEdit
						.endif
						invoke GetWindow,hCtl,GW_HWNDNEXT
						.if eax != 0
							mov hDlg,eax
							invoke GetClassName,hDlg,addr ClassBuffer,sizeof ClassBuffer
							invoke lstrcmpi,addr ClassBuffer,STEXT('msctls_updown32')
							.if eax == 0
								invoke GetWindowLong,hDlg,GWL_STYLE
								.if eax & UDS_AUTOBUDDY
									invoke GetWindowRect,hCtl,addr rct
									mov eax,rct.left
									sub rct.right,eax
									m2m rct.bottom,15
									invoke SetWindowPos,hCtl,0,0,0,rct.right,rct.bottom,SWP_NOMOVE+SWP_NOZORDER+SWP_FRAMECHANGED ;+SWP_NOSIZE
									invoke GetWindowRect,hDlg,addr rct
									invoke MapWindowPoints,HWND_DESKTOP,hWin,addr rct,2
									invoke CalcWindowHighWidth,addr rct
									dec rct.top
									m2m rct.bottom,17
									invoke MoveWindow,hDlg,rct.left,rct.top,rct.right,rct.bottom,FALSE
								.else
									invoke SetWindowPos,hCtl,0,0,0,0,0,SWP_NOMOVE+SWP_NOZORDER+SWP_FRAMECHANGED+SWP_NOSIZE
								.endif
							.else
								invoke SetWindowPos,hCtl,0,0,0,0,0,SWP_NOMOVE+SWP_NOZORDER+SWP_FRAMECHANGED+SWP_NOSIZE
							.endif
						.else
							invoke SetWindowPos,hCtl,0,0,0,0,0,SWP_NOMOVE+SWP_NOZORDER+SWP_FRAMECHANGED+SWP_NOSIZE
						.endif
					.else
						invoke lstrcmpi,addr ClassBuffer,STEXT('msctls_progress32')
						.if eax == 0
							invoke GetWindowLong,hCtl,GWL_EXSTYLE
							and eax,not (WS_EX_STATICEDGE or WS_EX_DLGMODALFRAME or WS_EX_OVERLAPPEDWINDOW)
							invoke SetWindowLong,hCtl,GWL_EXSTYLE,eax
							invoke ClassesWinProc,hCtl,addr DrawProgressBar
						.else
							invoke lstrcmpi,addr ClassBuffer,STEXT('SysListView32')
							.if eax == 0
								invoke GetWindowLong,hCtl,GWL_EXSTYLE
								and eax,not (WS_EX_STATICEDGE or WS_EX_DLGMODALFRAME or WS_EX_OVERLAPPEDWINDOW)
								invoke SetWindowLong,hCtl,GWL_EXSTYLE,eax
								invoke SetWindowPos,hCtl,0,0,0,0,0,SWP_NOMOVE+SWP_NOZORDER+SWP_FRAMECHANGED+SWP_NOSIZE
							.endif
						.endif
					.endif
				.endif
			.endif
		.endif
	.endif
	m2m eax,1
	ret
EnumAndMoveChild	endp
; 显示子窗口中左键弹出的系统菜单
ClickSubSystemMenu	proc hWin:DWORD,lParam:DWORD
	LOCAL rct		:RECT
	invoke GetWindowIcon,hWin
	mov edx,eax
	lea eax,lParam
	.if dword ptr [eax] == VK_SPACE || ([eax.POINTS].y > 6 && [eax.POINTS].y < 22 && [eax.POINTS].x > 6 && [eax.POINTS].x < 22 && edx != 0)
		invoke GetWindowRect,hWin,addr rct
		add rct.left,3
		add rct.top,BMP_TITLE_HEIGHT
		invoke GetSystemMenu,hWin,0
		invoke TrackPopupMenu,eax,TPM_LEFTALIGN,rct.left,rct.top,0,hWin,0
		m2m eax,1
	.elseif [eax.POINTS].y < 30
		invoke SendMessage,hWin,WM_NCLBUTTONDOWN,HTCAPTION,0
	.else
		xor eax,eax
	.endif
	ret
ClickSubSystemMenu	endp

; 绘制组框
DrawGroupBox	proc uses esi edi ebx,hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
	LOCAL hGroupFont:DWORD
	LOCAL hBakFont	:DWORD,hBakColor:DWORD,hTxtColor:DWORD
	LOCAL hTxtWidth	:DWORD
	LOCAL hdc		:DWORD
	LOCAL rect		:RECT
	LOCAL Ps		:PAINTSTRUCT
	LOCAL @stFont	:LOGFONT
	LOCAL TempBuffer[MAX_PATH]:BYTE
	mov eax,uMsg
	.if eax == WM_PAINT
		invoke GetClientRect,hWin,addr rect
		invoke BeginPaint,hWin,addr Ps
		mov hdc,eax
		add rect.top,5								; 绘制边框
		invoke DrawRoundRect,hdc,addr rect,XPGROUPCOLOR
		invoke GetWindowText,hWin,addr TempBuffer,sizeof TempBuffer
		.if eax != 0
			imul eax,eax,6
			mov hTxtWidth,eax
			invoke GetWindowLong,hWin,GWL_STYLE
			and eax,BS_CENTER
			.if eax == BS_CENTER		; 组框文本居中
				mov eax,rect.right
				sub eax,rect.left
				sub eax,hTxtWidth
				xor edx,edx
				m2m ecx,2
				div ecx
			.elseif eax == BS_RIGHT		; 组框文本居右
				mov eax,rect.right
				sub eax,hTxtWidth
				sub eax,8
			.else							; 组框文本居左
				mov eax,rect.left
				add eax,8
			.endif
			mov rect.left,eax
			add eax,hTxtWidth
			mov rect.right,eax
			push rect.top
			sub rect.top,6
			pop rect.bottom
			add rect.bottom,6
			invoke GetBkColor,hdc
			mov hBakColor,eax
			invoke GetTextColor,hdc
			mov hTxtColor,eax
			invoke SetBkColor,hdc,XPBKCOLOR
			invoke InflateRect,addr rect,2,0
			invoke ExtTextOut,hdc,0,0,ETO_OPAQUE,addr rect,0,0,0	; 将要绘制文本处的背景填充成XP背景色
			invoke InflateRect,addr rect,-2,0
			invoke SetTextColor,hdc,0d54600h
			invoke SendMessage,hWin,WM_GETFONT,0,0
			mov	hGroupFont,eax
			invoke GetObject,hGroupFont,sizeof LOGFONT,addr @stFont
			invoke CreateFontIndirect,addr @stFont
			mov hGroupFont,eax
			invoke SelectObject,hdc,hGroupFont
			mov hBakFont,eax				; 绘制文本
			invoke DrawText,hdc,addr TempBuffer,-1,addr rect,DT_SINGLELINE
			invoke SelectObject,hdc,hBakFont
			invoke DeleteObject,hGroupFont
			invoke SetTextColor,hdc,hTxtColor
			invoke SetBkColor,hdc,hBakColor
		.endif
		invoke EndPaint,hWin,addr Ps
		xor eax,eax
		ret
	.endif
	invoke GetWindowLong,hWin,GWL_USERDATA
	invoke CallWindowProc,eax,hWin,uMsg,wParam,lParam
	ret
DrawGroupBox	endp

; 右键弹出的控制菜单(可编辑)
DrawReadWriteEdit	proc uses esi edi ebx,hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
	mov eax,uMsg
	.if eax == WM_COMMAND
		invoke ControlCommand,hWin,wParam
		ret
	.elseif eax == WM_CONTEXTMENU
		invoke ControlMenu,hWin
		ret
	.elseif eax == WM_DRAWITEM
		mov eax,lParam
		.if [eax.DRAWITEMSTRUCT].CtlType == ODT_MENU
			invoke DrawMenuItem,lParam		; 绘制菜单
		.endif
		ret
	.elseif eax == WM_MEASUREITEM
		invoke ModifyXPMenu,hWin,lParam	; 设置菜单高度和宽度
		ret
	.elseif eax == EM_SETREADONLY
		.if wParam == TRUE
			invoke SetWindowLong,hWin,GWL_WNDPROC,addr DrawReadOnlyEdit
		.endif
	.endif
	invoke GetWindowLong,hWin,GWL_USERDATA
	invoke CallWindowProc,eax,hWin,uMsg,wParam,lParam
	ret
DrawReadWriteEdit	endp

; 接收系统命令
ControlCommand	proc hWin:DWORD,wParam
	mov eax,wParam
	.if eax == EM_SETSEL
		invoke SendMessage,hWin,EM_SETSEL,0,-1
	.elseif eax == WM_UNDO || eax == WM_CUT || eax == WM_COPY || eax == WM_PASTE || eax == WM_CLEAR
		invoke SendMessage,hWin,eax,0,0
	.endif
	m2m eax,1
	ret
ControlCommand	endp
; 窗口子类化
SubClassesWinProc	proc lpWin:DWORD,lpDlg:DWORD,lpAddr:DWORD
	LOCAL hDlg:DWORD
	invoke GetDlgItem,lpWin,lpDlg						; 获取窗口句柄。
	.if eax != 0
		mov hDlg,eax
		invoke SetWindowLong,hDlg,GWL_WNDPROC,lpAddr	; 设置窗口过程
		invoke SetWindowLong,hDlg,GWL_USERDATA,eax
	.endif
	ret
SubClassesWinProc	endp

; 绘制菜单
DrawMenuItem	proc uses esi edi ebx,lParam:DWORD
	LOCAL	hMenuFont	:DWORD,hCyleFont:DWORD,hBkFont:DWORD
	LOCAL	hBakFont	:DWORD,hBakMode:DWORD,hBakColor:DWORD,hTxtColor:DWORD
	LOCAL	hMenuIcon	:DWORD
	LOCAL	hBrush		:DWORD
	LOCAL	hBFont		:DWORD
	LOCAL	rct			:RECT
	LOCAL	lpDrawInfo	:DRAWITEMSTRUCT
	LOCAL	szMenuText[100]:BYTE
	LOCAL	hOutBuffer[100]:BYTE
	invoke MemCopy,lParam,addr lpDrawInfo,sizeof lpDrawInfo
	invoke GetBkMode,lpDrawInfo.hdc
	mov hBakMode,eax
	invoke GetBkColor,lpDrawInfo.hdc
	mov hBakColor,eax
	invoke GetTextColor,lpDrawInfo.hdc
	mov hTxtColor,eax
	invoke SetBkMode,lpDrawInfo.hdc,TRANSPARENT
	invoke MemCopy,addr lpDrawInfo.rcItem,addr rct,sizeof rct
	.if ( byte ptr lpDrawInfo.itemState & ODS_SELECTED) && (lpDrawInfo.itemID != 0 && lpDrawInfo.itemID != -1)
		invoke SetBkColor,lpDrawInfo.hdc,Black	; 绘制已选中的菜单项(非分隔符)
		invoke ExtTextOut,lpDrawInfo.hdc,0,0,ETO_OPAQUE,addr rct,0,0,0
		invoke InflateRect,addr rct,-1,-1
		invoke SetBkColor,lpDrawInfo.hdc,0d0a8afh
		invoke ExtTextOut,lpDrawInfo.hdc,0,0,ETO_OPAQUE,addr rct,0,0,0
	.else
		mov ebx,XPMENUCOLOR						; 绘制未选中的菜单项(或分隔符)
		invoke SetBkColor,lpDrawInfo.hdc,ebx
		mov esi,rct.right
		m2m rct.right,rct.left
		inc rct.right
		.while rct.left < esi	; 绘制渐变色菜单
			invoke ExtTextOut,lpDrawInfo.hdc,0,0,ETO_OPAQUE,addr rct,0,0,0
			inc rct.left
			inc rct.right
			.if ebx < 0ff0000h
				add ebx,10000h
			.endif
			.if bh < 0ffh
				inc bh
			.endif
			.if bl < 0ffh
				inc bl
			.endif
			invoke SetBkColor,lpDrawInfo.hdc,ebx
			.if ebx == White
				mov rct.right,esi
				invoke ExtTextOut,lpDrawInfo.hdc,0,0,ETO_OPAQUE,addr rct,0,0,0
				.break
			.endif
		.endw
	.endif
	.if lpDrawInfo.itemID == 0 || lpDrawInfo.itemID == -1
		invoke GetSysColor,COLOR_BTNFACE		; 设置颜色
		invoke SetBkColor,lpDrawInfo.hdc,eax
		invoke MemCopy,addr lpDrawInfo.rcItem,addr rct,sizeof rct
		add rct.left,20							; 计算应绘制分隔符的位置
		mov eax,rct.bottom
		sub eax,rct.top
		xor edx,edx
		mov ecx,2
		div ecx
		add rct.top,eax
		m2m rct.bottom,rct.top
		inc rct.bottom		; 绘制分隔符
		invoke ExtTextOut,lpDrawInfo.hdc,0,0,ETO_OPAQUE,addr rct,0,0,0
		ret
	.endif
	;invoke LoadIcon,hInstance,lpDrawInfo.itemID

⌨️ 快捷键说明

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