第6章 定時(shí)器和windows時(shí)間

1 定時(shí)器

相關(guān)api

//設(shè)置定時(shí)器
SetTimer
UINT SetTimer(
    HWND hWnd,  // handle of window for timer messages
    UINT nIDEvent,  // timer identifier
    UINT uElapse,   // time-out value
    TIMERPROC lpTimerFunc   // address of timer procedure 當(dāng)為NULL時(shí)會(huì)向窗口發(fā)送VM_TIMER消息
   );

WM_TIMER 消息的附加參數(shù)
wTimerID = wParam;            // timer identifier 
tmprc = (TIMERPROC *) lParam; // address of timer callback 
 

//撤銷定時(shí)器
KillTimer
BOOL KillTimer(
    HWND hWnd,  // handle of window that installed timer
    UINT uIDEvent   // timer identifier
   );   
 

源代碼
Timer.rc

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#include        <resource.h>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define DLG_MAIN        1
#define ICO_1           1
#define ICO_2           2
#define IDC_SETICON     100
#define IDC_COUNT       101
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//定義了兩個(gè)icon
ICO_1   ICON        "1.ico" //對(duì)話框的圖標(biāo)经柴,會(huì)取第一個(gè)ICON
ICO_2   ICON        "2.ico"


//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//定義一個(gè)對(duì)話框 name DIALOG x,y,w,h
DLG_MAIN DIALOG 50, 50, 113, 40
//對(duì)話框的style
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "定時(shí)器例子" //對(duì)話框標(biāo)題
FONT 9, "宋體" //對(duì)話框字體 
{
 ICON ICO_1, IDC_SETICON, 8, 9, 18, 21
 LTEXT "計(jì)數(shù):", -1, 35, 16, 25, 10
 LTEXT "", IDC_COUNT, 62, 16, 40, 10
}

匯編代碼
Timer.asm

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming 3rd Edition>
; by 羅云彬, http://www.win32asm.com.cn
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Timer.asm
; 定時(shí)器的使用例子
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令進(jìn)行編譯和鏈接:
; ml /c /coff Timer.asm
; rc Timer.rc
; Link /subsystem:windows Timer.obj Timer.res
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .386
        .model flat,stdcall
        option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定義
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include     windows.inc
include     user32.inc
includelib  user32.lib
include     kernel32.inc
includelib  kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ID_TIMER1   equ 1
ID_TIMER2   equ 2
ICO_1       equ 1
ICO_2       equ 2
DLG_MAIN    equ 1
IDC_SETICON equ 100
IDC_COUNT   equ 101
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 數(shù)據(jù)段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .data?
hInstance   dd      ?
hWinMain    dd      ?
dwCount     dd      ?
idTimer     dd      ?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代碼段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 定時(shí)器過程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcTimer  proc    _hWnd,_uMsg,_idEvent,_dwTime
        
        PUSHAD ;將通用寄存器壓棧 入棧順序?yàn)镋AX,ECX,EDX,EBX,ESP(初始值)狸窘,EBP,ESI,EDI.
        invoke  GetDlgItemInt,hWinMain,IDC_COUNT,NULL,FALSE
        ; GetDlgItemInt 獲取對(duì)話框指定控件文本,將其轉(zhuǎn)換為整數(shù)
        ;UINT GetDlgItemInt(
        ;    HWND hDlg, // handle to dialog box
        ;    int nIDDlgItem,    // control identifier
        ;    BOOL *lpTranslated,    // points to variable to receive success/failure indicator
        ;    BOOL bSigned   // specifies whether value is signed or unsigned
        ;   );
        inc eax
        invoke  SetDlgItemInt,hWinMain,IDC_COUNT,eax,FALSE
        ;BOOL SetDlgItemInt(
        ;    HWND hDlg, // handle of dialog box
        ;    int nIDDlgItem,    // identifier of control
        ;    UINT uValue,   // value to set
        ;    BOOL bSigned   // signed or unsigned indicator
        ;   );
        POPAD ;將通用寄存器恢復(fù)
        ret

_ProcTimer  endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口過程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain    proc    uses ebx edi esi,hWnd,uMsg,wParam,lParam

        mov eax,uMsg
