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

📄 xp.asm

📁 用ASM实现Server及sql操作
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	.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\comctl32.inc
    include     \masm32\include\gdi32.inc
    include     \masm32\include\shell32.inc
    include     \masm32\include\advapi32.inc
    include     \masm32\include\masm32.inc
    includelib  \masm32\lib\user32.lib
    includelib  \masm32\lib\kernel32.lib
    includelib  \masm32\lib\comctl32.lib
    includelib  \masm32\lib\gdi32.lib
    includelib  \masm32\lib\shell32.lib
    includelib  \masm32\lib\advapi32.lib
    includelib  \masm32\lib\masm32.lib
MapXPWindow			PROTO :DWORD,:DWORD,:DWORD,:DWORD
MakeRegion			PROTO :DWORD,:DWORD,:DWORD
DrawGroupBox		PROTO :DWORD,:DWORD,:DWORD,:DWORD
WindowCenterProc	PROTO :DWORD
CalcXY				PROTO :DWORD,:DWORD,:DWORD,:DWORD
MoveXY				PROTO :DWORD,:DWORD
MoveSubWindowToDown	PROTO :DWORD
EnumAndMoveChild	PROTO :DWORD,:DWORD
CalcWindowHighWidth	PROTO :DWORD
DrawTitleButton		PROTO :DWORD
FloatButtonProc		PROTO :DWORD,:DWORD,:DWORD,:DWORD
DrawCheckButton		PROTO :DWORD,:DWORD,:DWORD,:DWORD
UpdateFloatButton	PROTO :DWORD,:DWORD,:DWORD,:DWORD
InitFloatTitleButton	PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
InitXpResource		PROTO
DrawRectEdge		PROTO :DWORD,:DWORD,:DWORD,:DWORD
DrawBmpButton		PROTO :DWORD
ClassBmpButton		PROTO :DWORD
ClickSubSystemMenu	PROTO :DWORD,:DWORD
SetBmpColor			PROTO :DWORD,:DWORD,:DWORD,:DWORD
ControlCommand		PROTO :DWORD,:DWORD
DrawReadWriteEdit	PROTO :DWORD,:DWORD,:DWORD,:DWORD
SubClassesWinProc	PROTO :DWORD,:DWORD,:DWORD
DrawMenuItem		PROTO :DWORD
CreateRightMenu		PROTO
ModifyXPMenu		PROTO :DWORD,:DWORD
ControlMenu			PROTO :DWORD
InitXPMenu			PROTO :DWORD
DrawReadOnlyEdit	PROTO :DWORD,:DWORD,:DWORD,:DWORD
ShowRightMenu		PROTO :DWORD,:DWORD
InitSubSystemMenu	PROTO :DWORD
MemFill				PROTO :DWORD,:DWORD
PopupSubSystemMenu	PROTO :DWORD,:DWORD
DeleteXpResource	PROTO
DrawComboBoxItem	PROTO :DWORD,:DWORD,:DWORD,:DWORD
AddListDataSub		PROTO :DWORD,:DWORD,:DWORD
DrawUdmItem			PROTO :DWORD,:DWORD,:DWORD,:DWORD
HyperLinkProc		PROTO :DWORD,:DWORD,:DWORD,:DWORD
DrawXpWinEdge		PROTO :DWORD,:DWORD
GetWindowIcon		PROTO :DWORD
DrawRoundRect		PROTO :DWORD,:DWORD,:DWORD
ClassesWinProc		PROTO :DWORD,:DWORD
IsEmailHttp			PROTO :DWORD
DrawProgressBar		PROTO :DWORD,:DWORD,:DWORD,:DWORD
DrawSysList32Head	PROTO :DWORD,:DWORD,:DWORD,:DWORD
DrawColumn			PROTO :DWORD,:DWORD,:DWORD
EnumAndPaintChild	PROTO :DWORD,:DWORD
XPBKCOLOR			equ 0d0e8efh
XPEDGECOLOR			equ 0b99d7fh
XPMENUCOLOR			equ 0c0c8c0h
XPGROUPCOLOR		equ 0bfd0d0h
XPTITLEBACKCOLOR	equ Black
XPTITLEFORECOLOR	equ White
XPHTTPLINKCOLOR		equ 0bf00h
BMP_TITLE_WIDTH		equ 16
BMP_TITLE_HEIGHT	equ 29
PBS_SMOOTH			equ 1
PBS_VERTICAL		equ 4
PBM_SETRANGE32		equ WM_USER+6		; lParam = high, wParam = low
PBM_GETRANGE		equ WM_USER+7		; wParam = return (TRUE ? low : high). lParam = PPBRANGE or NULL
PBM_GETPOS			equ WM_USER+8
PBM_SETBARCOLOR		equ WM_USER+9		; lParam = bar color
PBM_SETBKCOLOR		equ CCM_SETBKCOLOR	; lParam = bkColor

