Đoạn chương trình sau cũng khai báo sử dụng một bộđịnh thời gian, nhưng khai báo trực tiếp, tức là khi hết thời gian chờ thay vì truyền thông điệp WM_TIMER thì Windows gọi hàm
TimerProc thực hiện.
Chương trình khi thực thi sẽ xuất ra một dạng đồng hồ điện tử theo dạng : giờ : phút :giây.
#include <time.h>
#include "stdio.h"
#define IDT_TIMER1 1
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
lParam)
{
PAINTSTRUCT ps;
HDC hdc;
/* Khai báo biến lưu các giá trị không gian*/
struct tm *newtime;
time_t CurTime;
TCHAR str [255];
RECT rc;
/* Biến LOGFONT để tạo font mới*/
LOGFONT lf;
HFONT oldFont, font;
COLORREF color = RGB (255, 0, 0), oldColor;
switch ( message )
{
case WM_CREATE:
/* khởi tạo bộđịnh thời gian, và khai báo hàm xử lý Timer*/
SetTimer ( hWnd, IDT_TIMER1, 1000, ( TIMERPROC ) TimerProc );
break;
case WM_PAINT:
hdc = BeginPaint ( hWnd, &ps );
/* Lấy giờđồng hồ hệ thống*/
newtime = localtime ( &CurTime );
GetClientRect ( hWnd, &rc );
/* Tạo chuỗi xuất ra màn hình*/
sprintf(str,"Gio hien tai : %d gio: %d phut: %d giay", newtime->tm_hour,newtime->tm_min, newtime- >tm_sec);
/* Thiết lập màu kí tự xuất*/
oldColor = SetTextColor ( hdc, color );
/* Tạo font riêng để dùng*/
memset ( &lf, 0, sizeof ( LOGFONT ) );
lf.lfHeight = 50;
strcpy ( lf.lfFaceName, "Tahoma" );
font = CreateFontIndirect ( &lf );
oldFont = ( HFONT ) SelectObject ( hdc,font );
/* Xuất ra màn hình*/
DrawText ( hdc, str, strlen(str), &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE );
/* Lấy lại các giá trị mặc định*/ SetTextColor ( hdc,oldColor ); SelectObject ( hdc,oldFont ); DeleteObject ( font ); EndPaint ( hWnd, &ps ); break; case WM_DESTROY: PostQuitMessage ( 0 ); break; default:
returnDefWindowProc ( hWnd, message, wParam, lParam );
return 0;
}
/* Hàm xử lý của Timer*/
VOID CALLBACK TimerProc( HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
/* Hàm này đơn giản yêu cầu tô lại vùng làm việc*/
RECT rc;
GetClientRect ( hwnd, &rc );
InvalidateRect ( hwnd, &rc, TRUE );