📄 xp.asm
字号:
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 + -