Megosztás:


Időzítők használata

Ez a témakör bemutatja, hogyan hozhat létre és semmisíthet meg időzítőket, és hogyan használhat időzítőt az egér bemenetének a megadott időközönként történő csapdába ejtéséhez.

Ez a témakör a következő szakaszokat tartalmazza.

Időzítő létrehozása

Az alábbi példa a SetTimer függvényt használja két időzítő létrehozásához. Az első időzítő 10 másodpercenként, a második ötpercenként van beállítva.

// Set two timers. 
 
SetTimer(hwnd,             // handle to main window 
    IDT_TIMER1,            // timer identifier 
    10000,                 // 10-second interval 
    (TIMERPROC) NULL);     // no timer callback 
 
SetTimer(hwnd,             // handle to main window 
    IDT_TIMER2,            // timer identifier 
    300000,                // five-minute interval 
    (TIMERPROC) NULL);     // no timer callback 

Az időzítők által létrehozott WM_TIMER üzenetek feldolgozásához adjon hozzá egy WM_TIMER esetutasítást a hwnd paraméter ablakeljárásához.

case WM_TIMER: 
 
    switch (wParam) 
    { 
        case IDT_TIMER1: 
            // process the 10-second timer 
 
             return 0; 
 
        case IDT_TIMER2: 
            // process the five-minute timer 

            return 0; 
    } 

Az alkalmazások olyan időzítőt is létrehozhatnak, amelynek WM_TIMER üzeneteit nem a főablak eljárása, hanem egy alkalmazás által meghatározott visszahívási függvény dolgozza fel, ahogyan az alábbi kódmintában is látható, amely létrehoz egy időzítőt, és a MyTimerProc visszahívási függvényt használja az időzítő WM_TIMER üzeneteinek feldolgozásához.

// Set the timer. 
 
SetTimer(hwnd,                // handle to main window 
    IDT_TIMER3,               // timer identifier 
    5000,                     // 5-second interval 
    (TIMERPROC) MyTimerProc); // timer callback

A MyTimerProc hívási konvenciójának az TimerProc visszahívási függvényen kell alapulnia.

Ha az alkalmazás ablakfogópont megadása nélkül hoz létre időzítőt, az alkalmazásnak figyelnie kell WM_TIMER üzenetek üzenetsorát, és el kell küldenie őket a megfelelő ablakba.

HWND hwndTimer;   // handle to window for timer messages 
MSG msg;          // message structure 
 
    while (GetMessage(&msg, // message structure 
            NULL,           // handle to window to receive the message 
               0,           // lowest message to examine 
               0))          // highest message to examine 
    { 
 
        // Post WM_TIMER messages to the hwndTimer procedure. 
 
        if (msg.message == WM_TIMER) 
        { 
            msg.hwnd = hwndTimer; 
        } 
 
        TranslateMessage(&msg); // translates virtual-key codes 
        DispatchMessage(&msg);  // dispatches message to window 
    } 

Időzítő megsemmisítése

Az alkalmazásoknak a KillTimer függvénnyel kell megsemmisítenie a már nem szükséges időzítőket. Az alábbi példa megsemmisíti a IDT_TIMER1, IDT_TIMER2 és IDT_TIMER3 állandók által azonosított időzítőket.

// Destroy the timers. 
 
KillTimer(hwnd, IDT_TIMER1); 
KillTimer(hwnd, IDT_TIMER2); 
KillTimer(hwnd, IDT_TIMER3); 

Időzítőfüggvények használata az egér bemenetének csapdába ejtéséhez

Néha meg kell akadályozni a további bevitelt, miközben egérmutató van a képernyőn. Ennek egyik módja egy speciális rutin létrehozása, amely egy adott esemény bekövetkezéséig csapdába ejti az egér bemenetét. Sok fejlesztő úgy hivatkozik erre a rutinra, hogy "egérfogót épít".

Az alábbi példa a SetTimer és KillTimer függvényt használja az egér bemenetének csapdába ejtéséhez. SetTimer létrehoz egy időzítőt, amely 10 másodpercenként küld WM_TIMER üzenetet. Minden alkalommal, amikor az alkalmazás WM_TIMER üzenetet kap, rögzíti az egérmutató helyét. Ha az aktuális hely megegyezik az előző helyével, és az alkalmazás főablaka kis méretű, az alkalmazás az egérmutatót az ikonra helyezi. Amikor az alkalmazás bezárul, KillTimer leállítja az időzítőt.

HICON hIcon1;               // icon handle 
POINT ptOld;                // previous cursor location 
UINT uResult;               // SetTimer's return value 
HINSTANCE hinstance;        // handle to current instance 
 
//
// Perform application initialization here. 
//
 