szText MACRO Name, Text:VARARG
	LOCAL lbl
	jmp lbl
	Name db Text,0
	lbl:
ENDM
m2m MACRO M1, M2
	push M2
	pop  M1
ENDM
STEXT MACRO Text
	local szText
	LOCAL lbl
	jmp lbl
	szText db Text,0
	lbl:
	exitm <offset szText>	
ENDM

.data?
hBmpTitleLeft			dd ?
hBmpTitleRight			dd ?
hBmpTitleCenter			dd ?
hBmpCloseNoActive		dd ?
hBmpCloseActive			dd ?
hBmpCloseDown			dd ?
hButtonBmpNoActive		dd ?
hButtonBmpSetFocus		dd ?
hButtonBmpActive		dd ?
hButtonBmpDown			dd ?
hButtonBmpDisable		dd ?
hBmpMaxDisable			dd ?
hBmpMinNoActive			dd ?
hBmpMinActive			dd ?
hBmpMinDown				dd ?

hXpBrush				dd ?
hdwp					dd ?
hInstance				dd ?
.data
hFirstWin				dd 0
hDrawWin				dd 0
.code
MapXPWindow	proc uses esi edi ebx,hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
	LOCAL	hdc			:DWORD
	LOCAL	hCurRgn		:DWORD
	LOCAL	hTempRgn	:DWORD
	LOCAL	hTitleFont	:DWORD
	LOCAL	hBakFont	:DWORD,hBakMode:DWORD,hTxtColor:DWORD
	LOCAL	@hFontOutput:DWORD
	LOCAL	@hWinTemp	:DWORD
	LOCAL	@stFont		:LOGFONT
	LOCAL	rct			:RECT
	LOCAL	Ps			:PAINTSTRUCT
	LOCAL	TempBuffer	[MAX_PATH]:BYTE
	push eax
	mov eax,uMsg
.if	eax == WM_INITDIALOG || eax == WM_CREATE
	invoke SendMessage,hWin,WM_SYSCOMMAND,SC_KEYMENU,addr TempBuffer
	.if hFirstWin == 0
		m2m hFirstWin,hWin
		invoke InitXpResource
	.endif
	invoke LoadIcon,hInstance,lParam
	.if eax != 0
		invoke SendMessage,hWin,WM_SETICON,ICON_BIG,eax		; 设置窗口图标
	.endif
	invoke InitSubSystemMenu,hWin		; 初使化系统菜单
; 去掉窗口标题栏
	invoke GetWindowLong,hWin,GWL_STYLE
	and eax,not (WS_CAPTION or WS_THICKFRAME or DS_MODALFRAME)
	invoke SetWindowLong,hWin,GWL_STYLE,eax
	invoke GetWindowLong,hWin,GWL_EXSTYLE
	and eax,not (WS_EX_WINDOWEDGE or WS_EX_DLGMODALFRAME)
	invoke SetWindowLong,hWin,GWL_EXSTYLE,eax
	invoke MoveSubWindowToDown,hWin		; 移动并子类化所有子窗口
