Menggunakan Timer
Topik ini menunjukkan cara membuat dan menghancurkan timer, dan cara menggunakan timer untuk menjebak input mouse pada interval yang ditentukan.
Topik ini berisi bagian berikut.
Membuat Timer
Contoh berikut menggunakan fungsi SetTimer untuk membuat dua timer. Timer pertama diatur untuk setiap 10 detik, yang kedua untuk setiap lima menit.
// 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
Untuk memproses pesan WM_TIMER yang dihasilkan oleh timer ini, tambahkan pernyataan kasus WM_TIMER ke prosedur jendela untuk parameter 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;
}
Aplikasi juga dapat membuat timer yang pesan WM_TIMER-nya diproses bukan oleh prosedur jendela utama tetapi oleh fungsi panggilan balik yang ditentukan aplikasi, seperti dalam sampel kode berikut, yang membuat timer dan menggunakan fungsi panggilan balik MyTimerProc untuk memproses pesan WM_TIMER timer.
// Set the timer.
SetTimer(hwnd, // handle to main window
IDT_TIMER3, // timer identifier
5000, // 5-second interval
(TIMERPROC) MyTimerProc); // timer callback
Konvensi panggilan untuk MyTimerProc harus didasarkan pada fungsi panggilan balik TimerProc .
Jika aplikasi Anda membuat timer tanpa menentukan handel jendela, aplikasi Anda harus memantau antrean pesan untuk pesan WM_TIMER dan mengirimkannya ke jendela yang sesuai.
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
}
Menghancurkan Timer
Aplikasi harus menggunakan fungsi KillTimer untuk menghancurkan timer yang tidak lagi diperlukan. Contoh berikut menghancurkan timer yang diidentifikasi oleh konstanta IDT_TIMER1, IDT_TIMER2, dan IDT_TIMER3.
// Destroy the timers.
KillTimer(hwnd, IDT_TIMER1);
KillTimer(hwnd, IDT_TIMER2);
KillTimer(hwnd, IDT_TIMER3);
Menggunakan Fungsi Timer untuk Menjebak Input Mouse
Terkadang perlu untuk mencegah lebih banyak input saat Anda memiliki penunjuk mouse di layar. Salah satu cara untuk mencapai hal ini adalah dengan membuat rutinitas khusus yang menjebak input mouse sampai peristiwa tertentu terjadi. Banyak pengembang menyebut rutinitas ini sebagai "membangun perangkap tikus."
Contoh berikut menggunakan fungsi SetTimer dan KillTimer untuk menjebak input mouse. SetTimer membuat timer yang mengirim pesan WM_TIMER setiap 10 detik. Setiap kali aplikasi menerima pesan WM_TIMER , aplikasi merekam lokasi penunjuk mouse. Jika lokasi saat ini sama dengan lokasi sebelumnya dan jendela utama aplikasi diminimalkan, aplikasi memindahkan penunjuk mouse ke ikon. Ketika aplikasi ditutup, KillTimer menghentikan timer.
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.
//
}
Meskipun contoh berikut juga menunjukkan kepada Anda cara menjebak input mouse, ia memproses pesan WM_TIMER melalui fungsi panggilan balik yang ditentukan aplikasi MyTimerProc, bukan melalui antrean pesan aplikasi.
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;
}
}
}
Topik terkait