Uso de temporizadores
En este tema se muestra cómo crear y destruir temporizadores y cómo usar un temporizador para interceptar la entrada del mouse a intervalos especificados.
En este tema se incluyen las siguientes secciones.
- Creación de un temporizador
- Destruir un temporizador
- Uso de funciones de temporizador para interceptar la entrada del mouse
- Temas relacionados
Creación de un temporizador
En el ejemplo siguiente se usa la función SetTimer para crear dos temporizadores. El primer temporizador se establece por cada 10 segundos, el segundo por cada cinco minutos.
// 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
Para procesar los mensajes de WM_TIMER generados por estos temporizadores, agregue una instrucción case de WM_TIMER al procedimiento de ventana para el parámetro 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;
}
Una aplicación también puede crear un temporizador cuya WM_TIMER mensajes no se procesan mediante el procedimiento de ventana principal, sino mediante una función de devolución de llamada definida por la aplicación, como en el ejemplo de código siguiente, que crea un temporizador y usa la función de devolución de llamada MyTimerProc para procesar los mensajes de WM_TIMER del temporizador.
// Set the timer.
SetTimer(hwnd, // handle to main window
IDT_TIMER3, // timer identifier
5000, // 5-second interval
(TIMERPROC) MyTimerProc); // timer callback
La convención de llamada para MyTimerProc debe basarse en la función de devolución de llamada TimerProc .
Si la aplicación crea un temporizador sin especificar un identificador de ventana, la aplicación debe supervisar la cola de mensajes para WM_TIMER mensajes y enviarlos a la ventana adecuada.
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
}
Destruir un temporizador
Las aplicaciones deben usar la función KillTimer para destruir temporizadores que ya no son necesarios. En el ejemplo siguiente se destruyen los temporizadores identificados por las constantes IDT_TIMER1, IDT_TIMER2 y IDT_TIMER3.
// Destroy the timers.
KillTimer(hwnd, IDT_TIMER1);
KillTimer(hwnd, IDT_TIMER2);
KillTimer(hwnd, IDT_TIMER3);
Uso de funciones de temporizador para interceptar la entrada del mouse
A veces es necesario evitar más entradas mientras tiene un puntero del mouse en la pantalla. Una manera de lograrlo es crear una rutina especial que intercepte la entrada del mouse hasta que se produzca un evento específico. Muchos desarrolladores hacen referencia a esta rutina como "crear una trampa de mouse".
En el ejemplo siguiente se usan las funciones SetTimer y KillTimer para interceptar la entrada del mouse. SetTimer crea un temporizador que envía un mensaje de WM_TIMER cada 10 segundos. Cada vez que la aplicación recibe un mensaje de WM_TIMER , registra la ubicación del puntero del mouse. Si la ubicación actual es la misma que la ubicación anterior y la ventana principal de la aplicación se minimiza, la aplicación mueve el puntero del mouse al icono. Cuando se cierra la aplicación, KillTimer detiene el temporizador.
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.
//
}
Aunque en el ejemplo siguiente también se muestra cómo interceptar la entrada del mouse, procesa el mensaje de WM_TIMER a través de la función de devolución de llamada definida por la aplicación MyTimerProc, en lugar de a través de la cola de mensajes de la aplicación.
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;
}
}
}
Temas relacionados