📄 clock.asm
字号:
call _ApplyLookSetup
call _DeleteLookDC
invoke EndDialog,hWinDialog,NULL
.elseif eax == ID_LOOK_APPLY
call _FreshLookDialog
call _ApplyLookSetup
.elseif eax == ID_LOOK_CANCEL
call _DeleteLookDC
invoke EndDialog,hWinDialog,NULL
.elseif eax == IDL_RNDBACK
invoke SendMessage,lParam,BM_GETCHECK,0,0
.if eax == TRUE
or dwTempFlag,F_RND_BACK
.else
and dwTempFlag,not F_RND_BACK
.endif
call _FreshLookDialog
.elseif eax == IDL_RNDNUMBER
invoke SendMessage,lParam,BM_GETCHECK,0,0
.if eax == TRUE
or dwTempFlag,F_RND_FONT
.else
and dwTempFlag,not F_RND_FONT
.endif
call _FreshLookDialog
.elseif eax >= IDL_B01 && eax <= IDL_B08
sub eax,IDL_B01
shl eax,F_BACK_NO_
and dwTempFlag,not F_BACK_NO
or dwTempFlag,eax
call _FreshLookDialog
.elseif eax >= IDL_N01 && eax <= IDL_N08
sub eax,IDL_N01
shl eax,F_FONT_NO_
and dwTempFlag,not F_FONT_NO
or dwTempFlag,eax
call _FreshLookDialog
.endif
ret
_LookSetupCommand endp
;********************************************************************
_PaintLookSetupNum proc hDcDest:DWORD,idBmpSrc:DWORD,dwDestY:DWORD
local @hBmp:DWORD
invoke LoadBitmap,hInstance,idBmpSrc
mov @hBmp,eax
invoke SelectObject,hDcTemp,eax
invoke BitBlt,hDcDest,0,dwDestY,4,25,\
hDcTemp,11*15,0,SRCCOPY
invoke BitBlt,hDcDest,4,dwDestY,30,25,\
hDcTemp,1*15,0,SRCCOPY
invoke BitBlt,hDcDest,34,dwDestY,8,25,\
hDcTemp,10*15,0,SRCCOPY
invoke BitBlt,hDcDest,42,dwDestY,30,25,\
hDcTemp,3*15,0,SRCCOPY
invoke BitBlt,hDcDest,72,dwDestY,4,25,\
hDcTemp,11*15,0,SRCCOPY
invoke DeleteObject,@hBmp
ret
_PaintLookSetupNum endp
;********************************************************************
_InitLookDialog proc
local @hDC:DWORD
local @dwCount:DWORD,@dwY
;*************** 建立临时用的标志 ***********************************
mov eax,dwFlag
; mov ebx,0ffc00h
; and eax,ebx
; not ebx
; and dwTempFlag,ebx
; or dwTempFlag,eax
mov dwTempFlag,eax
;*************** 获取3个图片子控件的窗口句柄 ************************
invoke GetDlgItem,hWinDialog,IDL_LOOK_PIC1
mov hWinPic1,eax
invoke GetDlgItem,hWinDialog,IDL_LOOK_PIC2
mov hWinPic2,eax
invoke GetDlgItem,hWinDialog,IDL_LOOK_PIC3
mov hWinPic3,eax
;*************** 建立预览用的 DC 和位图 *****************************
invoke GetDC,hWinMain
mov @hDC,eax
invoke CreateCompatibleDC,@hDC
mov hDcLook1,eax
invoke CreateCompatibleDC,@hDC
mov hDcLook1Mask,eax
invoke CreateCompatibleDC,@hDC
mov hDcLook2,eax
invoke CreateCompatibleDC,@hDC
mov hDcLook3,eax
invoke CreateCompatibleDC,@hDC
mov hDcTemp,eax
invoke CreateCompatibleBitmap,@hDC,1,1
mov hBmpLook1,eax
invoke CreateCompatibleBitmap,@hDC,1,1
mov hBmpLook1Mask,eax
invoke CreateCompatibleBitmap,@hDC,76,160
mov hBmpLook2,eax
invoke CreateCompatibleBitmap,@hDC,76,160
mov hBmpLook3,eax
invoke ReleaseDC,hWinPic2,@hDC
invoke SelectObject,hDcLook2,hBmpLook2
invoke GetStockObject,1
invoke SelectObject,hDcLook2,eax
invoke PatBlt,hDcLook2,0,0,76,160,PATCOPY
invoke SelectObject,hDcLook3,hBmpLook3
invoke GetStockObject,1
invoke SelectObject,hDcLook3,eax
invoke PatBlt,hDcLook3,0,0,76,160,PATCOPY
;*************** 在字形预览图片上画图 *******************************
mov @dwCount,0
mov @dwY,0
.while @dwCount < 4
mov eax,@dwCount
add eax,IDB_NUM0
invoke _PaintLookSetupNum,hDcLook2,eax,@dwY
inc @dwCount
add @dwY,40
.endw
mov @dwCount,0
mov @dwY,0
.while @dwCount < 4
mov eax,@dwCount
add eax,IDB_NUM4
invoke _PaintLookSetupNum,hDcLook3,eax,@dwY
inc @dwCount
add @dwY,40
.endw
call _FreshLookDialog
ret
_InitLookDialog endp
;********************************************************************
_DeleteLookDC proc
invoke DeleteDC,hDcLook1
invoke DeleteDC,hDcLook1Mask
invoke DeleteDC,hDcLook2
invoke DeleteDC,hDcLook3
invoke DeleteDC,hDcTemp
invoke DeleteDC,hDcLook1
invoke DeleteObject,hBmpLook1
invoke DeleteObject,hBmpLook1Mask
invoke DeleteObject,hBmpLook2
invoke DeleteObject,hBmpLook3
ret
_DeleteLookDC endp
;********************************************************************
_ApplyLookSetup proc
local @stOldWin:RECT,@stNewWin:RECT,@stDeskTop:RECT
local @dwOldWidth:DWORD,@dwOldHeight:DWORD
local @dwNewWidth:DWORD,@dwNewHeight:DWORD
mov eax,dwTempFlag ;提交标志
; mov ebx,0ffc00h
; and eax,ebx
; not ebx
; and dwFlag,ebx
; or dwFlag,eax
mov dwFlag,eax
invoke GetDesktopWindow
mov ebx,eax
invoke GetWindowRect,ebx,addr @stDeskTop
invoke GetWindowRect,hWinMain,addr @stOldWin
mov eax,@stOldWin.bottom
sub eax,@stOldWin.top
mov @dwOldHeight,eax
mov eax,@stOldWin.right
sub eax,@stOldWin.left
mov @dwOldWidth,eax
invoke _DeleteClock
invoke _CreateClock
invoke GetWindowRect,hWinMain,addr @stNewWin
mov eax,@stNewWin.bottom
sub eax,@stNewWin.top
mov @dwNewHeight,eax
mov eax,@stNewWin.right
sub eax,@stNewWin.left
mov @dwNewWidth,eax
;***************** 使时钟始终跟屏幕边对齐 ***************************
mov eax,@stDeskTop.right
sub eax,@stDeskTop.left
shr eax,1
mov ebx,@stDeskTop.bottom
sub ebx,@stDeskTop.top
shr ebx,1
mov ecx,@stOldWin.left
mov edx,@stOldWin.top
.if @stOldWin.left >= eax
add ecx,@dwOldWidth
sub ecx,@dwNewWidth
.endif
.if @stOldWin.top >= ebx
add edx,@dwOldHeight
sub edx,@dwNewHeight
.endif
invoke MoveWindow,hWinMain,ecx,edx,@dwNewWidth,@dwNewHeight,FALSE
invoke ShowWindow,hWinMain,SW_SHOW
call _FreshClock
ret
_ApplyLookSetup endp
;********************************************************************
_EnableItemLoop proc dwStartID:DWORD,dwLoop:DWORD,bFlags:DWORD
.while TRUE
invoke _EnableItem,dwStartID,bFlags
inc dwStartID
dec dwLoop
.break .if dwLoop == 0
.endw
ret
_EnableItemLoop endp
;********************************************************************
_CheckItemLoop proc dwStartID:DWORD,dwLoop:DWORD,bFlags:DWORD
.while TRUE
invoke _CheckItem,dwStartID,bFlags
inc dwStartID
dec dwLoop
.break .if dwLoop == 0
.endw
ret
_CheckItemLoop endp
;********************************************************************
_FreshLookDialog proc
test dwTempFlag,F_RND_BACK
.if ZERO?
;*************** 不允许随机选择背景 *********************************
invoke _CheckItem,IDL_RNDBACK,0
invoke _EnableItemLoop,IDL_B01,8,TRUE
mov eax,dwTempFlag
and eax,F_BACK_NO
shr eax,F_BACK_NO_
add eax,IDL_B01
invoke CheckRadioButton,hWinDialog,IDL_B01,IDL_B08,eax
.else
;*************** 随机选择背景 ***************************************
invoke _CheckItem,IDL_RNDBACK,1
invoke _EnableItemLoop,IDL_B01,8,FALSE
.endif
test dwTempFlag,F_RND_FONT
.if ZERO?
;*************** 不允许随机选择字形 *********************************
invoke _CheckItem,IDL_RNDNUMBER,0
invoke _EnableItemLoop,IDL_N01,8,TRUE
mov eax,dwTempFlag
and eax,F_FONT_NO
shr eax,F_FONT_NO_
add eax,IDL_N01
invoke CheckRadioButton,hWinDialog,IDL_N01,IDL_N08,eax
.else
;*************** 随机选择字形 ***************************************
invoke _CheckItem,IDL_RNDNUMBER,1
invoke _EnableItemLoop,IDL_N01,8,FALSE
.endif
call _PaintLookDialog
ret
_FreshLookDialog endp
;********************************************************************
_PaintLookDialog proc
local @stBmp:BITMAP,@hDC:DWORD
local @hBmpBack:DWORD,@hBmpNum:DWORD
local @dwNumX:DWORD,@dwNumY:DWORD
local @stRect:RECT
;*************** 取得背景图片编号 ***********************************
test dwTempFlag,F_RND_BACK
.if !ZERO?
mov al,3
call _Random
.else
mov eax,dwTempFlag
and eax,F_BACK_NO
shr eax,F_BACK_NO_
.endif
push eax
add eax,IDB_0
invoke LoadBitmap,hInstance,eax ;装入背景图片
mov @hBmpBack,eax
pop ebx
shl ebx,3 ;x 8
add ebx,offset dwOffsetTable
mov eax,[ebx]
mov @dwNumX,eax
mov eax,[ebx+4]
mov @dwNumY,eax
;*************** 取得数字图片编号 ***********************************
test dwTempFlag,F_RND_FONT
.if !ZERO?
mov al,3
call _Random
.else
mov eax,dwTempFlag
and eax,F_FONT_NO
shr eax,F_FONT_NO_
.endif
add eax,IDB_NUM0
invoke LoadBitmap,hInstance,eax ;装入数字图片
mov @hBmpNum,eax
invoke GetDC,hWinPic1
mov @hDC,eax
invoke GetObject,@hBmpBack,sizeof BITMAP,addr @stBmp
;*************** 删除预览1 BMP *************************************
invoke DeleteObject,hBmpLook1
invoke DeleteObject,hBmpLook1Mask
;*************** 建立预览1 BMP 和 MASK BMP *************************
invoke CreateCompatibleBitmap,@hDC,\
@stBmp.bmWidth,@stBmp.bmHeight
mov hBmpLook1,eax
invoke CreateCompatibleBitmap,@hDC,\
@stBmp.bmWidth,@stBmp.bmHeight
mov hBmpLook1Mask,eax
;*************** 从背景图片拷贝预览 BMP *****************************
invoke SelectObject,hDcLook1,hBmpLook1
invoke SelectObject,hDcLook1Mask,hBmpLook1Mask
invoke SelectObject,hDcTemp,@hBmpBack
invoke BitBlt,hDcLook1,0,0,\
@stBmp.bmWidth,@stBmp.bmHeight,hDcTemp,0,0,SRCCOPY
invoke BitBlt,hDcLook1Mask,0,0,\
@stBmp.bmWidth,@stBmp.bmHeight,hDcTemp,0,0,SRCCOPY
invoke _CreateMask,hDcLook1Mask,@stBmp.bmWidth,@stBmp.bmHeight
invoke SelectObject,hDcTemp,@hBmpNum
invoke _CreateClockPic,hDcLook1,hDcTemp,@dwNumX,@dwNumY
;*************** 刷新预览图片 ***************************************
invoke GetClientRect,hWinPic1,addr @stRect
mov eax,@stRect.right
sub eax,@stRect.left
sub eax,@stBmp.bmWidth
shr eax,1
mov @dwNumX,eax
mov eax,@stRect.bottom
sub eax,@stRect.top
sub eax,@stBmp.bmHeight
shr eax,1
mov @dwNumY,eax
;*************** 图片去背景 *****************************************
invoke BitBlt,hDcLook1,0,0,@stBmp.bmWidth,@stBmp.bmHeight,\
hDcLook1Mask,0,0,SRCAND
invoke BitBlt,hDcLook1Mask,0,0,@stBmp.bmWidth,@stBmp.bmHeight,\
hDcLook1Mask,0,0,DSTINVERT
invoke InvalidateRect,hWinPic1,NULL,TRUE
invoke UpdateWindow,hWinPic1
;*************** 背景挖空,准备画图 *********************************
invoke BitBlt,@hDC,@dwNumX,@dwNumY,@stBmp.bmWidth,@stBmp.bmHeight,\
hDcLook1Mask,0,0,SRCAND
invoke BitBlt,hDcLook1Mask,0,0,@stBmp.bmWidth,@stBmp.bmHeight,\
hDcLook1Mask,0,0,DSTINVERT
;*************** 更新到屏幕 *****************************************
invoke BitBlt,@hDC,@dwNumX,@dwNumY,@stBmp.bmWidth,@stBmp.bmHeight,\
hDcLook1,0,0,SRCPAINT
invoke DeleteObject,@hBmpBack
invoke DeleteObject,@hBmpNum
invoke ReleaseDC,hWinPic1,@hDC
invoke InvalidateRect,hWinPic2,NULL,TRUE
invoke UpdateWindow,hWinPic2
invoke GetDC,hWinPic2
mov @hDC,eax
invoke BitBlt,@hDC,0,0,76,160,\
hDcLook2,0,0,SRCCOPY
invoke ReleaseDC,hWinPic2,@hDC
invoke InvalidateRect,hWinPic3,NULL,TRUE
invoke UpdateWindow,hWinPic3
invoke GetDC,hWinPic3
mov @hDC,eax
invoke BitBlt,@hDC,0,0,76,160,\
hDcLook3,0,0,SRCCOPY
invoke ReleaseDC,hWinPic3,@hDC
ret
_PaintLookDialog endp
;********************************************************************
; 关于对话框中超级连接的窗口程序
;********************************************************************
HyperLinkProc proc hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
mov eax,uMsg
.if eax == WM_LBUTTONUP
invoke GetDlgCtrlID,hWnd
.if eax == ID_HOMEPAGE
invoke ShellExecute,0,0,offset szHomePage,0,0,0
.elseif eax == ID_EMAIL
invoke ShellExecute,0,0,offset szEmail,0,0,0
.endif
.elseif eax == WM_NCHITTEST
;将 WM_NCHITTEST 返回 TRUE 可以接收鼠标动作,实现按下功能 !
.elseif eax == WM_SETCURSOR
invoke SetCursor,hCursor
.else
invoke GetWindowLong,hWnd,GWL_USERDATA
invoke CallWindowProc,eax,hWnd,uMsg,wParam,lParam
ret
.endif
mov eax,TRUE
ret
HyperLinkProc endp
;********************************************************************
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -