Korzystanie z czasomierzy
W tym temacie pokazano, jak tworzyć i niszczyć czasomierze oraz jak używać czasomierza do wychwytowania danych wejściowych myszy w określonych odstępach czasu.
Ten temat zawiera następujące sekcje.
- Tworzenie czasomierza
- Niszczenie czasomierza
- używanie funkcji czasomierza do wychwytowania danych wejściowych myszy
- Tematy pokrewne
Tworzenie czasomierza
W poniższym przykładzie użyto funkcji SetTimer do utworzenia dwóch czasomierzy. Pierwszy czasomierz jest ustawiany co 10 sekund, drugi co pięć minut.
// 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
Aby przetworzyć komunikaty WM_TIMER generowane przez te czasomierze, dodaj instrukcję WM_TIMER przypadku do procedury okna dla parametru hwnd.
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;
}
Aplikacja może również utworzyć czasomierz, którego komunikaty WM_TIMER nie są przetwarzane przez procedurę głównego okna, ale przez funkcję wywołania zwrotnego zdefiniowanego przez aplikację, jak w poniższym przykładzie kodu, który tworzy czasomierz i używa funkcji wywołania zwrotnego MyTimerProc do przetwarzania komunikatów WM_TIMER czasomierza.
// Set the timer.
SetTimer(hwnd, // handle to main window
IDT_TIMER3, // timer identifier
5000, // 5-second interval
(TIMERPROC) MyTimerProc); // timer callback
Konwencja wywoływania dla MyTimerProc musi być oparta na funkcji TimerProc wywołania zwrotnego.
Jeśli aplikacja tworzy czasomierz bez określania uchwytu okna, musi monitorować kolejkę komunikatów dla komunikatów WM_TIMER i wysyłać je do odpowiedniego okna.
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
}
Niszczenie czasomierza
Aplikacje powinny używać funkcji KillTimer, aby zniszczyć czasomierze, które nie są już niezbędne. Poniższy przykład niszczy czasomierze identyfikowane przez stałe IDT_TIMER1, IDT_TIMER2 i IDT_TIMER3.
// Destroy the timers.
KillTimer(hwnd, IDT_TIMER1);
KillTimer(hwnd, IDT_TIMER2);
KillTimer(hwnd, IDT_TIMER3);
Używanie funkcji czasomierza do wychwytowania danych wejściowych myszy
Czasami należy zapobiec dalszemu wprowadzaniu danych, gdy na ekranie znajduje się wskaźnik myszy. Jednym ze sposobów osiągnięcia tego celu jest utworzenie specjalnej procedury, która wychwyci wprowadzanie myszy do momentu wystąpienia określonego zdarzenia. Wielu deweloperów nazywa tę procedurę "tworzeniem pułapki myszy".
W poniższym przykładzie użyto funkcji SetTimer i KillTimer w celu wychwycenia danych wejściowych myszy. SetTimer tworzy czasomierz, który wysyła komunikat WM_TIMER co 10 sekund. Za każdym razem, gdy aplikacja odbiera komunikat WM_TIMER, rejestruje lokalizację wskaźnika myszy. Jeśli bieżąca lokalizacja jest taka sama jak poprzednia lokalizacja, a główne okno aplikacji jest zminimalizowane, aplikacja przenosi wskaźnik myszy do ikony. Po zamknięciu aplikacji KillTimer zatrzymuje czasomierz.
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.
//
}
Poniższy przykład pokazuje również, jak przechwytywać dane wejściowe myszy, ale przetwarza komunikat WM_TIMER za pośrednictwem zdefiniowanej przez aplikację funkcji wywołania zwrotnego MyTimerProc, a nie za pośrednictwem kolejki komunikatów aplikacji.
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;
}
}
}
Tematy pokrewne