;********************************************************************
        .if eax ==  WM_TIMER 
            ;處理WM_TIMER
            ;WM_TIMER 消息的附加參數(shù)
            ;wTimerID = wParam;            // timer identifier 
            ;tmprc = (TIMERPROC *) lParam; // address of timer callback 
            ;
            mov eax,wParam ;將定時(shí)器ID放入eax
            .if eax ==  ID_TIMER1 ;若是第1個(gè)定時(shí)器
                inc dwCount ;dwCount加1
                ;取dwCount的第1位 0/1
                mov eax,dwCount
                and eax,1 ;eax=0 or 1
                inc EAX ;eax=1 or 2 對(duì)應(yīng)ICO_1 ICO_2
                invoke  LoadIcon,hInstance,EAX ;加載icon
                ;修改ICON控件IDC_SETICON的圖標(biāo)
                invoke  SendDlgItemMessage,hWnd,IDC_SETICON,STM_SETIMAGE,IMAGE_ICON,EAX
                ;LONG SendDlgItemMessage(
                ;    HWND hDlg, // handle of dialog box
                   ; int nIDDlgItem,    // identifier of control
                   ; UINT Msg,  // message to send
                   ; WPARAM wParam, // first message parameter
                   ; LPARAM lParam  // second message parameter
                   ;);
                ;STM_SETIMAGE消息的附帶參數(shù)
                ;wParam = (WPARAM) fImageType;       // image-type flag IMAGE_ICON/IMAGE_BITMAP/...
                ;lParam = (LPARAM) (HANDLE) hImage;  // handle of the image
            .elseif eax ==  ID_TIMER2 ;若是第2個(gè)定時(shí)器
                invoke  MessageBeep,-1 ;調(diào)用蜂鳴器
            .endif
;********************************************************************
        .elseif eax ==  WM_INITDIALOG ;窗口初始化時(shí)
            push    hWnd
            pop hWinMain ;將hWnd賦值給hWinMain
            invoke  SetTimer,hWnd,ID_TIMER1,250,NULL ;創(chuàng)建定時(shí)器ID_TIMER1 周期為250ms
            invoke  SetTimer,hWnd,ID_TIMER2,2000,NULL ;創(chuàng)建定時(shí)器ID_TIMER2 周期為2s
            invoke  SetTimer,NULL,NULL,1000,addr _ProcTimer ;創(chuàng)建定時(shí)器ID_TIMER3 周期為1s 定時(shí)器回調(diào)函數(shù)為_ProcTimer
            mov idTimer,EAX ;將第3個(gè)定時(shí)器的id保存至idTimer
;********************************************************************
        .elseif eax ==  WM_CLOSE
            ;在窗口退出之前撤銷3個(gè)定時(shí)器
            invoke  KillTimer,hWnd,ID_TIMER1
            invoke  KillTimer,hWnd,ID_TIMER2
            invoke  KillTimer,NULL,idTimer
            ;結(jié)束對(duì)話框
            invoke  EndDialog,hWnd,NULL
;********************************************************************
        .else
            mov eax,FALSE
            ret
        .endif
        mov eax,TRUE
        ret

_ProcDlgMain    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
        invoke  GetModuleHandle,NULL
        mov hInstance,eax
        invoke  DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
        invoke  ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        end start

Makefile

NAME = Timer
OBJS = $(NAME).obj
RES  = $(NAME).res

LINK_FLAG = /subsystem:windows
ML_FLAG = /c /coff

$(NAME).exe: $(OBJS) $(RES)
    Link $(LINK_FLAG) $(OBJS) $(RES)

.asm.obj:
    ml $(ML_FLAG) $<
.rc.res:
    rc $<

clean:
    del *.obj
    del *.res

2 windows時(shí)間

2.1 windows時(shí)間的獲取和設(shè)置

GetLocalTime SYSTEMTIME
GetSystemTime

2.2 計(jì)算時(shí)間間隔

GetTickCount

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坯认,一起剝皮案震驚了整個(gè)濱河市翻擒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌牛哺,老刑警劉巖陋气,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異引润,居然都是意外死亡巩趁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門淳附,熙熙樓的掌柜王于貴愁眉苦臉地迎上來议慰,“玉大人,你說我怎么就攤上這事奴曙”鸢迹” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵洽糟,是天一觀的道長(zhǎng)番川。 經(jīng)常有香客問我,道長(zhǎng)脊框,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任践啄,我火速辦了婚禮浇雹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屿讽。我一直安慰自己昭灵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布伐谈。 她就那樣靜靜地躺著烂完,像睡著了一般。 火紅的嫁衣襯著肌膚如雪诵棵。 梳的紋絲不亂的頭發(fā)上抠蚣,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音履澳,去河邊找鬼嘶窄。 笑死怀跛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的柄冲。 我是一名探鬼主播吻谋,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼现横!你這毒婦竟也來了漓拾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤戒祠,失蹤者是張志新(化名)和其女友劉穎骇两,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體得哆,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脯颜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贩据。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栋操。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖饱亮,靈堂內(nèi)的尸體忽然破棺而出矾芙,到底是詐尸還是另有隱情苟蹈,我是刑警寧澤寝姿,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布往枷,位于F島的核電站宦焦,受9級(jí)特大地震影響实柠,放射性物質(zhì)發(fā)生泄漏毙玻。R本人自食惡果不足惜谬以,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一门扇、第九天 我趴在偏房一處隱蔽的房頂上張望斗锭。 院中可真熱鬧地淀,春花似錦、人聲如沸岖是。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豺撑。三九已至烈疚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間聪轿,已是汗流浹背爷肝。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人阶剑。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓跃巡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親牧愁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子素邪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容