�������� Linux Tags

8. ��ʱ��

Microsoft Windows��ʱ����һ�������豸���������Ե���ÿ����һ��ָ����ʱ�������֪ͨӦ�ó�ʽһ�Ρ����ij�ʽ��ʱ��������Windows�����硸ÿ10����֪ͨ��һ������Ȼ��Windows�����ij�ʽ���������Է�����WM_TIMERѶϢ�Ա�ʾʱ�䵽�ˡ�

����֮�£�Windows��ʱ���ƺ�������̺ͻ����豸��Ҫ�����Ҷ�����Ӧ�ó�ʽ��˵ȷʵ��ˡ����ǣ���ʱ������������Ϊ��Ҫ��Ҫ�ö࣬����ֻ��춼�ʱ��ʽ����������ڹ������е�Windowsʱ�Ӻ���һ���е�����ʱ�ӳ�ʽ��������Windows��ʱ��������Ӧ�ã���Щ���ܲ�����ô���ԣ�

  •  ï¿½à¹¤ ï¿½ï¿½È»Windows 98��һ������Ȩʽ�Ķ๤����������ʱ�������ʽ���콫���ƴ��ظ�WindowsЧ�ʻ���ߡ����һ����ʽ������д����Ĵ�������ô�����Խ���ҵ�ֳ�С�飬ÿ���յ�һ��WM_TIMERѶϢ����һ�飨�ҽ��ڵڶ�ʮ���жԴ�����������ۣ���
    ��
  •  Î¬ï¿½ï¿½ï¿½ï¿½ï¿½Â¹ï¿½ï¿½ï¿½×´Ì¬ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ê½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ã¼ï¿½Ê±ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê¾ï¿½ï¿½ï¿½ï¿½ï¿½ä»¯ï¿½ï¿½Ñ¶ï¿½Ä¡ï¿½ï¿½ï¿½Ê±ï¿½ï¿½ï¿½ï¿½ï¿½Â£ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ÏµÍ³ï¿½ï¿½Ô´ï¿½Ä±ä»¯ï¿½ï¿½Ä³ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ä½ï¿½Õ¹ï¿½ï¿½ï¿½ï¿½ï¿½
    ��
  •  Êµï¿½ï¿½ï¿½ï¿½ï¿½Ô¶ï¿½ï¿½ï¿½ï¿½æ¡¹ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ê±ï¿½ï¿½ï¿½ï¿½Ê¾Windows��ʽ��ָ����ʱ���ȥ���ʹ���ߵĹ������浽��Ƭ�ϡ�
    ��
  •  ï¿½ï¿½Ö¹ï¿½ï¿½Ê½Õ¹Ê¾ï¿½æ±¾ï¿½ï¿½Ö´ï¿½ï¿½ Ò»Ð©ï¿½ï¿½Ê½ï¿½ï¿½Õ¹Ê¾ï¿½æ±¾ï¿½ï¿½ï¿½ï¿½Æ³ï¿½ï¿½ï¿½ï¿½ä¿ªÊ¼ï¿½á£¬ï¿½à³¤Ê±ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ëµï¿½ï¿½30���ӡ����ʱ���ѵ�����ô��ʱ���ͻ�֪ͨӦ�ó�ʽ��
    ��
  •  ï¿½ï¿½ï¿½ï¿½ï¿½Æ¶ï¿½ ï¿½ï¿½Ï·ï¿½Ðµï¿½Í¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ô¸ï¿½ï¿½ï¿½ï¿½ï¿½Ñ§ï¿½ï¿½Ê½ï¿½Ðµï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê¾ï¿½ï¿½ï¿½ï¿½Òªï¿½ï¿½Ö¸ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ã¼ï¿½Ê±ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Î¢ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ù¶È²ï¿½Í¬ï¿½ï¿½ï¿½ï¿½ÉµÄ²ï¿½Ò»ï¿½Â¡ï¿½
    ��
  •  ï¿½ï¿½Ã½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½CD���������������ֵij�ʽͨ���ڱ��������������ϡ�һ����ʽ����ʹ�ü�ʱ���������Եؼ���Ѳ����˶����������ϣ����ݴ�Э��өĻ�ϵ��Ӿ���Ѷ��
    ��

��һ��Ӧ�ÿ��Ա�֤��ʽ���˳��Ӵ�ѶϢ������ʽ�ᣬ�ܹ����µõ����ơ��ڴ����ʱ����£���ʽ���ܹ�֪����ʱ��һ��ѶϢ�ᵽ����

��ʱ������
��

������ͨ������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����á