回覆列表
  • 1 # 使用者3926722064098

    先請看SetTimer這個API函式的原型

    UINT_PTR SetTimer(

    HWND hWnd, // 視窗控制代碼

    UINT_PTR nIDEvent, // 定時器ID,多個定時器時,可以透過該ID判斷是哪個定時器

    UINT uElapse, // 時間間隔,單位為毫秒

    TIMERPROC lpTimerFunc // 回撥函式

    );

    例如

    SetTimer(m_hWnd,1,1000,NULL); //一個1秒觸發一次的定時器

    在MFC程式中SetTimer被封裝在CWnd類中,呼叫就不用指定視窗控制代碼了

    於是SetTimer函式的原型變為:

    UINT SetTimer(UINT nIDEvent,UINT nElapse,void(CALLBACK EXPORT *lpfnTimer)(HWND,UINT ,YINT ,DWORD))

    當使用SetTimer函式的時候,就會生成一個計時器。函式中nIDEvent指的是計時器的標識,也就是名字。nElapse指的是時間間隔,也就是每隔多長時間觸發一次事件。第三個引數是一個回撥函式,在這個函數里,放入你想要做的事情的程式碼,你可以將它設定為NULL,也就是使用系統預設的回撥函式,系統預設認的是onTime函式。這個函式怎麼生成的呢?你需要在需要計時器的類的生成onTime函式:在ClassWizard裡,選擇需要計時器的類,新增WM_TIME訊息對映,就自動生成onTime函數了。然後在函數里新增程式碼,讓程式碼實現功能。每隔一段時間就會自動執行一次。

    例:

    SetTimer(1,1000,NULL);

    1:計時器的名稱;

    1000:時間間隔,單位是毫秒;

    NULL:使用onTime函式。

    當不需要計時器的時候呼叫KillTimer(nIDEvent);

    例如:KillTimer(1);

    當要使用回撥函式時,

    此方法首先寫一個如下格式的回撥函式

    void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime);

    然後再用SetTimer(1,100,TimerProc)函式來建一個定時器,第三個引數就是回撥函式地址。

    或許你會問,如果我要加入兩個或者兩個以上的 timer怎麼辦?

    繼續用SetTimer函式吧,上次的timer的ID是1,這次可以是2,3,4。。。。

    SetTimer(2,1000,NULL);

    SetTimer(3,500,NULL);

    嗯,WINDOWS會協調他們的。當然onTimer函式體也要發生變化,要在函式體內新增每一個timer的處理程式碼:

    onTimer(nIDEvent)

    {

    switch(nIDEvent)

    {

    case 1:........;

    break;

    case 2:.......;

    break;

    case 3:......;

    break;

    }

    }

  • 中秋節和大豐收的關聯?
  • 洗衣機一直放水但是不洗衣,是怎麼回事?