📄 xp.asm
字号:
PopupSubSystemMenu endp
DeleteXpResource PROC
invoke DeleteObject,hBmpTitleLeft
invoke DeleteObject,hBmpTitleRight
invoke DeleteObject,hBmpTitleCenter
invoke DeleteObject,hBmpCloseNoActive
invoke DeleteObject,hBmpCloseActive
invoke DeleteObject,hBmpCloseDown
invoke DeleteObject,hButtonBmpNoActive
invoke DeleteObject,hButtonBmpSetFocus
invoke DeleteObject,hButtonBmpActive
invoke DeleteObject,hButtonBmpDown
invoke DeleteObject,hButtonBmpDisable
invoke DeleteObject,hXpBrush
ret
DeleteXpResource ENDP
; 向列表框中循环添加数据的子程序
AddListDataSub proc uses esi ebx,hWin:DWORD,lpDlg:DWORD,lpSZ:DWORD
invoke GetDlgItem,hWin,lpDlg
mov ebx,eax
mov esi,lpSZ
.repeat
invoke SendMessage,ebx,CB_INSERTSTRING,-1,esi
invoke lstrlen,esi
add esi,eax
inc esi
.until byte ptr [esi] == 0
invoke SendMessage,ebx,CB_SETCURSEL,0,0
ret
AddListDataSub endp
; 自绘制组合框
.data
hComboBoxDrop db 0
.code
DrawComboBoxItem proc uses ebx,hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
LOCAL hBrush :DWORD
LOCAL hdc :DWORD
LOCAL szFont :DWORD
LOCAL hBakFont:DWORD
LOCAL hMemDC :DWORD,hBmp:DWORD
LOCAL hBakBmp :DWORD,hBakMode:DWORD,hBakColor:DWORD,hTxtColor:DWORD
LOCAL Ps :PAINTSTRUCT
LOCAL rct :RECT
LOCAL pt :POINT
LOCAL @stFont :LOGFONT
LOCAL TempBuffer[MAX_PATH]:BYTE
mov eax,uMsg
.if eax == WM_PAINT
invoke BeginPaint,hWin,addr Ps
mov hdc,eax
invoke GetBkMode,hdc
mov hBakMode,eax
invoke GetBkColor,hdc
mov hBakColor,eax
invoke GetTextColor,hdc
mov hTxtColor,eax
invoke SetBkMode,hdc,TRANSPARENT
invoke CreateCompatibleDC,NULL
mov hMemDC,eax
invoke GetClientRect,hWin,addr rct
invoke InflateRect,addr rct,-1,-1
invoke IsWindowEnabled,hWin
.if eax == FALSE
invoke GetSysColor,COLOR_GRAYTEXT
push eax
invoke SetTextColor,hdc,eax
pop eax
invoke DrawRectEdge,hdc,addr rct,eax,1
mov ebx,XPBKCOLOR
push 73
.else
invoke DrawRectEdge,hdc,addr rct,XPEDGECOLOR,1
mov ebx,White
invoke SetTextColor,hdc,Black
.if hComboBoxDrop == 0
push 71
.else
push 72
.endif
.endif
pop eax
invoke LoadBitmap,hInstance,eax
invoke SetBmpColor,eax,ebx,15,16
mov hBmp,eax
invoke SelectObject,hMemDC,eax
mov hBakBmp,eax
invoke InflateRect,addr rct,-1,-1
m2m rct.left,rct.right
sub rct.left,15
invoke BitBlt,hdc,rct.left,rct.top,15,16,hMemDC,0,0,SRCCOPY
invoke SelectObject,hMemDC,hBakBmp
invoke DeleteObject,hBmp
invoke DeleteDC,hMemDC
invoke SetBkColor,hdc,ebx
m2m rct.right,rct.left
m2m rct.left,2
invoke ExtTextOut,hdc,0,0,ETO_OPAQUE,addr rct,0,0,0
dec rct.right
invoke GetWindowText,hWin,addr TempBuffer,sizeof TempBuffer
invoke SendMessage,hWin,WM_GETFONT,0,0
mov szFont,eax
invoke GetObject,szFont,sizeof LOGFONT,addr @stFont
invoke CreateFontIndirect,addr @stFont
mov szFont,eax
invoke SelectObject,hdc,szFont
mov hBakFont,eax
add rct.left,2
invoke DrawText,hdc,addr TempBuffer,-1,addr rct,DT_VCENTER or DT_SINGLELINE
invoke SelectObject,hdc,hBakFont
invoke DeleteObject,szFont
invoke SetTextColor,hdc,hTxtColor
invoke SetBkColor,hdc,hBakColor
invoke SetBkMode,hdc,hBakMode
invoke EndPaint,hWin,addr Ps
xor eax,eax
ret
.endif
invoke GetWindowLong,hWin,GWL_USERDATA
invoke CallWindowProc,eax,hWin,uMsg,wParam,lParam
ret
DrawComboBoxItem endp
; 绘制旋转按钮
.data?
hUdmTopState db ?
hUdmBottomState db ?
.code
DrawUdmItem proc uses ebx,hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
LOCAL hdc :DWORD
LOCAL hMemDC :DWORD,hBakColor:DWORD
LOCAL hBakBmp :DWORD,hBmp1:DWORD,hBmp2:DWORD
LOCAL hState :DWORD
LOCAL Ps :PAINTSTRUCT
LOCAL rct :RECT
mov eax,uMsg
.if eax == WM_PAINT
invoke BeginPaint,hWin,addr Ps
mov hdc,eax
invoke GetClientRect,hWin,addr rct
invoke CreateCompatibleDC,NULL
mov hMemDC,eax
invoke GetBkColor,hdc
mov hBakColor,eax
invoke IsWindowEnabled,hWin
.if eax == TRUE
mov hState,0
.else
mov hState,1
.endif
.if hState == 1
mov ebx,XPBKCOLOR
push 85
.else
invoke GetSysColor,COLOR_WINDOW
mov ebx,eax
.if hUdmTopState == 0
push 81
.else
push 83
.endif
.endif
pop eax
invoke LoadBitmap,hInstance,eax
invoke SetBmpColor,eax,ebx,17,9
mov hBmp1,eax
invoke SelectObject,hMemDC,eax
mov hBakBmp,eax
invoke SetBkColor,hdc,ebx
invoke ExtTextOut,hdc,0,0,ETO_OPAQUE,addr rct,0,0,0
invoke BitBlt,hdc,0,0,17,9,hMemDC,0,0,SRCCOPY
.if hState == 1
push 86
.else
.if hUdmBottomState == 0
push 82
.else
push 84
.endif
.endif
pop eax
invoke LoadBitmap,hInstance,eax
invoke SetBmpColor,eax,ebx,17,8
mov hBmp2,eax
invoke SelectObject,hMemDC,eax
invoke DeleteObject,hBmp1
invoke BitBlt,hdc,0,9,17,8,hMemDC,0,0,SRCCOPY
invoke SelectObject,hMemDC,hBakBmp
invoke DeleteObject,hBmp2
invoke DeleteDC,hMemDC
.if hState == 1
invoke GetSysColor,COLOR_GRAYTEXT
.else
mov eax,XPEDGECOLOR
.endif
mov ebx,eax
invoke GetWindowLong,hWin,GWL_STYLE
.if eax & UDS_AUTOBUDDY
xor eax,eax
.else
m2m eax,1
.endif
invoke DrawRectEdge,hdc,addr rct,ebx,eax
invoke SetBkColor,hdc,hBakColor
invoke EndPaint,hWin,addr Ps
xor eax,eax
ret
.elseif eax == WM_LBUTTONDOWN
.if word ptr lParam+2 < 9
inc hUdmTopState
.else
inc hUdmBottomState
.endif
.elseif eax == WM_LBUTTONUP
mov hUdmBottomState,0
mov hUdmTopState,0
.endif
invoke GetWindowLong,hWin,GWL_USERDATA
invoke CallWindowProc,eax,hWin,uMsg,wParam,lParam
ret
DrawUdmItem endp
; 绘制选择按钮
DrawCheckButton proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
LOCAL hdc :DWORD
LOCAL hMemDC :DWORD
LOCAL hBmpCheck :DWORD
LOCAL hBakBmp :DWORD
LOCAL hPen :DWORD
LOCAL hBakPen :DWORD
LOCAL hBrush :DWORD,hCheckFont:DWORD,hBakFont:DWORD
LOCAL hBakBrush :DWORD,hBakMode:DWORD,hBakColor:DWORD,hTxtColor:DWORD
LOCAL hButtonStyle :BYTE
LOCAL hState :BYTE
LOCAL hPoint :POINT
LOCAL rct :RECT
LOCAL rect :RECT
LOCAL Ps :PAINTSTRUCT
LOCAL @stFont :LOGFONT
LOCAL TempBuffer [MAX_PATH]:BYTE
mov eax,uMsg
.if eax == WM_PAINT
invoke BeginPaint,hWin,addr Ps
mov hdc,eax
invoke GetWindowText,hWin,addr TempBuffer,sizeof TempBuffer
invoke GetBkMode,hdc
mov hBakMode,eax
invoke GetBkColor,hdc
mov hBakColor,eax
invoke GetTextColor,hdc
mov hTxtColor,eax
invoke SetBkMode,hdc,TRANSPARENT
invoke GetClientRect,hWin,addr rect
invoke MemCopy,addr rect,addr rct,sizeof RECT
invoke SetBkColor,hdc,XPBKCOLOR
invoke ExtTextOut,hdc,0,0,ETO_OPAQUE,addr rct,0,0,0
invoke GetCursorPos,addr hPoint
invoke WindowFromPoint,hPoint.x,hPoint.y
;mov rct.right,13
invoke CreateCompatibleDC,NULL
mov hMemDC,eax
invoke GetWindowLong,hWin,GWL_STYLE
mov hButtonStyle,al
invoke IsWindowEnabled,hWin
.if eax == TRUE
invoke SendMessage,hWin,BM_GETCHECK,0,0 ; 确定是否选中状态
.if eax == TRUE
mov eax,hWin
.if lpFloatButtonDown == 1 && lpFloatButtonWin == eax
.if hButtonStyle == BS_AUTORADIOBUTTON
push 66
.else
push 56
.endif
.else
.if lpFloatButtonItalic == 1 && lpFloatButtonWin == eax
.if hButtonStyle == BS_AUTORADIOBUTTON
push 64
.else
push 54
.endif
.else
.if hButtonStyle == BS_AUTORADIOBUTTON
push 62
.else
push 52
.endif
.endif
.endif
.else
mov eax,hWin
.if lpFloatButtonDown == 1 && lpFloatButtonWin == eax
.if hButtonStyle == BS_AUTORADIOBUTTON
push 65
.else
push 55
.endif
.else
.if lpFloatButtonItalic == 1 && lpFloatButtonWin == eax
.if hButtonStyle == BS_AUTORADIOBUTTON
push 63
.else
push 53
.endif
.else
.if hButtonStyle == BS_AUTORADIOBUTTON
push 61
.else
push 51
.endif
.endif
.endif
.endif
mov hState,0
.else
.if hButtonStyle == BS_AUTORADIOBUTTON
invoke CreateSolidBrush,XPBKCOLOR ; 创建XP色的画刷作为背景色
mov hBrush,eax
invoke GetSysColor,COLOR_GRAYTEXT
invoke CreatePen,PS_INSIDEFRAME,1,eax ; 64ff创建白色的画刷作为边框色
mov hPen,eax
invoke SelectObject,hdc,hBrush
mov hBakBrush,eax
invoke SelectObject,hdc,hPen
mov hBakPen,eax
invoke Ellipse,hdc,0,0,13,13
invoke SendMessage,hWin,BM_GETCHECK,0,0
.if eax == TRUE
invoke GetSysColor,COLOR_GRAYTEXT
invoke CreateSolidBrush,eax
push eax
invoke SelectObject,hdc,eax
invoke DeleteObject,hBrush
pop eax
mov hBrush,eax
invoke Ellipse,hdc,4,4,9,9
.endif
invoke SelectObject,hdc,hBakPen
invoke SelectObject,hdc,hBakBrush
invoke DeleteObject,hPen
invoke DeleteObject,hBrush
push 0
.else
invoke SendMessage,hWin,BM_GETCHECK,0,0
.if eax == TRUE
push 58
.else
push 57
.endif
.endif
mov hState,1
.endif
pop eax
.if eax != 0
invoke LoadBitmap,hInstance,eax
.if hButtonStyle == BS_AUTORADIOBUTTON
invoke SetBmpColor,eax,XPBKCOLOR,13,13
.endif
mov hBmpCheck,eax
invoke SelectObject,hMemDC,hBmpCheck
mov hBakBmp,eax
invoke BitBlt,hdc,0,0,rct.right,rct.bottom,hMemDC,0,0,SRCCOPY
invoke SelectObject,hMemDC,hBakBmp
invoke DeleteObject,hBmpCheck
.endif
invoke DeleteDC,hMemDC
invoke MemCopy,addr rect,addr rct,sizeof RECT
add rct.left,16
invoke SendMessage,hWin,WM_GETFONT,0,0
lea edx,@stFont
invoke GetObject,eax,sizeof LOGFONT,edx
invoke CreateFontIndirect,addr @stFont
mov hCheckFont,eax
invoke SelectObject,hdc,eax
mov hBakFont,eax
.if hState == 0
invoke SetTextColor,hdc,Black
invoke DrawText,hdc,addr TempBuffer,-1,addr rct,DT_SINGLELINE or DT_VCENTER
.else
invoke SetTextColor,hdc,White
invoke OffsetRect,addr rct,1,1
invoke DrawText,hdc,addr TempBuffer,-1,addr rct,DT_SINGLELINE or DT_VCENTER
invoke GetSysColor,COLOR_GRAYTEXT
invoke SetTextColor,hdc,eax
invoke OffsetRect,addr rct,-1,-1
invoke DrawText,hdc,addr TempBuffer,-1,addr rct,DT_SINGLELINE or DT_VCENTER
.endif
invoke SelectObject,hdc,hBakFont
invoke DeleteObject,hCheckFont
invoke SetTextColor,hdc,hTxtColor
invoke SetBkColor,hdc,hBakColor
invoke SetBkMode,hdc,hBakMode
invoke EndPaint,hWin,addr Ps
xor eax,eax
ret
.elseif eax == BM_SETSTATE || eax == BM_SETCHECK ; 处理用鼠标点击复选窗口时的消息并重绘窗口
invoke RedrawWindow,hWin,0,0,RDW_INVALIDATE
.elseif eax == WM_SETFOCUS
invoke RedrawWindow,hWin,0,0,RDW_INVALIDATE
.endif
invoke UpdateFloatButton,hWin,uMsg,wParam,lParam
ret
DrawCheckButton endp
; 绘制超级链接窗口
HyperLinkProc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
LOCAL TempBuffer[MAX_PATH]:BYTE
LOCAL hdc:DWORD,hTxtColor:DWORD
LOCAL hBakFont:DWORD,hBakColor:DWORD,hBakMode:DWORD
LOCAL httpFont:DWORD
LOCAL hColor:DWORD
LOCAL rct:RECT
LOCAL Ps:PAINTSTRUCT
LOCAL hPoint:POINT
LOCAL @stFont:LOGFONT
mov eax,uMsg
.if eax == WM_LBUTTONUP
invoke GetCursorPos,addr hPoint
invoke WindowFromPoint,hPoint.x,hPoint.y
.if eax == hWin && lpFloatButtonMove == 1
invoke GetWindowText,hWin,addr TempBuffer,sizeof TempBuffer
invoke IsEmailHttp,addr TempBuffer
.if eax != 0
invoke lstrcpy,addr TempBuffer,STEXT('mailto:')
invoke lstrlen,addr TempBuffer
lea edx,TempBuffer
add eax,edx
invoke GetWindowText,hWin,eax,sizeof TempBuffer
.endif
invoke ShellExecute,0,0,addr TempBuffer,0,0,0
.endif
.elseif eax == WM_SETCURSOR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -