�������� Linux Tags
8. ��ʱ��
����֮�£�Windows��ʱ���ƺ�������̺ͻ����豸��Ҫ�����Ҷ�����Ӧ�ó�ʽ��˵ȷʵ��ˡ����ǣ���ʱ������������Ϊ��Ҫ��Ҫ�ö࣬����ֻ��춼�ʱ��ʽ����������ڹ������е�Windowsʱ�Ӻ���һ���е�����ʱ�ӳ�ʽ��������Windows��ʱ��������Ӧ�ã���Щ���ܲ�����ô���ԣ�
��һ��Ӧ�ÿ��Ա�֤��ʽ���˳��Ӵ�ѶϢ������ʽ�ᣬ�ܹ����µõ����ơ��ڴ����ʱ����£���ʽ���ܹ�֪����ʱ��һ��ѶϢ�ᵽ����
��ʱ������
��
������ͨ������SetTimer��ʽΪ����Windows��ʽ����һ����ʱ����SetTimer��һ��ʱ������ΧΪ1���뵽4,294,967,295���루����50�죩��������̬���������ֵָʾWindowsÿ�����ʱ������ij�ʽ����WM_TIMERѶϢ�����磬������Ϊ1000���룬��ôWindows��ÿ�����ʽ����һ��WM_TIMERѶϢ��
�����ij�ʽ�����ʱ��ʱ��������KillTimer��ʽ��ֹͣ��ʱ��ѶϢ���ڴ���WM_TIMERѶϢʱ��������ͨ������KillTimer��ʽ����дһ��������һ�Ρ��ļ�ʱ����KillTimer�������ѶϢ��������δ��������WM_TIMERѶϢ���Ӷ�ʹ��ʽ�ں���KillTimer֮��Ͳ����ٽ��յ�WM_TIMERѶϢ��
ϵͳ�ͼ�ʱ��
��
Windows��ʱ����PCӲ���ROM BIOS�ܹ���֮��ʱ��һ����Լòµ¥µï¿½ï¿½ï¿½ï¿½ä¡£ï¿½Øµï¿½Windows��ǰ��MS-DOS��ʽд�������£�Ӧ�ó�ʽ�ܹ�ͨ�������߳�Ϊtimer tick��BIOS�ж���ʵ��ʱ�ӻ��ʱ����һЩΪMS-DOS��д�ij�ʽ�Լ��������Ӳ���ж���ʵ��ʱ�Ӻͼ�ʱ������Щ�ж�ÿ54.915�������һ�Σ����ߴ�Լÿ��18.2������Ôʼ��IBM PC��΢������ʱ��ֵ4.772720 MHz��218������������
WindowsӦ�ó�ʽ������BIOS�жϣ��෴�أ�Windows��������Ӳ���жϣ�����Ӧ�ó�ʽ�Ͳ��ؽ��д��������Ŀǰӵ�м�ʱ����ÿ����ʽ��Windows����һ��ÿ��Ӳ��timer tick���ٵļ������������������0ʱ��Windows��Ӧ�ó�ʽѶϢ�����з���һ��WM_TIMERѶϢ��������������Ϊ�����ֵ��
��ΪWindowsӦ�ó�ʽ��������ѶϢ������ȡ��WM_TIMERѶϢ���������ij�ʽ�ڽ�����������ʱ���ص���WM_TIMERѶϢ�������ж��˳�ʽ�����ⷽ�棬��ʱ������춼��̺ͻ���������ʽ������ͬ��Ӳ���ж��¼���Windows����Щ�¼�����Ϊ���ɡ��ṹ����˳�򻯵�ѶϢ��
��Windows 98�У���ʱ�������µ�PC��ʱ��һ������55����Ľ����ȡ���Microsoft Windows NT�У���ʱ���Ľ�����Ϊ10���롣
WindowsӦ�ó�ʽ�����Ը����Щ�����ȵ�Ƶ�ʣ���Windows 98�£�ÿ��18.2�Σ���Windows NT�£�ÿ���Լ100�Σ�����WM_TIMERѶϢ����SetTimer������ָ����ʱ�������ǽ�β��tick���������������磬1000����ļ������54.925���룬�õ�18.207��tick����β����18��tick����ʵ������989���롣��ÿ��С�55����ļ����ÿ��tick�������һ��WM_TIMERѶϢ��
��ʱ��ѶϢ���Ƿ�ͬ����
��
��Ϊ��ʱ��ʹ��Ӳ���ʱ���жϣ���ʽд������ʱ����⣬��Ϊ���ǵij�ʽ���ͬ���ر��ж�������WM_TIMERѶϢ��
Ȼ����WM_TIMERѶϢ�����Ƿ�ͬ���ġ�WM_TIMERѶϢ����������ѶϢ����֮�У�������ѶϢ������һ����ˣ������SetTimer������ָ�����Ϊ1000���룬��ô���ܱ�֤��ʽÿ1000�������989����ͻ��յ�һ��WM_TIMERѶϢ�����������ʽ��ִ���¼�����һ�룬�ڴ��ڼ��ڣ����ij�ʽ���ղ����κ�WM_TIMERѶϢ��������ʹ�ñ��µij�ʽ��չʾ��һ�㡣��ʵ�ϣ� Windows��WM_TIMERѶϢ�Ĵ����dz�����춶�WM_PAINTѶϢ�Ĵ�����������ѶϢ���ǵ�����˳��ģ���ʽֻ����ѶϢ������û������ѶϢʱ�Ž������ǡ�
WM_TIMER������һ�����WM_PAINT���ƣ�Windows���ܳ�����ѶϢ�����з�����WM_TIMERѶϢ�����ǽ������WM_TIMERѶϢ��ϳ�һ��ѶϢ����ˣ�Ӧ�ó�ʽ����һ���յ����������ѶϢ�����ܿ����ڶ�ʱ���ڵõ�����WM_TIMERѶϢ��Ӧ�ó�ʽ����ȷ�����ִ�����ʽ�����µ�WM_TIMERѶϢ����©������Ŀ��
������WM_TIMERѶϢ��������Ҫ����ʱ����ʾ��ʽ����ʽ�������ܾ���ͳ��WM_TIMERѶϢ����Ŀ����ʱ���ڱ������棬���ǽ���д����ÿ�����һ�ε�ʱ�ӳ�ʽ�������Կ������������һ�㣩��
Ϊ�˷������������������ʱ��ʱ���ҽ�ʹ�á�ÿ��õ�һ��WM_TIMERѶϢ���������������������ס����ЩѶϢ���Ǿ�ȷ��tick�жϡ�
��ʱ����ʹ�ã����ַ���
��
�������Ҫ��������ʽִ���ڼ䶼ʹ�ü�ʱ������ô�����ô�WinMain��ʽ�л����ڴ���WM_CREATEѶϢʱ����SetTimer�������˳�WinMain���ӦWM_DESTROYѶϢʱ����KillTimer�����ݺ���SetTimerʱʹ�õIJ����������������ַ���֮һʹ�ü�ʱ����
����һ
��
��������һ�ַ���������Windows��WM_TIMERѶϢ���͵�Ӧ�ó�ʽ�������Ӵ�ѶϢ������ʽ�У�SetTimer����������ʾ��
SetTimer (hwnd, 1, uiMsecInterval, NULL) ;
��һ�����������Ӵ�ѶϢ������ʽ������WM_TIMERѶϢ���Ӵ����š��ڶ��������Ǽ�ʱ��ID������һ����0��ֵ�������������мٶ�Ϊ1��������������һ��32λԪ���������������Ժ���Ϊ��λָ��һ��ʱ������һ��60,000��ֵ��ʹWindowsÿ���ӷ���һ��WM_TIMERѶϢ��
������ͨ������
KillTimer (hwnd, 1) ;
���κ�ʱ��ֹͣWM_TIMERѶϢ����ʹ���ڴ���WM_TIMERѶϢ�����˺�ʽ�ĵڶ���������SetTimer���������õ�ͬһ����ʱ��ID������ֹ��ʽ֮ǰ����Ӧ�û�ӦWM_DESTROYѶϢֹͣ�κλ�ļ�ʱ����
�������Ӵ�ѶϢ������ʽ�յ�һ��WM_TIMERѶϢʱ��wParam������춼�ʱ����IDֵ����������Ϊ1����lParam����Ϊ0�������Ҫ�趨�����ʱ������ô��ÿ����ʱ����ʹ�ò�ͬ�ļ�ʱ��ID��wParam��ֵ���洫�ݵ��Ӵ�ѶϢ������ʽ��WM_TIMERѶϢ�IJ�ͬ����ͬ��Ϊ��ʹ��ʽ�����пɶ��ԣ�������ʹ��#define�������岻ͬ�ļ�ʱ��ID��
#define TIMER_SEC 1 #define TIMER_MIN 2
Ȼ��������ʹ������SetTimer�������趨������ʱ����
SetTimer (hwnd, TIMER_SEC, 1000, NULL) ; SetTimer (hwnd, TIMER_MIN, 60000, NULL) ;
WM_TIMER�Ĵ���������ʾ��
case WM_TIMER: switch (wParam) { case TIMER_SEC: //ÿ��һ�εĴ��� break ; case TIMER_MIN: //ÿ����һ�εĴ��� break ; } return 0 ;
������뽫һ���Ѿ����ڵļ�ʱ���趨Ϊ��ͬ��ʱ�����������Լ򵥵��ò�ͬ��ʱ��ֵ�ٴκ���SetTimer����ʱ�ӳ�ʽ������ʾ�����ʾ���ǿ���ѡ��ģ����Ϳ�����������ֻ��򵥵ؽ�ʱ������1000�����60 000������л��Ϳ����ˡ�
��ʽ8-1��ʾ��һ��ʹ�ü�ʱ���ļ򵥳�ʽ����ΪBEEPER1����ʱ����ʱ�����趨Ϊ1�롣�����յ�WM_TIMERѶϢʱ��������ʾ�������ɫ����ɫ��Ϊ��ɫ���ɺ�ɫ��Ϊ��ɫ����ͨ������MessageBeep��ʽ��������������ȻMessageBeepͨ�����MessageBox������ȷʵ��һ��ȫ���ܵ����к�ʽ��������Ч����PC���ϣ�һ�����ʹ�ò�ͬ��MB_ICON������ΪMessageBeep��һ�����������MessageBox��������ʹ�����ڡ�����̨���ġ���������ʽ��ѡ��IJ�ͬ��������
BEEPER1���Ӵ�ѶϢ������ʽ����WM_CREATEѶϢʱ�趨��ʱ�����ڴ���WM_TIMERѶϢ�����ڼ䣬BEEPER1����MessageBeep����תbFlipFlop��ֵ��ʹ�Ӵ���Ч�Բ���WM_PAINTѶϢ���ڴ���WM_PAINTѶϢ�����ڼ䣬BEEPER1ͨ������GetClientRect����Ӵ���С��RECT�ṹ����ͨ������FillRect�ı��Ӵ�����ɫ��
��ʽ8-1 BEEPER1 BEEPER1.C /*------------------------------------------------------------------------- BEEPER1.C -- Timer Demo Program No. 1 (c) Charles Petzold, 1998 -------------------------------------------------------------------------*/ #include <windows.h> #define ID_TIMER 1 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("Beeper1") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox ( NULL, TEXT ("Program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow ( szAppName, TEXT ("Beeper1 Timer Demo"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam) { static BOOL fFlipFlop = FALSE ; HBRUSH hBrush ; HDC hdc ; PAINTSTRUCT ps ; RECT rc ; switch (message) { case WM_CREATE: SetTimer (hwnd, ID_TIMER, 1000, NULL) ; return 0 ; case WM_TIMER : MessageBeep (-1) ; fFlipFlop = !fFlipFlop ; InvalidateRect (hwnd, NULL, FALSE) ; return 0 ; case WM_PAINT : hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rc) ; hBrush = CreateSolidBrush (fFlipFlop ? RGB(255,0,0) : RGB(0,0,255)) ; FillRect (hdc, &rc, hBrush) ; EndPaint (hwnd, &ps) ; DeleteObject (hBrush) ; return 0 ; case WM_DESTROY : KillTimer (hwnd, ID_TIMER) ; PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
��ΪBEEPER1ÿ���յ�WM_TIMERѶϢʱ��������ɫ�ı任��ʾ����������������ͨ������BEEPER1���鿴WM_TIMERѶϢ�����ʣ������Windows�ڲ���һЩ����������
���磬���Ⱥ��� ����̨ �� ��ʾ�� ��ʽ��ѡ�� �� ��ȷ�� ��ҷʱ��ʾ�Ӵ����� ��ȡ����û�б�ѡ�С����ڣ������ƶ���������BEEPER1�Ӵ����⽫���³�ʽ���롸ģ̬ѶϢ��Ȧ����Windowsͨ�����ڲ�ѶϢ��������ʽ��ѶϢ��Ȧ����������ѶϢ������ֹ���ƶ��������Ų������κθ��š�ͨ���˻�Ȧ�����ʽ�Ӵ��Ĵ����ѶϢ���������������BEEPER1ֹͣ������Ô�ò¡£µï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Æ¶ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ö®ï¿½á£¬ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½×¢ï¿½âµ½BEEPER1����ȡ����������������WM_TIMERѶϢ������ǰ����ѶϢ�ļ���������1�롣
�ڡ���ҷʱ��ʾ�Ӵ����ݡ���ȡ���鱻ѡ��ʱ��Windows�У���ģ̬ѶϢ��Ȧ����ͼ�������Ӵ�ѶϢ������ʽ����һЩ��ʧ��ѶϢ����������ʱ�����úܺã���ʱȴ���С�
������
��
�趨��ʱ���ĵ�һ�ַ����ǰ�WM_TIMERѶϢ���͵�ͨ�����Ӵ�ѶϢ������ʽ�����ڶ��ַ�������Windowsֱ�ӽ���ʱ��ѶϢ���͸�����ʽ����һ����ʽ��
������Щ��ʱ��ѶϢ�ĺ�ʽ����Ϊ��callback����ʽ������һ�������ij�ʽ֮�е�����Windows���еĺ�ʽ�����ȸ���Windows�˺�ʽ��λַ��Ȼ��Windows���д˺�ʽ���⿴����Ҳ����Ϥ����Ϊ��ʽ���Ӵ�ѶϢ������ʽʵ����Ҳ��һ��callback��ʽ����ע���Ӵ����ʱ��Ҫ����ʽ��λַ����Windows��������ѶϢ����ʽʱ��Windows����д˺�ʽ��
SetTimer������Ψһʹ��callback��ʽ��Windows��ʽ��CreateDialog��DialogBox��ʽ�����ڵ�ʮһ���н��ܣ�ʹ��callback��ʽ�����Ի������е�ѶϢ���м���Windows��ʽ��EnumChildWindow��EnumFonts��EnumObjects��EnumProps��EnumWindow�����о���Ѷ���ݸ�callback��ʽ�����м�������ô���õĺ�ʽ��GrayString��LineDDA��SetWindowHookEx��ҲҪ��callback��ʽ��
���Ӵ�ѶϢ������ʽһ����callback��ʽҲ���붨��ΪCALLBACK����Ϊ������Windows�ӳ�ʽ�ij�ʽ��κ��еġ�callback��ʽ�IJ�����callback��ʽ�Ĵ���ֵȡ���callback��ʽ��Ŀ�ġ�����ʱ���йص�callback��ʽ�У�����������Ӵ�ѶϢ������ʽ���������һ������ʱ��callback��ʽ����Windows����ֵ��
���ǰ����µ�callback��ʽ��ΪTimerProc�����ܹ�ѡ��������һЩ���ﲻ�ᷢ����ͻ���κ����ƣ�����ֻ����WM_TIMERѶϢ��
VOID CALLBACK TimerProc ( HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime) { ����WM_TIMERѶϢ }
TimerProc�IJ���hwnd���ں���SetTimerʱָ�����Ӵ����š�Windowsֻ��WM_TIMERѶϢ�͸�TimerProc�����ѶϢ�������ǵ��WM_TIMER��iTimerIDֵ�Ǽ�ʱ��ID��dwTimerֵ�����GetTickCount��ʽ�Ĵ���ֵ���ݵ�ֵ��������Windows�������������ĺ�������
��BEEPER1���Ѿ����������õ�һ�ַ����趨��ʱ��ʱҪ�������ʽ��SetTimer���У�
SetTimer (hwnd, iTimerID, iMsecInterval, NULL) ;
��ʹ��callback��ʽ����WM_TIMERѶϢʱ��SetTimer�ĵ��ĸ�������callback��ʽ��λַȡ����������ʾ��
SetTimer (hwnd, iTimerID, iMsecInterval, TimerProc) ;
����������һЩ������ʽ�룬�������ͻ��˽���Щ��������������һ��ġ��ڹ����ϣ�����Windows����һ����ʱ��ѶϢ��TimerProc����WndProc֮�⣬��ʽ8-2��ʾ��BEEPER2��ʽ��BEEPER1����ͬ�ġ�ע�⣬TimerProc��WndProcһ�������ڳ�ʽ�Ŀ�ʼ����
��ʽ8-2 BEEPER2 BEEPER2.C /*--------------------------------------------------------------------------- BEEPER2.C -- Timer Demo Program No. 2 (c) Charles Petzold, 1998 ---------------------------------------------------------------------------*/ #include <windows.h> #define ID_TIMER 1 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; VOID CALLBACK TimerProc (HWND, UINT, UINT, DWORD ) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static char szAppName[] = "Beeper2" ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox ( NULL, TEXT ("Program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow ( szAppName, "Beeper2 Timer Demo", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: SetTimer (hwnd, ID_TIMER, 1000, TimerProc) ; return 0 ; case WM_DESTROY: KillTimer (hwnd, ID_TIMER) ; PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; } VOID CALLBACK TimerProc (HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime) { static BOOL fFlipFlop = FALSE ; HBRUSH hBrush ; HDC hdc ; RECT rc ; MessageBeep (-1) ; fFlipFlop = !fFlipFlop ; GetClientRect (hwnd, &rc) ; hdc = GetDC (hwnd) ; hBrush = CreateSolidBrush (fFlipFlop ? RGB(255,0,0) : RGB(0,0,255)) ; FillRect (hdc, &rc, hBrush) ; ReleaseDC (hwnd, hdc) ; DeleteObject (hBrush) ; }
������
��
�趨��ʱ���ĵ����ַ�������춵ڶ��ַ�����ֻ�Ǵ��ݸ�SetTimer��hwnd�������趨ΪNULL�����ҵڶ���������ͨ��Ϊ��ʱ��ID���������ˣ����ᣬ�˺�ʽ���ؼ�ʱ��ID��
iTimerID = SetTimer (NULL, 0, wMsecInterval, TimerProc) ;
���û�п��õļ�ʱ������ô��SetTimer���ص�iTimerIDֵ��ΪNULL��
KillTimer�ĵ�һ��������ͨ�����Ӵ����ţ�Ҳ����ΪNULL����ʱ��ID������SetTimer�Ĵ���ֵ��
KillTimer (NULL, iTimerID) ;
���ݸ�TimerProc��ʱ����ʽ��hwnd����Ҳ������NULL�������趨��ʱ���ķ������ٱ�ʹ�á���������ij�ʽ�ڲ�ͬʱ����һϵ�е�SetTimer���У����ֲ�ϣ��׷�����Ѿ��ù�����Щ��ʱ��ID����ôʹ�ô˷����Ǻܷ���ġ�
��Ȼ���Ѿ�֪�������ʹ��Windows��ʱ�����Ϳ��Կ�ʼ����һЩ���õļ�ʱ����ʽ�ˡ�
��ʱ�����ʱ��
��
ʱ���Ǽ�ʱ�������Ե�Ӧ�ã��������������������ʱ�ӣ�һ����λʱ�ӣ�һ�����ʱ�ӡ�
������λʱ��
��
��ʽ8-3��ʾ��DIGCLOCK��ʽ��ʹ������LED��7����ʾ������ʾ��Ŀǰ��ʱ�䡣
��ʽ8-3 DIGCLOCK DIGCLOCK.C /*---------------------------------------------------------------------------- DIGCLOCK.C -- Digital Clock (c) Charles Petzold, 1998 ----------------------------------------------------------------------------*/ #include <windows.h> #define ID_TIMER 1 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("DigClock") ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox ( NULL, TEXT ("Program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow ( szAppName, TEXT ("Digital Clock"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } void DisplayDigit (HDC hdc, int iNumber) { static BOOL fSevenSegment [10][7] = { 1, 1, 1, 0, 1, 1, 1, // 0 0, 0, 1, 0, 0, 1, 0, // 1 1, 0, 1, 1, 1, 0, 1, // 2 1, 0, 1, 1, 0, 1, 1, // 3 0, 1, 1, 1, 0, 1, 0, // 4 1, 1, 0, 1, 0, 1, 1, // 5 1, 1, 0, 1, 1, 1, 1, // 6 1, 0, 1, 0, 0, 1, 0, // 7 1, 1, 1, 1, 1, 1, 1, // 8 1, 1, 1, 1, 0, 1, 1 } ; // 9 static POINT ptSegment [7][6] = { 7, 6, 11, 2, 31, 2, 35, 6, 31, 10, 11, 10, 6, 7, 10, 11, 10, 31, 6, 35, 2, 31, 2, 11, 36, 7, 40, 11, 40, 31, 36, 35, 32, 31, 32, 11, 7 , 36, 11, 32, 31, 32, 35, 36, 31, 40, 11, 40, 6 , 37, 10, 41, 10, 61, 6, 65, 2, 61, 2, 41, 36, 37, 40, 41, 40, 61, 36, 65, 32, 61, 32, 41, 7 , 66, 11, 62, 31, 62, 35, 66, 31, 70, 11, 70 } ; int iSeg ; for (iSeg = 0 ; iSeg < 7 ; iSeg++) if (fSevenSegment [iNumber][iSeg]) Polygon (hdc, ptSegment [iSeg], 6) ; } void DisplayTwoDigits (HDC hdc, int iNumber, BOOL fSuppress) { if (!fSuppress || (iNumber / 10 != 0)) DisplayDigit (hdc, iNumber / 10) ; OffsetWindowOrgEx (hdc, -42, 0, NULL) ; DisplayDigit (hdc, iNumber % 10) ; OffsetWindowOrgEx (hdc, -42, 0, NULL) ; } void DisplayColon (HDC hdc) { POINT ptColon [2][4] = { 2, 21, 6, 17, 10, 21, 6, 25, 2, 51, 6, 47, 10, 51, 6, 55 } ; Polygon (hdc, ptColon [0], 4) ; Polygon (hdc, ptColon [1], 4) ; OffsetWindowOrgEx (hdc, -12, 0, NULL) ; } void DisplayTime (HDC hdc, BOOL f24Hour, BOOL fSuppress) { SYSTEMTIME st ; GetLocalTime (&st) ; if (f24Hour) DisplayTwoDigits (hdc, st.wHour, fSuppress) ; else DisplayTwoDigits (hdc, (st.wHour %= 12) ? st.wHour : 12, fSuppress) ; DisplayColon (hdc) ; DisplayTwoDigits (hdc, st.wMinute, FALSE) ; DisplayColon (hdc) ; DisplayTwoDigits (hdc, st.wSecond, FALSE) ; } LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam) { static BOOL f24Hour, fSuppress ; static HBRUSH hBrushRed ; static int cxClient, cyClient ; HDC hdc ; PAINTSTRUCT ps ; TCHAR szBuffer [2] ; switch (message) { case WM_CREATE: hBrushRed = CreateSolidBrush (RGB (255, 0, 0)) ; SetTimer (hwnd, ID_TIMER, 1000, NULL) ;// fall through case WM_SETTINGCHANGE: GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_ITIME, szBuffer, 2) ; f24Hour = (szBuffer[0] == '1') ; GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_ITLZERO, szBuffer, 2) ; fSuppress = (szBuffer[0] == '0') ; InvalidateRect (hwnd, NULL, TRUE) ; return 0 ; case WM_SIZE: cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; return 0 ; case WM_TIMER: InvalidateRect (hwnd, NULL, TRUE) ; return 0 ; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; SetMapMode (hdc, MM_ISOTROPIC) ; SetWindowExtEx (hdc, 276, 72, NULL) ; SetViewportExtEx (hdc, cxClient, cyClient, NULL) ; SetWindowOrgEx (hdc, 138, 36, NULL) ; SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ; SelectObject (hdc, GetStockObject (NULL_PEN)) ; SelectObject (hdc, hBrushRed) ; DisplayTime (hdc, f24Hour, fSuppress) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: KillTimer (hwnd, ID_TIMER) ; DeleteObject (hBrushRed) ; PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
DIGCLOCK�Ӵ���ͼ8-1��ʾ��
��
ͼ8-1 DIGCLOCK��өĻ��ʾ |
��Ȼ����ͼ8-1����������ʱ�ӵ������Ǻ�ɫ�ġ�DIGCLOCK���Ӵ�ѶϢ������ʽ�ڴ���WM_CREATEѶϢ�����ڼ佨����һ����ɫ�Ļ�ˢ���ڴ���WM_DESTROYѶϢ�����ڼ��������WM_CREATEѶϢҲΪDIGCLOCK�趨��һ��һ��ļ�ʱ�����ü�ʱ���ڴ���WM_DESTROYѶϢ�����ڼ䱻��ֹ�����Ὣ���۶�GetLocaleInfo�ĺ��У���
���յ�WM_TIMERѶϢ�ᣬDIGCLOCK���Ӵ��������InvalidateRect�򵥵�ʹ�����Ӵ���Ч���ⲻ����ѷ�������Ϊÿ�������Ӵ���Ҫ���������ػ�����ʱ��������ʾ������˸������Ŀǰ��ʱ��ʹ�Ӵ���Ҫ���µIJ�����Ч����õĽ��������Ȼ�������߼�����������ȷ�ܸ��ӡ�
�ڴ���WM_TIMERѶϢ�����ڼ�ʹ�Ӵ���Ч����ʹ���г�ʽ�������ת��WM_PAINT��DIGCLOCK��WM_PAINTѶϢһ��ʼ��ӳ�䷽ʽ�趨ΪMM_ISOTROPIC��������DIGCLOCK��ʹ��ˮƽ����ʹ�ֱ������ȵ��ᡣ��Щ�ᣨ��SetWindowExtEx�����趨����ˮƽ276����λ����ֱ72����λ����Ȼ����Щ�ᶨ���е�̫�����ˣ��������ǰ���ʱ����λԪ�Ĵ�С�ͼ�ల�ŵġ�
DIGCLOCK���Ӵ�Ô���趨Ϊ��138,36���������Ӵ���Χ�����ģ����Ӳ�Ô���趨Ϊ��cxClient / 2,cyClient / 2��������ζ��ʱ�ӵ���ʾλ�DIGCLOCK��ʾ��������ģ����Ǹ�DIGCLOCKҲ����ʹ������ʾĻ���Ͻǵ�Ô�㣨0, 0�����ᡣ
Ȼ��WM_PAINT��Ŀǰ��ˢ�趨Ϊ֮ǰ�����ĺì»Ë¢ï¿½ï¿½ï¿½ï¿½Ä¿Ç°ï¿½ï¿½ï¿½ï¿½ï¿½è¶¨ÎªNULL_PEN�� ������DIGCLOCK�еĺ�ʽDisplayTime��
ȡ��Ŀǰʱ��
��
DisplayTime��ʽ��ʼ����Windows��ʽGetLocalTime��������һ����SYSTEMTIME�ṹ�IJ�������WINBASE.H�ж���Ϊ��
typedef struct _SYSTEMTIME { WORD wYear ; WORD wMonth ; WORD wDayOfWeek ; WORD wDay ; WORD wHour ; WORD wMinute ; WORD wSecond ; WORD wMilliseconds ; } SYSTEMTIME, * PSYSTEMTIME ;
�����ԣ�SYSTEMTIME�ṹ�������ں�ʱ�䡣�·���1��ʼ������Ҳ����˵��һ����1����������0��ʼ��������������0����wDay��Ա�DZ���Ŀǰ�����ӣ�Ҳ����1��ʼ�����ġ�
SYSTEMTIME��Ҫ���GetLocalTime��GetSystemTime��ʽ��GetSystemTime��ʽ����Ŀǰ������ʱ�䣨Coordinated Universal Time��UTC���������Ӣ����������ʱ����ͬ��GetLocalTime��ʽ���ص���ʱ�䣬���ݵ������ڵ�ʱ������Щֵ�ľ�ȷ����ȫ�����ʹ������������ʱ�侫ȷ���Լ��Ƿ�ָ������ȷ��ʱ��������˫�������е�ʱ����ʾ���������ϵ�ʱ���趨���ڶ�ʮ���»���һ����ʽ���ܹ�ͨ��Internet��ȷ���趨ʱ�䡣
Windows����SetLocalTime��SetSystemTime��ʽ���Լ���/Platform SDK/Windows Base Services/General Library/Time��˵����������ʱ���йصĺ�ʽ��
��ʾ���ֺ�ð��
��
���DIGCLOCKʹ��һ��ģ��7����ʾ�����彫���һЩ���������͵�ʹ��Polygon��ʽ�����еĹ�����
DIGCLOCK�е�DisplayDigit��ʽ�������������С�fSevenSegment������7��BOOLֵ����춴�0��9��ÿ��ʮ��λ���֡���Щֵָ������һ����Ҫ��ʾ��Ϊ1������һ�β���Ҫ��ʾ��Ϊ0���������������7�����ϵ��¡�����������7���е�ÿ���ζ���һ��6�ߵĶ���Ρ�ptSegment������һ��POINT�ṹ�����У�ָ����7������ÿ�����ͼ�����ꡣÿ�����������г�ʽ�ë»ï¿½ï¿½ï¿½ï¿½
for (iSeg = 0 ; iSeg < 7 ; iSeg++) if ( fSevenSegment [iNumber][iSeg]) Polygon (hdc, ptSegment [iSeg], 6) ;
���Ƶأ������òµ¥£ï¿½ï¿½ï¿½DisplayColon��ʽ��Сʱ����ӡ���������֮�ä»Ò»ï¿½ï¿½Ã°ï¿½Å¡ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½42����λ����ð����12����������6��������2��ð�ţ��ܿ�����276�����SetWindowExtEx������ʹ���������С��
�ص�DisplayTime��ʽ��Ô��λ���������λ�õ����Ͻǡ�DisplayTime����DisplayTwoDigits��DisplayTwoDigits����DisplayDigit���Σ�������ÿ�κ���OffsetWindowOrgEx�ᣬ���Ӵ�Ô�������ƶ�42����λ�����Ƶأ�DisplayColon��ʽ�ڻ���ð���ᣬ���Ӵ�Ô�������ƶ�12����λ�������ַ�������������������Ӵ��ڵ��ĸ��ط�����ʽ�����ֺ�ð�Ŷ�ʹ��ͬ�������ꡣ
�����ʽ��������������12Сʱ��24Сʱ�ĸ�ʽ��ʾʱ���Լ�������ߵ�Сʱ����Ϊ0ʱ����ʾ����
���ʻ�
��
������DIGCLOCK������ʾʱ���Ƿdz��򵥵ģ�����Ҫ��ʾ���ӵ����ں�ʱ�仹��Ҫ����Windows�Ĺ��ʻ�֧Ԯ����ʽ�����ں�ʱ�����򵥵ķ����Ǻ���GetDateFormat��GetTimeFormat��ʽ����Щ��ʽ��/Platform SDK/Windows Base Services/General Library/String Manipulation/String Manipulation Reference/String Manipulation Functions���м��أ�����������/Platform SDK/Windows Base Services/International Features/National Language Support�н�����˵������Щ��ʽ����SYSTEMTIME�ṹ��������ʹ�����ڡ�����̨���ġ������趨�� ��ʽ��������ѡ��������ں�ʱ���ʽ����
DIGCLOCK����ʹ��GetDateFormat��ʽ����Ϊ��ֻ֪����ʾ���ֺ�ð�ţ�Ȼ����DIGCLOCKӦ���ܹ�����ʹ���ߵIJ���ѡ������ʾ12Сʱ��24Сʱ�ĸ�ʽ������ֹ���򲻽�ֹ����ͷ��Сʱ���֡������Դ�GetLocaleInfo��ʽ��ȡ��������Ѷ����ȻGetLocaleInfo��/Platform SDK/Windows Base Services/General Library/String Manipulation/String Manipulation Reference/String Manipulation Functions���м��أ����������ʽʹ�õ�ʶ������/Platform SDK/Windows Base Services/International Features/National Language Support/National Language Support Constants����˵����
DIGCLOCK�ڴ���WM_CREATEѶϢʱ���������GetLocaleInfo���Σ���һ��ʹ��LOCALE_ITIMEʶ���֣�ȷ��ʹ�õ���12Сʱ����24Сʱ��ʽ����Ȼ��ʹ��LOCALE_ITLZEROʶ���֣���Сʱ��ʾ�н�ֹǰ����ʾ0����GetLocaleInfo��ʽ���ִ��д������е���Ѷ�������ڴ��������°��ִ�ת��Ϊ���������Ƿdz����ס�DIGCLOCK���ִ�������������̬�����в������Ǵ��ݸ�DisplayTime��ʽ��
���ʹ���߸������κ�ϵͳ�趨����ὫWM_SETTINGCHANGEѶϢ���͸����е�Ӧ�ó�ʽ��DIGCLOCKͨ���ٴκ���GetLocaleInfo�������ѶϢ�������ַ�ʽ���������ڡ�����̨���ġ������趨�� ��ʽ�н��в�ͬ���趨��ʵ��һ�¡�
�������ϣ�DIGCLOCKҲӦ��ʹ��LOCALE_STIMEʶ���ֺ���GetLocaleInfo����ᴫ��ʹ����Ϊʱ���Сʱ�����Ӻ���ȵ�������ѡ�����Ԫ����ΪDIGCLOCK���趨Ϊ����ʾð�ţ����Բ���ѡ����ʲô������õ�ð�š�Ҫָ��ʱ����A.M.��P.M.��Ӧ�ó�ʽ����ʹ�ô���LOCALE_S1159��LOCALE_S2359ʶ���ֵ�GetLocaleInfo��ʽ����Щʶ����ʹ��ʽ����ʺ��ʹ���߹���/���������Ե��ִ���
����Ҳ������DIGCLOCK����WM_TIMECHANGEѶϢ����������ϵͳʱ�������ڷ����仯��ѶϢ֪ͨӦ�ó�ʽ��DIGCLOCK��WM_TIMERѶϢ��ÿ�����һ�Σ�ʵ����û�б�Ҫ����������WM_TIMECHANGEѶϢ�Ĵ���ʹ��ÿ���Ӹ���һ�ε�ʱ�ӱ�ø�Ϊ������
�������ʱ��
��
���ʱ�Ӳ��ع��Ĺ��ʻ����⣬�������ͼ��������ĸ�����ȴ���������ּ򻯡�Ϊ����ȷ�ز���ʱ�ӣ�����Ҫ֪��һЩ���Ǻ�����CLOCK���ʽ8-4��ʾ��
��ʽ8-4 CLOCK CLOCK.C /*--------------------------------------------------------------------------- CLOCK.C -- Analog Clock Program (c) Charles Petzold, 1998 ---------------------------------------------------------------------------*/ #include <windows.h> #include <math.h> #define ID_TIMER 1 #define TWOPI (2 * 3.14159) LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("Clock") ; HWND hwnd; MSG msg; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = NULL ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox ( NULL, TEXT ("Program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow ( szAppName, TEXT ("Analog Clock"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } void SetIsotropic (HDC hdc, int cxClient, int cyClient) { SetMapMode (hdc, MM_ISOTROPIC) ; SetWindowExtEx (hdc, 1000, 1000, NULL) ; SetViewportExtEx (hdc, cxClient / 2, -cyClient / 2, NULL) ; SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ; } void RotatePoint (POINT pt[], int iNum, int iAngle) { int i ; POINT ptTemp ; for (i = 0 ; i < iNum ; i++) { ptTemp.x = (int) (pt[i].x * cos (TWOPI * iAngle / 360) + pt[i].y * sin (TWOPI * iAngle / 360)) ; ptTemp.y = (int) (pt[i].y * cos (TWOPI * iAngle / 360) - pt[i].x * sin (TWOPI * iAngle / 360)) ; pt[i] = ptTemp ; } } void DrawClock (HDC hdc) { int iAngle ; POINT pt[3] ; for (iAngle = 0 ; iAngle < 360 ; iAngle += 6) { pt[0].x = 0 ; pt[0].y = 900 ; RotatePoint (pt, 1, iAngle) ; pt[2].x = pt[2].y = iAngle % 5 ? 33 : 100 ; pt[0].x - = pt[2].x / 2 ; pt[0].y - = pt[2].y / 2 ; pt[1].x = pt[0].x + pt[2].x ; pt[1].y = pt[0].y + pt[2].y ; SelectObject (hdc, GetStockObject (BLACK_BRUSH)) ; Ellipse (hdc, pt[0].x, pt[0].y, pt[1].x, pt[1].y) ; } } void DrawHands (HDC hdc, SYSTEMTIME * pst, BOOL fChange) { static POINT pt[3][5] ={0, -150, 100, 0, 0, 600, -100, 0, 0, -150, 0, -200, 50, 0, 0, 800, -50, 0, 0, -200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 800 } ; int i, iAngle[3] ; POINT ptTemp[3][5] ; iAngle[0] = (pst->wHour * 30) % 360 + pst->wMinute / 2 ; iAngle[1] = pst->wMinute * 6 ; iAngle[2] = pst->wSecond * 6 ; memcpy (ptTemp, pt, sizeof (pt)) ; for (i = fChange ? 0 : 2 ; i < 3 ; i++) { RotatePoint (ptTemp[i], 5, iAngle[i]) ; Polyline (hdc, ptTemp[i], 5) ; } } LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam) { static int cxClient, cyClient ; static SYSTEMTIME stPrevious ; BOOL fChange ; HDC hdc ; PAINTSTRUCT ps ; SYSTEMTIME st ; switch (message) { case WM_CREATE : SetTimer (hwnd, ID_TIMER, 1000, NULL) ; GetLocalTime (&st) ; stPrevious = st ; return 0 ; case WM_SIZE : cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; return 0 ; case WM_TIMER : GetLocalTime (&st) ; fChange = st.wHour ! = stPrevious.wHour || st.wMinute ! = stPrevious.wMinute ; hdc = GetDC (hwnd) ; SetIsotropic (hdc, cxClient, cyClient) ; SelectObject (hdc, GetStockObject (WHITE_PEN)) ; DrawHands (hdc, &stPrevious, fChange) ; SelectObject (hdc, GetStockObject (BLACK_PEN)) ; DrawHands (hdc, &st, TRUE) ; ReleaseDC (hwnd, hdc) ; stPrevious = st ; return 0 ; case WM_PAINT : hdc = BeginPaint (hwnd, &ps) ; SetIsotropic (hdc, cxClient, cyClient) ; DrawClock (hdc) ; DrawHands (hdc, &stPrevious, TRUE) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY : KillTimer (hwnd, ID_TIMER) ; PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
CLOCKөĻ��ʾ��ͼ8-2��
��
ͼ8-2 CLOCK��өĻ��ʾ |
�ȷ�����(isotropic)ӳ����������Ӧ����˵������ģ�CLOCK.C�е�SetIsotropic��ʽ�����趨��ģʽ���ں���SetMapMode֮�ᣬSetIsotropic���Ӵ���Χ�趨Ϊ1000�������Ӳ���Χ�趨Ϊ��ʾ�����һ����Ⱥ���ʾ����ĸ���һ��߶ȡ��Ӳ�Ô�㱻�趨Ϊ��ʾ��������ġ����ڵ����������۹����⽫����һ���ѿ�������ϵ�����(0,0)λ���ʾ��������ģ������з����ϵķ�Χ����1000��
RotatePoint��ʽ���õ����Ǻ����ĵط����˺�ʽ�����������ֱ���һ�����߶��������С������е�ĸ����Լ��Զ�Ϊ��λ����ת�Ƕȡ���ʽ��Ô��Ϊ���İ�˳ʱ�뷽�����һ��ʱ�������ʣ���ת��Щ�㡣���磬���������ʽ�ĵ���(0,100)����12:00��λ�ã����Ƕ�Ϊ90�ȣ���ô�õ㽫���任Ϊ(100,0)����3:00����ʹ�����й�ʽ��������һ�㣺
x' = x * cos (a) + y * sin (a) y' = y * cos (a) - x * sin (a)
RotatePoint��ʽ�ڻ���ʱ�ӱ���ĵ�ͱ���ʱ�������õģ����ǽ����Ͽ�����һ�㡣
DrawClock��ʽ����60��ʱ�ӱ���ĵ㣬�Ӷ���(12:00)��ʼ������ÿ������Ô��900��λ����˵�һ����λ�(0,900)�������ÿ���㰴˳ʱ����������6�ȡ���Щ���е�l2��ֱ��Ϊ100����λ�������Ϊ33����λ��ʹ��Ellipse��ʽ�����㡣
DrawHands��ʽ����ʱ�ӵ�ʱ�롢��������롣������������������Ǵ�ֱ����ʱ����״������������һ��POINT�ṹ�������С�����ʱ�䣬��Щ����ʹ��RotatePoint��ʽ������ת������Windows��Polyline��ʽ������ʾ��ע��ʱ��ͷ���ֻ�е����ݸ�DrawHands��bChange����ΪTRUEʱ�ű���ʾ������ʽ����ʱ�ӵı���ʱ������������ʱ��ͷ��벻��Ҫ�ػ���
���������ǽ�ע����ת���Ӵ�ѶϢ������ʽ����WM_CREATEѶϢ�����ڼ䣬�Ӵ�ѶϢ������ʽȡ��Ŀǰʱ�䲢�����������ΪdtPrevious�ı����У���������������ᱻ���ȷ��ʱ����߷�����ϴθ��������Ƿ�ı����
��һ�λ���ʱ�����ڵ�һ��WM_PAINTѶϢ�����ڼ䣬��ֻ���������κ���SetIsotropic�� DrawClock��DrawHands�����ߵ�bChange�������趨ΪTRUE��
��WM_TIMERѶϢ�����ڼ䣬WndProc����ȡ���µ�ʱ�䲢ȷ���Ƿ���Ҫ���»���ʱ��ͷ��롣�����Ҫ����ʹ��һ����ɫ���ʺ���һ��ʱ��������еı��룬�Ӷ���Ч�ز������ǡ�����ֻ������ʹ�ð�ɫ���ʽ��в�����Ȼ�ᣬ��ʹ��һ����ɫ���ʻ������еı��롣
�Լ�ʱ������״̬����
��
���µ�����һ����ʽ�����ڵ������ᵽ���ġ�����һ��ʹ��GetPixel��ʽ�ĺ����ӡ�
WHATCLR ������ʽ8-5����ʾ�˻����α���Ŀǰͼ�ص�RGB��ɫ��
��ʽ8-5 WHATCLR WHATCLR.C /*-------------------------------------------------------------------------- WHATCLR.C -- Displays Color Under Cursor (c) Charles Petzold, 1998 ---------------------------------------------------------------------------*/ #include <windows.h> #define ID_TIMER 1 void FindWindowSize (int *, int *) ; LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("WhatClr") ; HWND hwnd ; int cxWindow, cyWindow ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { MessageBox ( NULL, TEXT ("This program requires Windows NT!"), szAppName, MB_ICONERROR) ; return 0 ; } FindWindowSize (&cxWindow, &cyWindow) ; hwnd = CreateWindow (szAppName, TEXT ("What Color"), WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_BORDER, CW_USEDEFAULT, CW_USEDEFAULT, cxWindow, cyWindow, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } void FindWindowSize (int * pcxWindow, int * pcyWindow) { HDC hdcScreen ; TEXTMETRIC tm ; hdcScreen = CreateIC (TEXT ("DISPLAY"), NULL, NULL, NULL) ; GetTextMetrics (hdcScreen, &tm) ; DeleteDC (hdcScreen) ; * pcxWindow = 2 * GetSystemMetrics (SM_CXBORDER) + 12 * tm.tmAveCharWidth ; * pcyWindow = 2 * GetSystemMetrics (SM_CYBORDER) + GetSystemMetrics (SM_CYCAPTION) + 2 * tm.tmHeight ; } LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam) { static COLORREF cr, crLast ; static HDC hdcScreen ; HDC hdc ; PAINTSTRUCT ps ; POINT pt ; RECT rc ; TCHAR szBuffer [16] ; switch (message) { case WM_CREATE: hdcScreen = CreateDC (TEXT ("DISPLAY"), NULL, NULL, NULL) ; SetTimer (hwnd, ID_TIMER, 100, NULL) ; return 0 ; case WM_TIMER: GetCursorPos (&pt) ; cr = GetPixel (hdcScreen, pt.x, pt.y) ; SetPixel (hdcScreen, pt.x, pt.y, 0) ; if (cr != crLast) { crLast = cr ; InvalidateRect (hwnd, NULL, FALSE) ; } return 0 ; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rc) ; wsprintf (szBuffer, TEXT (" %02X %02X %02X "), GetRValue (cr), GetGValue (cr), GetBValue (cr)) ; DrawText (hdc, szBuffer, -1, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: DeleteDC (hdcScreen) ; KillTimer (hwnd, ID_TIMER) ; PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
WHATCLR��WinMain������һ����������ͬ���¡���ΪWHATCLR���Ӵ�ֻ��Ҫ��ʾʮ����λRGBֵ��ô����������CreateWindow��ʽ��ʹ��WS_BORDER�Ӵ���ʽ������һ�����ܸı��С���Ӵ���Ҫ�����Ӵ��Ĵ�С��WHATCLRͨ���Ⱥ���CreateIC�ٺ���GetSystemMetrics��ȡ�������Ѷ��ʾ��װ��������Ѷ������õ��Ӵ����Ⱥ͸߶�ֵ�����ݸ�CreateWindow��
WHATCLR���Ӵ�ѶϢ������ʽ�ڴ���WM_CREATEѶϢ�����ڼ䣬����CreateDC���������������Ѷ��ʾ��װ�����ݡ����װ�������ڳ�ʽ�����������ڶ���Ч���ڴ���WM_TIMERѶϢ�����ڼ䣬��ʽȡ��Ŀǰ�����α�λ�õ�ͼ�ء��ڴ���WM_PAINTѶϢ�����ڼ���ʾRGB��ɫ��
��������֪������CreateDC��ʽ��ȡ�õ�װ�����ݴ����Ƿ���������өĻ������λ����ʾһЩ������������ֻ��ȡ��ͼ����ɫ�����ǿ��Եģ�һ����ԣ���һ��Ӧ�ó�ʽ����һ����ʽ���ƵĻ��������ϻ�ͼ�Dz��õģ�����ijЩ��������£�����ܻ�dz����á