; 初使化类XP窗口
	invoke GetClientRect,hWin,addr rct
	mov ebx,rct.right
	sub ebx,26			; 创建关闭按钮
	invoke InitFloatTitleButton,hWin,SC_CLOSE,ebx,5,21,21
	invoke GetWindowLong,hWin,GWL_STYLE
	.if eax & WS_MINIMIZEBOX
		sub ebx,23
		invoke InitFloatTitleButton,hWin,SC_MAXIMIZE,ebx,5,21,21
		sub ebx,23
		invoke InitFloatTitleButton,hWin,SC_MINIMIZE,ebx,5,21,21
	.endif
	invoke WindowCenterProc,hWin
	m2m eax,1
.elseif eax == WM_SETTEXT			; 处理这两个消息以响应修改窗口文本或状态时重绘窗口
	invoke GetClientRect,hWin,addr rct
	invoke CreateRectRgnIndirect,addr rct
	mov hCurRgn,eax
	invoke InflateRect,addr rct,-3,-3
	add rct.top,26
	invoke CreateRectRgnIndirect,addr rct
	mov hTempRgn,eax
	invoke CombineRgn,hCurRgn,hCurRgn,hTempRgn,RGN_DIFF
	invoke RedrawWindow,hWin,0,hCurRgn,RDW_INVALIDATE
	invoke DeleteObject,hTempRgn
	invoke DeleteObject,hCurRgn
.elseif eax == WM_PAINT	; 绘制窗口标题栏
	mov eax,hWin
	.if eax != hDrawWin
		invoke MakeRegion,hWin,hBmpTitleLeft,hBmpTitleRight		; 修改窗口边框为位图形状
		m2m hDrawWin,hWin
	.endif
	invoke BeginPaint,hWin,addr Ps
	mov    hdc,eax
	invoke GetBkMode,hdc
	mov hBakMode,eax
	invoke GetTextColor,hdc
	mov hTxtColor,eax
 	invoke GetClientRect,hWin,addr rct
	invoke DrawXpWinEdge,hdc,addr rct
	invoke SendMessage,hWin,WM_GETFONT,0,0
	mov	hTitleFont,eax
	invoke GetObject,hTitleFont,sizeof LOGFONT,addr @stFont
	dec	@stFont.lfHeight
	mov @stFont.lfWeight,FW_BOLD
	invoke CreateFontIndirect,addr @stFont
	mov hTitleFont,eax
	invoke SelectObject,hdc,hTitleFont
	mov hBakFont,eax
	invoke SetBkMode,hdc,TRANSPARENT
	invoke GetWindowText,hWin,addr TempBuffer,sizeof TempBuffer
	invoke SetTextColor,hdc,XPTITLEBACKCOLOR
	invoke GetWindowIcon,hWin								; 获取窗口图标
	.if eax != 0
		invoke DrawIconEx,hdc,6,6,eax,16,16,0,0,DI_NORMAL	; 绘制标题栏图标
		add rct.left,30
	.else
		add rct.left,10
	.endif
	add rct.top,10
	sub rct.right,26
	mov rct.bottom,BMP_TITLE_HEIGHT						; 绘制窗口标题文字
	invoke DrawText,hdc,addr TempBuffer,-1,addr rct,DT_SINGLELINE
	invoke SetTextColor,hdc,XPTITLEFORECOLOR
	invoke OffsetRect,addr rct,-1,-1
	invoke DrawText,hdc,addr TempBuffer,-1,addr rct,DT_SINGLELINE
	invoke SelectObject,hdc,hBakFont
	invoke DeleteObject,hTitleFont
	invoke EnumChildWindows,hWin,addr EnumAndPaintChild,hWin
	invoke SetTextColor,hdc,hTxtColor
	invoke SetBkMode,hdc,hBakMode
	invoke EndPaint,hWin,addr Ps
	xor eax,eax
.elseif eax == WM_DRAWITEM		; 绘制XP风格的按钮
	mov eax,lParam
	.if [eax.DRAWITEMSTRUCT].CtlType == ODT_BUTTON
		invoke DrawBmpButton,lParam
	.elseif [eax.DRAWITEMSTRUCT].CtlType == ODT_STATIC
		invoke DrawTitleButton,lParam
	.elseif [eax.DRAWITEMSTRUCT].CtlType == ODT_MENU
		invoke DrawMenuItem,lParam		; 绘制菜单
	.endif
	m2m eax,1
