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