因為工作太忙,好久沒寫程序代碼了,不過編寫程序的樂趣令我樂此不疲。
天天跟電腦打交道,一忙起來就忘了休息,弄得眼睛都花了~
為了保護眼睛,偶決定寫一個定時強制休息的程序~
雖然現在這類程序已有不少,不過DIY一下還是不錯的~
先考慮實現倒計時提示窗口,打算讓該窗口漸入漸出~
這裡用封裝在user32.dll中的API函數AnimateWindow來實現。
函數原型為:
BOOLAnimateWindow(
HWNDhwnd,//指定產生動畫窗口的句柄;
DWORDdwTime,//指明動畫持續的時間(以微秒計),完成一個動畫的標准時間為200微秒;
DWORDdwFlags//指定動畫類型。這個參數可以是一個或多個標志的組合。
);
dwFlags有效值::
AW_SLIDE:使用滑動類型。缺省為滾動類型。使用AW_CENTER標志時被忽略;
AW_ACTIVATE:激活窗口。在使用了AW_HIDE標志後不能使用這個標志;
AW_BLEND:實現淡出效果。只有當hWnd為頂層窗口的時候才可以使用此標志;
AW_HIDE:隱藏窗口,缺省則顯示窗口;
AW_CENTER:若使用了AW_HIDE標志,則使窗口向內重疊,即收縮窗口;若未使用AW_HIDE標志,則使窗口向外擴展,即展開窗口;
AW_HOR_POSITIVE:自左向右顯示窗口。該標志可以在滾動動畫和滑動動畫中使用。當使用AW_CENTER標志時,該標志將被忽略;
AW_VER_POSITIVE:自頂向下顯示窗口。該標志可以在滾動動畫和滑動動畫中使用。當使用AW_CENTER標志時,該標志將被忽略;
AW_VER_NEGATIVE:自下向上顯示窗口。該標志可以在滾動動畫和滑動動畫中使用。當使用AW_CENTER標志時,該標志將被忽略;
返回值:如果函數成功,返回值為非零;如果函數失敗,返回值為零。
注:如果
1、窗口使用了窗口邊界;
2、窗口已經可見仍要顯示窗口;
3、窗口已經隱藏仍要隱藏窗口。
函數調用將失敗。
演示代碼(下載地址:download.csdn.net/source/636309):
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
FileName: AninWin.asm
Author: Purple Endurer
Functiion: Demo the way to use AnimateWindow()
DevEnv: Win XP SP2 + MASM32 v7
log
------------------------------
2008-09-18 Created!
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.586
.model flat, stdcall
option casemap:none
------------------
incboth macro incl
include d:\masm32\include\incl.inc
includelib d:\masm32\lib\incl.lib
endm
include d:\masm32\include\windows.inc
incboth kernel32
incboth user32
incboth gdi32
incboth comctl32
incboth shell32
prototypes
DlgProc PROTO :HWND, :UINT, :WPARAM, :LPARAM
.const
IDD_dlgSetState equ 1000
.data
g_szAnimWin db "AnimateWindow", 0
g_szUser32Dll db "user32.dll", 0
g_szEditCls db "edit", 0
.data?
hInstance HINSTANCE ?
pAnimateWindow DD ?
.code
start:
invoke GetModuleHandle, NULL
mov [hInstance], eax
invoke DialogBoxParam, [hInstance], IDD_dlgSetState, NULL, OFFSET DlgProc, NULL
invoke ExitProcess, NULL
invoke InitCommonControls
DlgProc proc hWnd:HWND, wMsg:UINT, lParam:LPARAM, wParam:WPARAM
.if wMsg == WM_INITDIALOG
--- 獲取AnimateWindow()地址
invoke SendMessage, [hWnd], WM_SETTEXT, NULL, OFFSET g_szAnimWin
invoke GetModuleHandle, OFFSET g_szUser32Dll
invoke GetProcAddress, eax, OFFSET g_szAnimWin
mov [pAnimateWindow], eax
--- 如果取得地址,則漸入顯示對話框窗口
.if [pAnimateWindow]
push AW_BLEND + AW_ACTIVATE
push 400h time
push [hWnd] window Handle
call [pAnimateWindow]
.endif
invoke InvalidateRect, hWnd, 0, TRUE
.elseif wMsg == WM_CLOSE
--- 如果取得地址,則漸出關閉對話框窗口
.if [pAnimateWindow]
push AW_BLEND + AW_HIDE
push 400h
push [hWnd]
call [pAnimateWindow]
.endif
invoke EndDialog, [hWnd], NULL
.else
mov eax, FALSE
ret
.endif
xor eax, eax
ret
DlgProc endp
end start
rsrc.rc
#include "\masm32\include\resource.h"
#define IDC_lblAppInfo 3009
#define IDD_dlgSetState 1000
IDD_dlgSetState DIALOG 10, 10, 120, 114
STYLE 0x0004 | DS_CENTER | WS_CAPTION | DS_SYSMODAL | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "Get Color"
FONT 9, "宋體"
{
LTEXT "[email protected]\n2004.04.02 廣西河池\n開發環境:MASM32 V8", IDC_lblAppInfo, 0, 75, 105, 30, WS_DISABLED + SS_CENTER
}