.elseif eax == WM_CTLCOLORDLG || eax == WM_CTLCOLORBTN
	mov eax,hXpBrush
.elseif eax == WM_CTLCOLORSTATIC
	invoke GetClassName,lParam,addr TempBuffer,sizeof TempBuffer
	invoke lstrcmpi,addr TempBuffer,STEXT('STATIC')
	.if eax == 0
		invoke SetBkMode,wParam,TRANSPARENT
		mov eax,hXpBrush
	.else
		invoke lstrcmpi,addr TempBuffer,STEXT('EDIT')
		.if eax == 0
			invoke SetBkMode,wParam,TRANSPARENT
			invoke GetClientRect,lParam,addr rct
			invoke InflateRect,addr rct,1,1
			;invoke GetSysColor,COLOR_GRAYTEXT
			invoke DrawRectEdge,wParam,addr rct,XPEDGECOLOR,1
			invoke SetBkColor,wParam,XPBKCOLOR
			mov eax,hXpBrush
		.else
			xor eax,eax
		.endif
	.endif
.elseif eax == WM_CTLCOLOREDIT
	invoke GetClassName,lParam,addr TempBuffer,sizeof TempBuffer
	invoke lstrcmpi,addr TempBuffer,STEXT('EDIT')
	.if eax == 0
		invoke SetBkMode,wParam,TRANSPARENT
		invoke GetClientRect,lParam,addr rct
		invoke InflateRect,addr rct,1,1
		invoke GetWindow,lParam,GW_HWNDNEXT
		.if eax != 0
			mov hdc,eax
			lea eax,TempBuffer
			invoke GetClassName,hdc,eax,sizeof TempBuffer
			invoke lstrcmpi,addr TempBuffer,STEXT('msctls_updown32')
			.if eax == 0
				invoke GetWindowLong,hdc,GWL_STYLE
				.if eax & UDS_AUTOBUDDY
					m2m eax,2
				.else
					m2m eax,1
				.endif
			.else
				m2m eax,1
			.endif
		.else
			m2m eax,1
		.endif
		invoke DrawRectEdge,wParam,addr rct,XPEDGECOLOR,eax
		invoke SetBkColor,wParam,White
		invoke GetStockObject,WHITE_BRUSH
	.else
		xor eax,eax
	.endif
.elseif eax == WM_RBUTTONUP				; 标题栏上右键弹出的系统菜单
	invoke PopupSubSystemMenu,hWin,lParam
.elseif eax == WM_LBUTTONDOWN || (eax == WM_SYSCOMMAND && wParam == SC_KEYMENU)	; 标题栏上左键弹出的系统菜单
	invoke ClickSubSystemMenu,hWin,lParam
.elseif eax == WM_MEASUREITEM
	invoke ModifyXPMenu,hWin,lParam	; 设置菜单高度和宽度
.elseif	eax == WM_COMMAND
	mov	eax,wParam
	.if eax == SC_CLOSE
		invoke PostMessage,hWin,WM_CLOSE,0,0
	.elseif eax == SC_MOVE || eax == SC_RESTORE || eax == SC_SIZE || eax == SC_MAXIMIZE
		invoke SendMessage,hWin,WM_SYSCOMMAND,eax,0		; 接收系统命令
	.elseif eax == SC_MINIMIZE
		invoke CloseWindow,hWin
	.elseif word ptr wParam+2 == CBN_DROPDOWN || word ptr wParam+2 == CBN_CLOSEUP
		invoke GetClassName,lParam,addr TempBuffer,sizeof TempBuffer
		invoke lstrcmpi,addr TempBuffer,STEXT('ComboBox')
		.if eax == 0
			.if word ptr wParam+2 == CBN_DROPDOWN
				inc hComboBoxDrop
				invoke RedrawWindow,lParam,0,0,RDW_INVALIDATE
			.elseif word ptr wParam+2 == CBN_CLOSEUP
				mov hComboBoxDrop,0
				invoke RedrawWindow,lParam,0,0,RDW_INVALIDATE
			.endif
		.endif
	.endif
	m2m eax,1
