2014-10-31 41 views
0

有什麼方法可以獲取由SetTimer函數創建的計時器的當前進度?如何獲取使用SetTimer()創建的計時器的進度

+0

你說的 '目前的進展' 是什麼意思?你是否希望瞭解:(a)最初創建多久或(b)最後一次發射多久或(c)多長時間纔會發射? – enhzflep 2014-10-31 16:02:46

+2

否。啓動計時器時,將GetTickCount()的返回值存儲在變量中。在WM_TIMER處理程序中更新它。現在你總是知道剩下多少時間,只需從GetTickCount()中減去該變量值即可。 – 2014-10-31 16:10:32

+0

GetTickCount()的解決方案看起來很合理,只要我實現它,我就會添加一個答案。 – 2014-10-31 16:18:09

回答

1

下面是漢斯評論的實現。單擊該按鈕可顯示下一個計劃的(預期的)WM_TIMER消息的剩餘時間。通過在調試模式下構建,我得到一個控制檯來顯示我的消息,因爲它是一種既快速又簡單(讀取:骯髒)的方式來同時獲得GUI和控制檯。

的main.cpp

#include <windows.h> 
#include <commctrl.h> 
#include <stdio.h> 
#include "resource.h" 

HINSTANCE hInst; 

DWORD tickCountInitial; 
DWORD timerInterval = 10000; 
DWORD nextTimerFired; 

BOOL CALLBACK DlgMain(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(uMsg) 
    { 
     case WM_INITDIALOG: 
     { 
      tickCountInitial = GetTickCount(); 
      SetTimer(hwndDlg, 666, timerInterval, NULL); 
      nextTimerFired = tickCountInitial + timerInterval; 
     } 
     return TRUE; 

     case WM_TIMER: 
     { 
      DWORD tickCountCurrent = GetTickCount(); 
      printf("Ticks elapsed: %d\n", tickCountCurrent - tickCountInitial); 
      nextTimerFired = tickCountCurrent + timerInterval; 
      MessageBeep(MB_OK); 
     } 
     return 0; 

     case WM_CLOSE: 
     { 
      EndDialog(hwndDlg, 0); 
     } 
     return TRUE; 

     case WM_COMMAND: 
     { 
      switch(LOWORD(wParam)) 
      { 
       case IDC_BUTTON1: 
       { 
        DWORD tickCountCurrent = GetTickCount(); 
        printf("Ticks till next WM_TIMER message: %d\n", nextTimerFired - tickCountCurrent); 
       } 
       break; 
      } 
     } 
     return TRUE; 
    } 
    return FALSE; 
} 

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
{ 
    hInst=hInstance; 
    InitCommonControls(); 
    return DialogBox(hInst, MAKEINTRESOURCE(DLG_MAIN), NULL, (DLGPROC)DlgMain); 
} 

RESOURCE.H

​​

RESOURCE.RC

// Generated by ResEdit 1.6.2 
// Copyright (C) 2006-2014 
// http://www.resedit.net 

#include <windows.h> 
#include <commctrl.h> 
#include <richedit.h> 
#include "resource.h" 




// 
// Dialog resources 
// 
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL 
DLG_MAIN DIALOG 0, 0, 186, 95 
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU 
CAPTION "Dialog" 
FONT 8, "Ms Shell Dlg" 
{ 
    PUSHBUTTON  "Check Remaining", IDC_BUTTON1, 41, 32, 104, 31, 0, WS_EX_LEFT 
} 



// 
// Manifest resources 
// 
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL 
1     RT_MANIFEST ".\\manifest.xml"