wc.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(400)); 
wc.hCursor = LoadCursor(hinstance, MAKEINTRESOURCE(200)); 
 
// Record the initial cursor position. 
 
GetCursorPos(&ptOld); 
 
// Set the timer for the mousetrap. 
 
uResult = SetTimer(hwnd,             // handle to main window 
    IDT_MOUSETRAP,                   // timer identifier 
    10000,                           // 10-second interval 
    (TIMERPROC) NULL);               // no timer callback 
 
if (uResult == 0) 
{ 
    ErrorHandler("No timer is available."); 
} 
 
LONG APIENTRY MainWndProc( 
    HWND hwnd,          // handle to main window 
    UINT message,       // type of message 
    WPARAM  wParam,     // additional information 
    LPARAM  lParam)     // additional information 
{ 
 
    HDC hdc;        // handle to device context 
    POINT pt;       // current cursor location 
    RECT rc;        // location of minimized window 
 
    switch (message) 
    { 
        //
        // Process other messages. 
        // 
 
        case WM_TIMER: 
        // If the window is minimized, compare the current 
        // cursor position with the one from 10 seconds 
        // earlier. If the cursor position has not changed, 
        // move the cursor to the icon. 
 
            if (IsIconic(hwnd)) 
            { 
                GetCursorPos(&pt); 
 
                if ((pt.x == ptOld.x) && (pt.y == ptOld.y)) 
                { 
                    GetWindowRect(hwnd, &rc); 
                    SetCursorPos(rc.left, rc.top); 
                } 
                else 
                { 
                    ptOld.x = pt.x; 
                    ptOld.y = pt.y; 
                } 
            } 
 
            return 0; 
 
        case WM_DESTROY: 
 
        // Destroy the timer. 
 
            KillTimer(hwnd, IDT_MOUSETRAP); 
            PostQuitMessage(0); 
            break; 
 
        //
        // Process other messages. 
        // 
 
} 

Bár az alábbi példa azt is bemutatja, hogyan lehet az egérbemenetet csapdába csalni, az alkalmazás által definiált visszahívási függvényen MyTimerProcdolgozza fel a WM_TIMER üzenetet, nem pedig az alkalmazás üzenetsorán keresztül.

UINT uResult;               // SetTimer's return value 
HICON hIcon1;               // icon handle 
POINT ptOld;                // previous cursor location 
HINSTANCE hinstance;        // handle to current instance 
 
//
// Perform application initialization here. 
//
 
wc.hIcon = LoadIcon(hinstance, MAKEINTRESOURCE(400)); 
wc.hCursor = LoadCursor(hinstance, MAKEINTRESOURCE(200)); 
 
// Record the current cursor position. 
 
GetCursorPos(&ptOld); 
 
// Set the timer for the mousetrap. 
 
uResult = SetTimer(hwnd,      // handle to main window 
    IDT_MOUSETRAP,            // timer identifier 
    10000,                    // 10-second interval 
    (TIMERPROC) MyTimerProc); // timer callback 
 
if (uResult == 0) 
{ 
    ErrorHandler("No timer is available."); 
} 
 
LONG APIENTRY MainWndProc( 
    HWND hwnd,          // handle to main window 
    UINT message,       // type of message 
    WPARAM  wParam,     // additional information 
    LPARAM   lParam)    // additional information 
{ 
 
    HDC hdc;            // handle to device context 
 
    switch (message) 
    { 
    // 
    // Process other messages. 
    // 
 
        case WM_DESTROY: 
        // Destroy the timer. 
 
            KillTimer(hwnd, IDT_MOUSETRAP); 
            PostQuitMessage(0); 
            break; 
 
        //
        // Process other messages. 
        // 
 
} 
 
// MyTimerProc is an application-defined callback function that 
// processes WM_TIMER messages. 
 
VOID CALLBACK MyTimerProc( 
    HWND hwnd,        // handle to window for timer messages 
    UINT message,     // WM_TIMER message 
    UINT idTimer,     // timer identifier 
    DWORD dwTime)     // current system time 
{ 
 
    RECT rc; 
    POINT pt; 
 
    // If the window is minimized, compare the current 
    // cursor position with the one from 10 seconds earlier. 
    // If the cursor position has not changed, move the 
    // cursor to the icon. 
 
    if (IsIconic(hwnd)) 
    { 
        GetCursorPos(&pt); 
 
        if ((pt.x == ptOld.x) && (pt.y == ptOld.y)) 
        { 
            GetWindowRect(hwnd, &rc); 
            SetCursorPos(rc.left, rc.top); 
        } 
        else 
        { 
            ptOld.x = pt.x; 
            ptOld.y = pt.y; 
        } 
    } 
} 

Időzítők