.elseif eax == WM_DESTROY
	invoke GetWindowIcon,hWin
	.if eax != 0
		invoke DestroyIcon,eax
	.endif
	mov eax,hWin
	.if eax == hFirstWin
		invoke DeleteXpResource
		m2m hFirstWin,0
	.endif
	xor eax,eax
.elseif eax == WM_CLOSE
	invoke EndDialog,hWin,lParam
	m2m eax,1
.else
	pop eax
	jmp NEXT_SET
.endif
pop ecx
NEXT_SET:
ret
MapXPWindow	endp

; 居中窗口
WindowCenterProc	proc hWin:DWORD
	LOCAL	Wtx	:DWORD
	LOCAL	Wty	:DWORD
	LOCAL	rct	:RECT
	LOCAL	rect:RECT
	invoke GetParent,hWin
	.if eax == 0					; 如果是主窗口
		invoke GetClientRect,hWin,addr rct
		invoke GetSystemMetrics,SM_CXSCREEN
		invoke MoveXY,rct.right,eax
		mov Wtx, eax
		invoke GetSystemMetrics,SM_CYSCREEN
		invoke MoveXY,rct.bottom,eax
		mov Wty, eax
		invoke SetWindowPos,hWin,0,Wtx,Wty,0,0,SWP_NOSIZE or SWP_NOZORDER
	.else							; 如果是子窗口
		lea edx,rct
		invoke GetWindowRect,eax,edx
		invoke GetWindowRect,hWin,addr rect
		invoke CalcXY,rect.left,rect.right,rct.left,rct.right
		mov rct.left,eax
		mov rect.right,edx
		invoke CalcXY,rect.top,rect.bottom,rct.top,rct.bottom
		invoke MoveWindow,hWin,rct.left,eax,rect.right,edx,0
	.endif
	ret
WindowCenterProc	endp
CalcXY	proc cStart:DWORD,cEnd:DWORD,mStart:DWORD,mEnd:DWORD
	mov eax,cStart
	sub cEnd,eax
	mov eax,mEnd
	sub eax,mStart
	push eax
	sub eax,cEnd
	.if SIGN?
		neg eax
	.endif
	shr eax,1
	pop edx
	.if edx < cEnd
		sub mStart,eax
	.else
		add mStart,eax
	.endif
	mov eax,mStart
	mov edx,cEnd
	ret
CalcXY	endp
MoveXY proc wDim:DWORD,sDim:DWORD
    shr sDim,1
    shr wDim,1
    mov eax,sDim
    sub eax,wDim
    ret
MoveXY endp

; 绘制窗口为位图形状
MakeRegion      PROC uses esi edi ebx,hWin:DWORD,hBmp1:DWORD,hBmp2:DWORD
		LOCAL hdc		:DWORD
		LOCAL hMemDC	:DWORD
		LOCAL tcol		:DWORD
		LOCAL CurRgn	:DWORD,hBakBmp:DWORD
		LOCAL TempRgn	:DWORD
		LOCAL rct		:RECT
	invoke  GetWindowDC,hWin
	mov     hdc,eax
	invoke  CreateCompatibleDC,NULL
	mov     hMemDC,eax
	invoke  SelectObject,hMemDC,hBmp1
	mov hBakBmp,eax
	invoke  GetClientRect,hWin,addr rct
	xor esi,esi
	xor edi,edi
	invoke  GetPixel,hMemDC,0,0
	mov     tcol,eax
	invoke CreateRectRgn,0,0,rct.right,rct.bottom
	mov CurRgn,eax
	.while esi <= 5
		.while edi <= 5
			invoke GetPixel,hMemDC,edi,esi
			.if eax == tcol
				lea eax,[edi+1]
				lea ecx,[esi+1]
				invoke CreateRectRgn,edi,esi,eax,ecx

⌨️ 快捷键说明

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