�������� Linux Tags

4. �������

��ǰһ�£���������һ���򵥵�Windows 98��ʽ�������Ӵ����룬���߸�׼ȷ��˵������ʾ����������ʾһ�����֡���������ѧ���ģ���ʾ����������Ӧ�ó�ʽ�Ӵ���δ�������С��Ӵ��߿��Լ���ѡ�Ĺ��ܱ��С������С�״̬�к;�����ռ�ݵIJ��֡������֮����ʾ�������Ӵ��п����ɳ�ʽ������д�ʹ����Ӿ���Ѷ�IJ��֡�

��춳�ʽ����ʾ��������������Ϊ����Ϊ��ֻ���������ܼٶ��Ӵ���С��ijһ�ض��ߴ磬�����ڳ�ʽִ��ʱ���С�ᱣ�ֲ��䡣���������Ϥͼ���Ӵ������ij�ʽ��ƣ���Щ���ƿ��ܻ�ʹ���е����ȣ������ټ���өĻ�ϵ�һ������һ����80����Ԫ�ˡ����ij�ʽ����������Windows��ʽ������Ѷ��ʾ����Windowsʹ���߿��Ƴ�ʽ�Ӵ���өĻ����ʾ�ķ�ʽ�����ܿ��Խ����̶���С���Ӵ������춼�����֮���Ӧ���Ǻ����ģ������ڴ��������£�ʹ����Ӧ���ܹ��ı�Ӧ�ó�ʽ�Ӵ��Ĵ�С�����ij�ʽ�����ܹ�����ָ�������Ĵ�С�����Һ�����������һ�ռ䡣

�������ֿ��ܵ������һ�ֿ����ǣ���ʽֻ�н�����ʾ��hello������ʾ���򣻻�����һ�ֿ��ܣ�����ʽ��һ����өĻ���߽����ȵ�ϵͳ��ִ�У�����ʾ������������ʾ����ҳ���֡����ش��������ּ�����Windows��ʽ��Ƶ�Ҫ��֮һ��

��һ�£����ǽ�������ʽ����ʾ������ʾ��Ѷ�ķ�ʽ��������һ��˵������ʾ��ʽ���Ӹ��ӡ�����ʽ����ʾ������ʾ���ֻ�ͼ��ʱ��������Ҫ�����ơ�������ʾ���򡣱������ؽ������Ƶķ�����

����WindowsΪ��ʾͼ���ṩ��ǿ���ͼ��װ�ý��棨GDI����ʽ��������һ���У���ֻ���ܼ������е���ʾ����Ҳ������Windows�ܹ�ʹ�õIJ�ͬ�������μ������С����ʹ��Windows���ڶ�ϵͳ���塣�⿴�����ƺ���һ�����ƣ���ʵ��Ȼ�������漰�ͽ�����������������Windows��ʽ��ơ��ڻ����ʾ���ֺ�ͼ��ʱ��Windows�ڶ��������Ԫ��Сͨ��������ͼ�εijߴ硣

���±����������ۻ�ͼ�ķ�����ʵ������������װ���޹صij�ʽ��ƻ�����Windows��ʽֻ�ܶ���ʾ�����С������Ԫ�Ĵ�С�����ٵļٶ����෴�أ�����ʹ��Windows�ṩ�Ĺ�����ȡ�ù�춳�ʽִ�л�������Ѷ��

���ƺ͸���
��

������ģʽ�����£���ʽ��������ʾ�������ⲿ���������ʽ�����өĻ�ϵ����ݻ�ͣ����ԭ�����������ص���ʧ����ˣ���ʽ���Զ�����������өĻ��ʾʱ�������Ѷ��

��Windows�У�ֻ�����Ӵ�����ʾ����������ֺ�ͼ�Σ����Ҳ���ȷ������ʾ��������ʾ�����ݻ�һֱ��������ʽ��һ������ظ�д��ʱ��������������磬ʹ���߿��ܻ���өĻ���ƶ���һ����ʽ���Ӵ��������Ϳ��ܸ�������Ӧ�ó�ʽ�Ӵ���һ���֡�Windows���ᱣ�������Ӵ��б�������ʽ���ǵ����򣬵���ʽ�ƿ��ᣬWindows��Ҫ�����ij�ʽ������ʾ�����������֡�

Windows��һ��ѶϢ����ϵͳ����ͨ����ѶϢͶ��Ӧ�ó�ʽѶϢ�����л��߰�ѶϢ���͸����ʵ��Ӵ�ѶϢ������ʽ���������ĸ����¼�֪ͨ��Ӧ�ó�ʽ��Windowsͨ������WM_PAINTѶϢ֪ͨ�Ӵ�ѶϢ������ʽ���Ӵ��IJ�����ʾ������Ҫ���ơ�

WM_PAINTѶϢ
��

�����Windows��ʽ��WinMain�н���ѶϢ��Ȧ֮ǰ�ij�ʼ���ڼ䶼Ҫ���к�ʽUpdateWindow��Windows�������������Ӵ�ѶϢ������ʽ���͵�һ��WM_PAINTѶϢ�����ѶϢ֪ͨ�Ӵ�ѶϢ������ʽ�����������ʾ���򡣴��ᣬ�Ӵ�ѶϢ������ʽӦ���κ�ʱ�̶�׼���ô�������WM_PAINTѶϢ����Ҫ�Ļ����������»����Ӵ���������ʾ�����ڷ������漸���¼�֮һʱ���Ӵ�ѶϢ������ʽ����յ�һ��WM_PAINTѶϢ��

  • ��ʹ�����ƶ��Ӵ�����ʾ�Ӵ�ʱ���Ӵ�����ǰ�����ص��������¿ɼ���
    ��
  • ʹ���߸ı��Ӵ��Ĵ�С������Ӵ������ʽ����CS_HREDRAW��CS_VREDRAWλԪ�����趨����
    ��
  • ��ʽʹ��ScrollWindow��ScrollDC��ʽ������ʾ�����һ���֡�
    ��
  • ��ʽʹ��InvalidateRect��InvalidateRgn��ʽ�������WM_PAINTѶϢ��
    ��

��ijЩ����£���ʾ�����һ���ֱ���ʱ���ǣ�Windows��ͼ����һ����ʾ���򣬲�������ָ��������ⲻһ���ܳɹ�������������£�Windows���ܷ���WM_PAINTѶϢ��

  • Windows���������˲����Ӵ��ĶԻ������ѶϢ���顣
    ��
  • ���ܱ�����������Ȼ�ᱻ�ͷš�
    ��
  • ��ʾ������ʾѶϢ��
    ��

    ��ijЩ����£�Windows���DZ����������ǵ���ʾ����Ȼ��ָ�������Щ����ǣ�

  • �����α괩Խ��ʾ����
    ��
  • ͼʾ�Ϲ���ʾ����
    ��

����WM_PAINTѶϢҪ���ʽд���߸ı��Լ�����ʾ�������˼ά��ʽ����ʽӦ����֯�ɿ��Ա���������ʾ������Ҫ��������Ѷ�����ҽ�������ӦҪ�󡹣���Windows���Ӵ�ѶϢ������ʽ����WM_PAINTѶϢʱ�Ž��л��ơ������ʽ������ʱ����Ҫ��������ʾ����������ǿ��Windows����һ��WM_PAINTѶϢ���⿴���ƺ�����өĻ����ʾ���ݵ�һ�������Զ�ķ����������ij�ʽ�ṹ���Դ������档

��Ч���κ���Ч����
��

�����Ӵ�ѶϢ������ʽһ�����յ�WM_PAINTѶϢ֮�ᣬ��׼������������ʾ���򣬵�������ֻ��Ҫ����һ����С���������������ʾ�����еľ������򣩡���Ȼ�����Ի����鸲���˲�����ʾ����ʱ�����������ˡ��ڲ����Ի�����֮�ᣬ��Ҫ�ػ���ֻ����ǰ���Ի�������ס�ľ�������

��������Ϊ����Ч���򡹻򡸸������򡹡�������ʾ��������Ч����Ĵ��ڣ��Ż���Windows��һ��WM_PAINTѶϢ����Ӧ�ó�ʽ��ѶϢ�����С�ֻ������ʾ�����ijһ����ʧЧʱ���Ӵ��Ż����WM_PAINTѶϢ��

Windows�ڲ�Ϊÿ���Ӵ�����һ������ͼ��Ѷ�ṹ��������ṹ�����˰�Χ��Ч�������С���ε������Լ�������Ѷ��������ξͽ�������Ч���Ρ�����ʱҲ��Ϊ����Ч���򡹡�������Ӵ�ѶϢ������ʽ����WM_PAINTѶϢ֮ǰ��ʾ�����е���һ�������Ϊ��Ч����Windows�����һ����Χ����������µ���Ч�����Լ�һ���µ���Ч���Σ����������ֱ仯�����Ѷ���ڻ�����Ѷ�ṹ�С�Windows���Ὣ���WM_PAINTѶϢ������ѶϢ�����С�

�Ӵ�ѶϢ������ʽ����ͨ������InvalidateRectʹ��ʾ�����ڵľ�����Ч�����ѶϢ�������Ѿ�����һ��WM_PAINTѶϢ��Windows��������µ���Ч���Ρ���������һ���µ�WM_PAINTѶϢ����ѶϢ�����С��ڽ��յ�WM_PAINTѶϢʱ���Ӵ�ѶϢ������ʽ����ȡ����Ч���ε����꣨�������Ͼͻῴ����һ�㣩��ͨ������GetUpdateRect���������κ�ʱ��ȡ����Щ���ꡣ

�ڴ���WM_PAINTѶϢ�����ڼ䣬�Ӵ�ѶϢ������ʽ�ں�����BeginPaint֮�ᣬ������ʾ���򼴱�Ϊ��Ч����ʽҲ����ͨ������ValidateRect��ʽʹ��ʾ�����ڵ�������������Ϊ��Ч���������о�����������Ч�����Ϊ��Ч��Ч������Ŀǰ�����е��κ�WM_PAINTѶϢ������ɾ����

GDI���
��

Ҫ���Ӵ�����ʾ�����ͼ������ʹ��Windows��ͼ��װ�ý��棨GDI����ʽ��Windows�ṩ�˼���GDI��ʽ����춽��ִ�������Ӵ�����ʾ�����ڡ������Ѿ�����һ�¿���DrawText��ʽ������Ŀǰʹ����Ϊ�ձ�����������ʽ��TextOut���ú�ʽ�ĸ�ʽ���£�

TextOut (hdc, x, y, psText, iLength) ;

TextOut���Ӵ�����ʾ����д���ִ���psText������ָ���ִ���ָ�꣬iLength���ִ��ij��ȡ�x��y�����������ִ�����ʾ����Ŀ�ʼλ�ã����ûὲ��������ǵ���ϸ�������hdc�����ǡ�װ�����ݴ��š�������GDI����Ҫ���֡�ʵ���ϣ�ÿ��GDI��ʽ����Ҫ�����������Ϊ��ʽ�ĵ�һ��������

װ������
��

���߿��ܻ��ǵã�����ֻ������һ����ֵ��Windows�������ڲ�ʹ���������ʽд���ߴ�Windowsȡ�ô��ţ�Ȼ����������ʽ��ʹ�øô��š�װ�����ݴ�����GDI��ʽ���Ӵ���ͨ��֤������������װ�����ݴ��ţ���ʽд���߾������������ʾ�����ϻ�ͼ��ʹͼ�����Լ���Ը�ر�úÿ������ѿ���

װ�����ݣ����Ϊ��DC����ʵ������GDI�ڲ���������Ͻṹ��װ���������ض�����ʾ�豸������Ѷ��ʾ����ӡ��������ء������Ѷ��ʾ����װ��������������ʾ���ϵ��ض��Ӵ���ء�

װ�������е���Щֵ��ͼ�Ρ����ԡ�����Щ���Զ�����GDI��ͼ��ʽ������ϸ�ڡ����磬���TextOut��װ�����ݵ�����ȷ�������ֵ���ɫ�����ֵı���ɫ��x�����y����ӳ�䵽�Ӵ�����ʾ����ķ�ʽ���Լ���ʾ����ʱWindowsʹ�õ����塣

����ʽ��Ҫ��ͼʱ����������ȡ��װ�����ݴ��š���ȡ���˸ô����ᣬWindows���ڶ�������ֵ�����ڲ�װ�����ݽṹ����������½������ῴ��������ͨ�����в�ͬ��GDI��ʽ�ı���ЩԤ��ֵ������������GDI��ʽ����ȡ����Щ���Ե�Ŀǰֵ����Ȼ������������GDI��ʽ�ܹ����Ӵ�����ʾ���������ػ�ͼ��

����ʽ����ʾ�����ͼ����ᣬ�������ͷ�װ�����ݴ��š����ű���ʽ�ͷ���Ͳ�����Ч���Ҳ����ٱ�ʹ�á���ʽ�����ڴ�������ѶϢ�����ڼ�ȡ�ú��ͷŴ��š����˺���CreateDC����ʽ���ڱ����ݲ�������������װ������֮�⣬��ʽ����������ѶϢ֮�䱣������װ�����ݴ��š�

WindowsӦ�ó�ʽһ��ʹ�����ַ�����ȡ��װ�����ݴ��ţ��Ա���өĻ�ϻ�ͼ��

ȡ��װ�����ݴ��ţ�����һ
��

�ڴ���WM_PAINTѶϢʱ��ʹ�����ַ��������漰BeginPaint��EndPaint������ʽ����������ʽ��Ҫ�Ӵ����ţ���Ϊ���������Ӵ�ѶϢ������ʽ����PAINTSTRUCT�ṹ�ı�������WINUSER.H��ͷ�����ж��壩�ĵ�ַΪ������Windows��ʽд����ͨ������һ�ṹ��������Ϊps�������Ӵ�ѶϢ������ʽ�ж�������

PAINTSTRUCT ps ;

�ڴ���WM_PAINTѶϢʱ���Ӵ�ѶϢ������ʽ���Ⱥ���BeginPaint��BeginPaint��ʽһ����׼������ʱ������Ч����ı������������ú�ʽҲ����ps�ṹ����λ��BeginPaint���ص�ֵ��װ�����ݴ��ţ���һ����ֵͨ���������ڽ���hdc�ı����С������Ӵ�ѶϢ������ʽ�еĶ������£�

HDC hdc ;

HDC������̬����Ϊ32λԪ����������������Ȼ�ᣬ��ʽ�Ϳ���ʹ����Ҫװ�����ݴ��ŵ�TextOut��GDI��ʽ������EndPaint�����ͷ�װ�����ݴ��š�

һ��أ�����WM_PAINTѶϢ����ʽ���£�

case	WM_PAINT:
  	hdc = BeginPaint (hwnd, &ps) ; 
          ʹ��GDI��ʽ
  	EndPaint (hwnd, &ps) ;
  	return 0 ;

�ڴ���WM_PAINTѶϢʱ������ɶԵغ���BeginPaint��EndPaint������Ӵ�ѶϢ������ʽ������WM_PAINTѶϢ���������뽫WM_PAINTѶϢ���ݸ�Windows��DefWindowProc���ڶ��Ӵ�ѶϢ������ʽ����DefWindowProc�����д��봦��WM_PAINTѶϢ��

case WM_PAINT:
	BeginPaint (hwnd, &ps) ;
	EndPaint (hwnd, &ps) ;
 	return 0 ;

������BeginPaint��EndPaint����֮����û���κ�����������ʹ��ǰ��Ч�����Ϊ��Ч�������·����Ǵ���ģ�

case WM_PAINT:
	return 0 ;   // WRONG !!!

Windows��һ��WM_PAINTѶϢ�ŵ�ѶϢ�����У�����Ϊ��ʾ�����һ������Ч�����������BeginPaint��EndPaint������ValidateRect������Windows����ʹ�������Ϊ��Ч���෴��Windows��������һ��WM_PAINTѶϢ����һֱ������ȥ��

��ͼ��Ѷ�ṹ
��

ǰ���ᵽ����WindowsΪÿ���Ӵ�����һ������ͼ��Ѷ�ṹ���������PAINTSTRUCT���������£�

typedef struct tagPAINTSTRUCT
{
  	HDC      	hdc ;
	BOOL   	    fErase ;
	RECT   	    rcPaint ;
	BOOL    	fRestore ;
	BOOL    	fIncUpdate ;
	BYTE    	rgbReserved[32] ;
} PAINTSTRUCT ;

�ڳ�ʽ����BeginPaintʱ��Windows���ʵ�����ýṹ�ĸ�����λֵ��ʹ���߳�ʽֻʹ��ǰ������λ��������λ��Windows�ڲ�ʹ�á�hdc��λ��װ�����ݴ��š��ھɰ汾��Windows�У�BeginPaint�Ĵ���ֵҲ�������װ�����ݴ��š��ڴ��������£� fErase����־ΪFALSE(0)������ζ��Windows�Ѿ���������Ч���εı�������������BeginPaint��ʽ�з��������Ҫ���Ӵ�ѶϢ������ʽ���Լ�����һЩ����������Ϊ���������д���WM_ERASEBKGNDѶϢ����Windowsʹ��WNDCLASS�ṹ��hbrBackground��λָ���Ļ�ˢ���������������WNDCLASS�ṹ�dz�ʽ��WinMain��ʼ���ڼ��¼�Ӵ����ʱʹ�õġ�����Windows��ʽʹ�ð�ɫ��ˢ�����������趨�Ӵ����ṹ��λֵ��

wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;

�����������ʽͨ������Windows��ʽInvalidateRectʹ��ʾ�����еľ���ʧЧ����ú�ʽ������һ��������ָ���Ƿ��������������������ΪFALSE����0������Windows��������������������ں�����BeginPaint��PAINTSTRUCT�ṹ��fErase��λ��ΪTRUE�����㣩��

PAINTSTRUCT�ṹ��rcPaint��λ��RECT��̬�Ľṹ�����Ѿ��ڵ������п�����RECT�ṹ������һ�����Σ����ĸ���λΪleft��top��right��bottom��PAINTSTRUCT�ṹ��rcPaint��λ��������Ч���εı߽磬��ͼ4-1��ʾ����Щֵ����ͼ��Ϊ��λ����������ʾ��������Ͻǡ���Ч������Ӧ���ػ�������


��

ͼ4-1 ��Ч���εı߽�

PAINTSTRUCT�е�rcPaint���β�������Ч���Σ�������һ������ȡ�����Ρ�����ζ��Windows����ͼ���������ڼ�ȡ�����ڣ���ȷ�е�˵�������Ч��������Ϊ���Σ���Windows����ͼ������������������ڣ���

�ڴ���WM_PAINTѶϢʱ��Ϊ���ڸ��µľ������ͼ������ʹ�����º��У�

InvalidateRect (hwnd, NULL, TRUE) ;

�ú�����BeginPaint����֮ǰ���У���ʹ������ʾ�����Ϊ��Ч�����������������ǣ��������һ���������FALSE���򲻲���������ԭ�еĶ�����������ԭ����

ͨ������Windows��ʽ�����ۺ�ʱ�յ�WM_PAINTѶϢ��������rcPaint�ṹ������¼򵥵��ػ�������ʾ�������ķ��������磬�������ʾ�������ʾ����а�����һ��Բ������ֻ��Բ��һ�����䵽����Ч�����У�����ʹ������Բ����Ч���ֱ��û�����塣����Ҫ������Բ������ʹ�ô�BeginPaint���ص�װ�����ݴ���ʱ��Windows�������rcPaint��������κβ��֡�

�ڵ����µ�HELLOWIN��ʽ�У����Dz������Ĵ���WM_PAINTѶϢʱ����Ч���Ρ����������ʾ����ǡ������Ч�����ڣ�����DrawText�ָ�֮�������ڴ���DrawText���е�ij��ʱ�̣�Windows��ȷ������������ʾ�����������������һ������Ҫʱ�䡣���ij�ʽ���ܺ��ٶȵij�ʽд����ϣ���ڴ���WM_PAINT�ڼ�ʹ����Ч���η�Χ���Ա��ⲻ��Ҫ��GDI���С��������ʱ��Ҫ��ȡ�������ͼ�����Ĵ�Ƭ������������Ե�������Ҫ��

ȡ��װ�����ݴ��ţ�������
��

��Ȼ������ڴ���WM_PAINTѶϢ�����ڼ����������ʾ���򣬵�����Ҳ�ᷢ���ڴ�����WM_PAINTѶϢ�����ڼ������ʾ�����ij������Ҳ�Ƿdz����õġ���������Ҫ��װ�����ݴ����������Ŀ�ģ���ȡ��װ�����ݵ���Ѷ��

Ҫ�õ��Ӵ���ʾ�����װ�����ݴ��ţ����Ժ���GetDC��ȡ�ô��ţ���ʹ���������ReleaseDC��

hdc = GetDC (hwnd) ;
ʹ��GDI��ʽ
ReleaseDC (hwnd, hdc) ;

��BeginPaint��EndPaintһ����GetDC��ReleaseDC��ʽ����ɶԵ�ʹ�á�����ڴ���ijѶϢʱ����GetDC����������˳��Ӵ�ѶϢ������ʽ֮ǰ����ReleaseDC����Ҫ��һ��ѶϢ�к���GetDCȴ����һ��ѶϢ����ReleaseDC��

���BeginPaint����װ�����ݴ��Ų�ͬ��GetDC���ص�װ�����ݴ��ž���һ����ȡ���Σ������������ʾ���򡣿�������ʾ�����ijһ���ֻ�ͼ������ֻ������Ч�����ϻ�ͼ�����ȷʵ������Ч���Σ�����BeginPaint��ͬ��GetDC����ʹ�κ���Ч�����Ϊ��Ч�������Ҫʹ������ʾ������Ч�����Ժ���

ValidateRect (hwnd, NULL) ;

һ����Ժ���GetDC��ReleaseDC���Լ���ѶϢ�������ִ�����ʽ�У��ͻ���ѶϢ�����ڻ�ͼ��ʽ�У�������Ӧ����ʱ����ʽ�������̸���ʹ���ߵļ��̻���������������ʾ���򣬶�����Ҫ����Ϊ���Ӵ�����Ч�����ʹ��WM_PAINTѶϢ��������һ��ȷʵ�յ���WM_PAINTѶϢ����ʽ�ͱ���Ҫ�ռ��㹻����Ѷ����ܸ�����ʾ��

��GetDC���Ƶĺ�ʽ��GetWindowDC��GetDC�������д���Ӵ���ʾ�����װ�����ݴ��ţ���GetWindowDC����д�������Ӵ���װ�����ݴ��š����磬���ij�ʽ����ʹ�ô�GetWindowDC���ص�װ�����ݴ������Ӵ��ı�������д�����֡�Ȼ������ʽͬ��ҲӦ�ô���WM_NCPAINT ��������ʾ������ơ���ѶϢ��

TextOut��ϸ��
��

TextOut�������ʾ���ֵ���õ�GDI��ʽ���﷨�ǣ�

TextOut (hdc, x, y, psText, iLength) ;

���½���ϸ�����������ʽ��

��һ��������װ�����ݴ��ţ����ȿ�����GetDC�Ĵ���ֵ��Ҳ�������ڴ���WM_PAINTѶϢʱBeginPaint�Ĵ���ֵ��

װ�����ݵ����Կ����˱���ʾ���ִ������硣���磬װ����������һ������ָ��������ɫ���ڶ���ɫΪ��ɫ���ڶ�װ�����ݻ������˰�ɫ�ı������ڳ�ʽ����ʾ���������ʱ��Windowsʹ���������ɫ��������Ԫ��Χ�ľ��οռ䣨��Ϊ����Ԫ�򡹣���

�����ֱ���ɫ�붨���Ӵ����ʱ���õı���������ͬ���Ӵ�����еı�����һ����ˢ������һ�ִ�ɫ���߷Ǵ�ɫ��ɵĻ�ˢ��Windows������������ʾ����������װ�����ݽṹ��һ���֡��ڶ����Ӵ����ṹʱ�������WindowsӦ�ó�ʽʹ��WHITE_BRUSH���Ա��ڶ�װ�������е��ڶ����ֱ�����ɫ��Windows���Բ�����ʾ���򱳾��Ļ�ˢ��ɫ��ͬ��

psText������ָ���ִ���ָ�꣬iLength���ִ�����Ԫ�ĸ��������psTextָ��Unicode�ִ������ִ��е�λԪ��������iLengthֵ���������ִ��в��ܰ����κ�ASCII������Ԫ����س������С��Ʊ����˸񣩣�Windows�Ὣ��Щ������Ԫ��ʾΪʵ�Ŀ顣Text0ut��ʶ����Ϊ�ִ�������־������Ϊ���λԪ�飨���Unicode����һ����������̬��0��������Ҫ��nLength����ָ�����ȡ�

TextOut�е�x��y������ʾ�������ִ��Ŀ�ʼλ�ã�x��ˮƽλ�ã�y�Ǵ�ֱλ�á��ִ��е�һ����Ԫ�����Ͻ�λ������(x,y)�����ڶ���װ�������У�ԭ�㣨x��y��Ϊ0�ĵ㣩����ʾ��������Ͻǡ������TextOut�н�x��y��Ϊ0���򽫴���ʾ�������Ͻǿ�ʼ����ִ���

�����Ķ�GDI��ͼ��ʽ������TextOut�����ļ�ʱ���ͻᷢ�ִ��ݸ���ʽ�����곣������Ϊ���߼����꡹���ڵ����»���ϸ�ؽ������������������ע�⣬Windows�����ࡸ����ӳ�䷽ʽ����������������GDI��ʽָ�����߼�����ת��Ϊ��ʾ����ʵ��ͼ������ķ�ʽ��ӳ�䷽ʽ��װ�������ж��壬�ڶ�ӳ�䷽ʽ��MM_TEXT��ʹ��WINGDI.H�ж����ʶ���֣�����MM_TEXTӳ�䷽ʽ�£��߼���λ��ʵ�ʵ�λ��ͬ������ͼ�أ�x��ֵ�������ҵ�����y��ֵ�������µ������ο�ͼ4-2����MM_TEXT����ϵ��Windows��PAINTSTRUCT�ṹ�ж�����Ч����ʱʹ�õ�����ϵ��ͬ����Ϊ���Ǵ����˺ܶ෽�㣨���ǣ�����ӳ�䷽ʽ������ˣ���


��

ͼ4-2 MM_TEXTӳ�䷽ʽ�µ�x�����y����

װ������Ҳ������һ�������������Ѿ���������춴�GetDCȡ�õ�װ�����ݴ��ţ��ڶ�����������������ʾ���򣻶���춴�BeginPaintȡ�õ�װ�����ݴ��ţ���Ϊ��Ч����Windows�����ڼ�������֮����κ�λ����ʾ�ִ������һ����Ԫ��һ�����ڼ��������⣬��Windows��ֻ��ʾ�������ڵ��Dz��֡�Ҫ�뽫���д���Ӵ�����ʾ����֮�ⲻ����ô���׵ģ����Բ��õ��Ļ����������������顣

ϵͳ����
��

װ�����ݻ���������������TextOut��ʾ����ʱWindowsʹ�õ����塣�ڶ�����Ϊ��ϵͳ���塹������Windows��ͷ�����е�ʶ���֣���SYSTEM_FONT��ϵͳ������Windows�����ڱ����С����ܱ��ͶԻ���������ʾ�ִ����ڶ����塣

��Windows�����ڰ汾�У�ϵͳ�����ǵȿ�(fixed-pitch)���壬����ζ��������Ԫ������ͬ���Ŀ��ȣ��dz�����춴��ֻ���Ȼ������Windows 3.0��ʼ��ϵͳ�����Ϊһ�ֱ��(variable-pitch)���壬����ζ����ͬ����Ԫ���в�ͬ�Ĵ�С�����磬��W��Ҫ�ȡ�i�������������ȵȿ�����ö������Ѿ��ǹ��ϵ���ʵ�������������������һת��ʹ�ܶ�ԭ����Windows��ʽ�벻�����ã��Ӷ�Ҫ���ʽд����ѧϰһЩʹ��������¼�����

ϵͳ������һ�֡��������塹������ζ����Ԫ������Ϊͼ�ؿ飨�ڵ�ʮ���£�������TrueType���壬��������������ģ������ȷ�еĴ�С��ϵͳ�������Ԫ��Сȡ�����Ѷ��ʾ���Ĵ�С��ϵͳ�������Ϊ����������ʾ������ʾ25��80�����֡�

��Ԫ��С
��

Ҫ��TextOut��ʾ�������֣��ͱ���ȷ���������Ԫ��С�����Ը�����Ԫ�ĸ߶�����λ��Ԫ�������У��Լ�������Ԫ�Ŀ�������λ��Ԫ�������С�

ϵͳ�������Ԫ�߶Ⱥ�ƽ�������Ƕ��٣��������ȡ�����Ѷ��ʾ����ͼ�ش�С��Windows��Ҫ����С��ʾ��С��640��480����������ʹ���߸�ϲ��800��600��1024��768����ʾ��С�����⣬�����Щ�ϴ����ʾ�ߴ磬Windows����ʹ����ѡ��ͬ��С��ϵͳ���塣

��ʽ���Ժ���GetSystemMetrics��ʽ��ȡʹ���߽����ϸ����Ӿ�Ԫ����С����Ѷ������GetTextMetricsȡ�������С��GetTextMetrics����װ��������Ŀǰѡȡ��������Ѷ���������Ҫװ�����ݴ��š�Windows�����ִ�С�IJ�ֵͬ���Ƶ���WINGDI.H�ж����TEXTMETRIC��̬�Ľṹ�С�TEXTMETRIC�ṹ��20����λ������ֻʹ��ǰ�߸���

typedef struct tagTEXTMETRIC
{
	LONG tmHeight ; 
	LONG tmAscent ; 
	LONG tmDescent ;  
	LONG tmInternalLeading ; 
	LONG tmExternalLeading ; 
	LONG tmAveCharWidth ; 
    LONG tmMaxCharWidth ; 
    		�����ṹ��λ
}
TEXTMETRIC, * PTEXTMETRIC ;

��Щ��λֵ�ĵ�λȡ���ѡ����װ������ӳ�䷽ʽ�����ڶ�װ�������£�ӳ�䷽ʽ��MM_TEXT�����ֵ�Ĵ�С����ͼ��Ϊ��λ��

Ҫʹ��GetTextMetrics��ʽ����Ҫ�ȶ���һ���ṹ������ͨ����Ϊtm����

TEXTMETRIC tm ;

����Ҫȷ�����ִ�Сʱ����ȡ��װ�����ݴ��ţ��ٺ���GetTextMetrics��

hdc = GetDC (hwnd) ;
GetTextMetrics (hdc, &tm) ;
ReleaseDC (hwnd, hdc) ;

���ᣬ���Ϳ��Բ鿴���ֳߴ�ṹ�е�ֵ�����п��ܱ������е�һЩ�Ա�����ʹ�á�

���ִ�С��ϸ��
��

TEXTMETRIC�ṹ�ṩ�˹��Ŀǰװ��������ѡ�õ�����ķḻ��Ѷ�����ǣ�����������Сֻ��5��ֵȷ��������4��ֵ��ͼ4-3��ʾ��


��

ͼ4-3 ����������������Ԫ��С��4��ֵ

����Ҫ��ֵ��tmHeight������tmAscent��tmDescent�ĺ͡�������ֵ��ʾ�˻�׼��������Ԫ���������߶ȡ�����ࡹ��leading��ָӡ�������������ּ����Ŀռ䡣��TEXTMETRIC�ṹ�У��ڲ��ļ�������tmAscent�У����Ҳ��tmHeight�У����������������������ų��ֵĵط���tmInternalLeading��λ�ɱ����0������������£�����������ĸ�����������Ա������������š�

TEXTMETRIC�ṹ������һ����������tmHeightֵ�е���λtmExternalLeading��������������߽�����ں�����Ԫ֮��Ŀռ��С���ڰ���������֮��Ŀ�϶ʱ�������Խ�������߽����ֵ��Ҳ���Ծܾ�������ϵͳ������tmExternalLeading����Ϊ0�������û����ͼ4-3����ʾ�����������Ҳ���������ǣ�ͼ4-3ȷʵ����Windows��640��480����ʾ��������ʹ�õ�ϵͳ���塣��

TEXTMETRICS�ṹ������������Ԫ���ȵ�������λ����tmAveCharWidth��Сд��ĸ��Ȩƽ�����ȣ���tmMaxCharWidth�������������Ԫ�Ŀ��ȣ�����춶������壬������ֵ����ȵģ�ͼ4-3����Щֵ�ֱ�Ϊ7��14����

���µķ�����ʽ����Ҫ��һ����Ԫ���ȣ�����д��ĸ��ƽ�����ȣ��������tmAveCharWidth����150�����¼��������

������ʶ����ϵͳ����Ĵ�Сȡ���Windows��ִ�е���Ѷ��ʾ���Ľ����ȣ���ijЩ����£�ȡ���ʹ����ѡȡ��ϵͳ����Ĵ�С��Windows�ṩ��һ����װ���޹ص�ͼ�ν��棬����ʽд���߻���������Ҫ�����ġ���Ҫ�뵱Ȼ���ز²������С��д��Windows��ʽ��Ҳ��Ҫ��ֵ������������ʹ��GetTextMetrics��ʽȡ����һ��Ѷ��

��ʽ������
��

Windows�����ᣬϵͳ����Ĵ�С�Ͳ��ᷢ���ı䣬�����ڳ�ʽִ�й����У���ʽд����ֻ��Ҫ����һ��GetTexMetrics����������Ӵ�ѶϢ������ʽ�д���WM_CREATEѶϢʱ���д˺��У�WM_CREATEѶϢ���Ӵ�ѶϢ������ʽ���յĵ�һ��ѶϢ����WinMain�к���CreateWindowʱ��Windows����һ��WM_CREATEѶϢ�����Ӵ�ѶϢ������ʽ��

����Ҫ��дһ��Windows��ʽ������ʾ������ʾ�������֣�����Ҫ��ȡ����Ԫ���Ⱥ͸߶ȡ����������Ӵ�ѶϢ������ʽ�ڶ�����������������ƽ����Ԫ����(cxChar)���ܵ���Ԫ�߶�(cyChar)��

static int cxChar, cyChar ;

������������c������count����������ָͼ��������x��y��ϣ��ֱ�ָ���͸ߡ���Щ��������Ϊstatic��̬��������Ϊ�������Ӵ�ѶϢ������ʽ�д�������ѶϢ����WM_PAINT��ʱҲӦ������Ч�ġ���������ں�ʽ���涨�壬����Ҫ����Ϊstatic��

������ȡ��ϵͳ�������Ԫ���Ⱥ͸߶ȵ�WM_CREATE��ʽ�룺

case WM_CREATE:
	hdc = GetDC (hwnd) ;
	GetTextMetrics (hdc, &tm) ;

	cxChar = tm.tmAveCharWidth ;
	cyChar = tm.tmHeight + tm.tmExternalLeading ;

	ReleaseDC (hwnd, hdc) ;
	return 0 ;

ע�����ڼ���cyCharʱ������tmExternalLeading��λ����Ȼ����λ��ϵͳ������Ϊ0��������Ϊ��ʹ�����ֵĿɶ��Ը��ã����Ի���Ӧ�ð���������ȥ�������Ӵ�����ÿ��cyCharͼ�ؾͻ���ʾһ�����֡�

���ᷢ�ֳ�����Ҫ��ʾ��ʽ�������ָ��򵥵��ִ������ڵڶ��½�������������ʹ���õĹ��ߣ��ɰ���printf��ʽ�����������������ǿ���ʹ��sprintf��Windows���sprintf��wsprintf����Щ��ʽ��printf���ƣ�ֻ�ǰѸ�ʽ���ִ��ŵ��ִ��С�Ȼ�ᣬ������TextOut���ִ��������ʾ���ϡ��dz�������ǣ���sprintf��wsprintf���ص�ֵ�����ִ��ij��ȡ������Խ����ֵ���ݸ�TextOut��ΪiLength����������ij�ʽ����ʾ��wsprintf��TextOut�ĵ�����ϣ�

int   iLength ;
TCHAR szBuffer [40] ; 
�����г�ʽ
iLength = wsprintf (szBuffer, TEXT ("The sum of %i and %i is %i"),
         		       iA, iB, iA + iB) ;
TextOut (hdc, x, y, szBuffer, iLength) ;

��������򵥵���������Խ�nLength�Ķ���ֵ��TextOut����ͬһ�������У��Ӷ����趨��iLength��

TextOut (hdc, x, y, szBuffer,
   	wsprintf (szBuffer, TEXT ("The sum of %i and %i is %i"),
     		   iA, iB, iA + iB)) ;

��Ȼ������д�������ÿ������ǹ�����ǰ����һ���ġ�

�ۺ�ʹ��
��

���ڣ������ƺ��Ѿ��߱�����өĻ����ʾ������������Ҫ������֪ʶ������֪�������WM_PAINTѶϢ�����ڼ�ȡ��һ��װ�����ݴ��ţ����ʹ��TextOut��ʽ�Լ���θ�����Ԫ��С�������־࣬ʣ�µľ�����ʾһ��������Ķ����ˡ�

��ǰһ������Ǵ��֪����Windows��GetSystemMetrics��ʽ��ȡ�õ���Ѷ�Ǻ�������ģ��ú�ʽ����Windows�в�ͬ�Ӿ�Ԫ���Ĵ�С��Ѷ����ͼʾ���αꡢ�����к;����еȡ����ǵĴ�С����ʾ����������ʽ�IJ�ͬ��������ͬ��GetSystemMetrics���ڳ�ʽ�������װ���޹�ͼ���������Ҫ��ʽ��

�ú�ʽ��Ҫһ������������������������Windows��ͷ����������75����������ʶ���֣�ʶ���ֵ���������ÿ���汾��Windows�ķ��������ϵ����ӣ���Windows 1.0�ij�ʽд�����ļ��н��г���26������GetSystemMetrics����һ���������������ͨ�����Dz�����ָ����ͼ��Ԫ����С��

����������дһ����ʽ����ʾһЩ���Դ�GetSystemMetrics������ȡ�õ���Ѷ����ʾ��ʽΪÿ���Ӿ�Ԫ��һ�С�������ǽ���һ����ͷ�������ڱ�ͷ�����ж���һ���ṹ���У��˽ṹ����GetSystemMetrics������Ӧ��Windows��ͷ����ʶ���ֺͺ��������ص�ÿ��ֵ��Ӧ���ִ���������������Ҫ����һЩ����ͷ������ΪSYSMETS.H�����ʽ4-1��ʾ��

 ï¿½ï¿½Ê½4-1  SYSMETS.H
/*---------------------------------------------------------
 SYSMETS.H -- System metrics display structure
-----------------------------------------------------------*/
#define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0]))
struct
{
	int  	Index ;
	TCHAR * 	szLabel ;
 	TCHAR * 	szDesc ;
}
sysmetrics [] =
{
  	SM_CXSCREEN,    TEXT ("SM_CXSCREEN"),              
                 	TEXT ("Screen width in pixels"),
	SM_CYSCREEN, 	TEXT ("SM_CYSCREEN"),              
 			        TEXT ("Screen height in pixels"),
	SM_CXVSCROLL, 	TEXT ("SM_CXVSCROLL"),             
			        TEXT ("Vertical scroll width"),
	SM_CYHSCROLL,  	TEXT ("SM_CYHSCROLL"),             
        			TEXT ("Horizontal scroll height"),
	SM_CYCAPTION, 	TEXT ("SM_CYCAPTION"),             
      			    TEXT ("Caption bar height"),
	SM_CXBORDER, 	TEXT ("SM_CXBORDER"),              
			        TEXT ("Window border width"),
	SM_CYBORDER,	TEXT ("SM_CYBORDER"),              
			        TEXT ("Window border height"),
	SM_CXFIXEDFRAME,TEXT ("SM_CXFIXEDFRAME"),          
			        TEXT ("Dialog window frame width"),
	SM_CYFIXEDFRAME,TEXT ("SM_CYFIXEDFRAME"),          
			        TEXT ("Dialog window frame height"),
	SM_CYVTHUMB,	TEXT ("SM_CYVTHUMB"),              
 			        TEXT ("Vertical scroll thumb height"),
	SM_CXHTHUMB,    TEXT ("SM_CXHTHUMB"),              
       			    TEXT ("Horizontal scroll thumb width"),
	SM_CXICON, 	    TEXT ("SM_CXICON"),                
			        TEXT ("Icon width"),
	SM_CYICON,	    TEXT ("SM_CYICON"),                
  			        TEXT ("Icon height"),
	SM_CXCURSOR,	TEXT ("SM_CXCURSOR"),              
			        TEXT ("Cursor width"),
	SM_CYCURSOR,    TEXT ("SM_CYCURSOR"),              
			        TEXT ("Cursor height"),
	SM_CYMENU,	    TEXT ("SM_CYMENU"),                
			        TEXT ("Menu bar height"),
	SM_CXFULLSCREEN,TEXT ("SM_CXFULLSCREEN"),          
			        TEXT ("Full screen client area width"),
	SM_CYFULLSCREEN,TEXT ("SM_CYFULLSCREEN"),          
			        TEXT ("Full screen client area height"),
	SM_CYKANJIWINDOW,TEXT ("SM_CYKANJIWINDOW"),         
			         TEXT ("Kanji window height"),
	SM_MOUSEPRESENT, TEXT ("SM_MOUSEPRESENT"),          
			         TEXT ("Mouse present flag"),
	SM_CYVSCROLL,	 TEXT ("SM_CYVSCROLL"),             
			         TEXT ("Vertical scroll arrow height"),
	SM_CXHSCROLL,	 TEXT ("SM_CXHSCROLL"),             
 			         TEXT ("Horizontal scroll arrow width"),
	SM_DEBUG, 	     TEXT ("SM_DEBUG"),                 
			         TEXT ("Debug version flag"),
	SM_SWAPBUTTON,	 TEXT ("SM_SWAPBUTTON"),            
			         TEXT ("Mouse buttons swapped flag"),
	SM_CXMIN,	     TEXT ("SM_CXMIN"),                 
			         TEXT ("Minimum window width"),
	SM_CYMIN,	     TEXT ("SM_CYMIN"),                 
			         TEXT ("Minimum window height"),
	SM_CXSIZE,	     TEXT ("SM_CXSIZE"),                
			         TEXT ("Min/Max/Close button width"),
	SM_CYSIZE,	     TEXT ("SM_CYSIZE"),                
			         TEXT ("Min/Max/Close button height"),
	SM_CXSIZEFRAME,	 TEXT ("SM_CXSIZEFRAME"),           
			         TEXT ("Window sizing frame width"),
	SM_CYSIZEFRAME,	 TEXT ("SM_CYSIZEFRAME"),           
			         TEXT ("Window sizing frame height"),
	SM_CXMINTRACK,	 TEXT ("SM_CXMINTRACK"),            
			         TEXT ("Minimum window tracking width"),
	SM_CYMINTRACK,	 TEXT ("SM_CYMINTRACK"),            
			         TEXT ("Minimum window tracking height"),
	SM_CXDOUBLECLK,	 TEXT ("SM_CXDOUBLECLK"),           
			         TEXT ("Double click x tolerance"),
	SM_CYDOUBLECLK,	 TEXT ("SM_CYDOUBLECLK"),           
			         TEXT ("Double click y tolerance"),
	SM_CXICONSPACING,TEXT ("SM_CXICONSPACING"),         
			         TEXT ("Horizontal icon spacing"),
	SM_CYICONSPACING,TEXT ("SM_CYICONSPACING"),         
			         TEXT ("Vertical icon spacing"),
	SM_MENUDROPALIGNMENT,	TEXT ("SM_MENUDROPALIGNMENT"),     
			                TEXT ("Left or right menu drop"),
	SM_PENWINDOWS,	        TEXT ("SM_PENWINDOWS"),            
			                TEXT ("Pen extensions installed"),
	SM_DBCSENABLED,	        TEXT ("SM_DBCSENABLED"),           
			                TEXT ("Double-Byte Char Set enabled"),
	SM_CMOUSEBUTTONS,	    TEXT ("SM_CMOUSEBUTTONS"),         
			                TEXT ("Number of mouse buttons"),
	SM_SECURE, 	            TEXT ("SM_SECURE"),                
			                TEXT ("Security present flag"),
	SM_CXEDGE,	            TEXT ("SM_CXEDGE"),                
			                TEXT ("3-D border width"),
	SM_CYEDGE,	            TEXT ("SM_CYEDGE"),                
			                TEXT ("3-D border height"),
	SM_CXMINSPACING, 	    TEXT ("SM_CXMINSPACING"),          
			                TEXT ("Minimized window spacing width"),
	SM_CYMINSPACING,	    TEXT ("SM_CYMINSPACING"),          
			                TEXT ("Minimized window spacing height"),
	SM_CXSMICON,	        TEXT ("SM_CXSMICON"),              
			                TEXT ("Small icon width"),
	SM_CYSMICON,	        TEXT ("SM_CYSMICON"),              
			                TEXT ("Small icon height"),
	SM_CYSMCAPTION,	        TEXT ("SM_CYSMCAPTION"),           
			                TEXT ("Small caption height"),
	SM_CXSMSIZE,	        TEXT ("SM_CXSMSIZE"),              
			                TEXT ("Small caption button width"),
	SM_CYSMSIZE,	        TEXT ("SM_CYSMSIZE"),              
			                TEXT ("Small caption button height"),
	SM_CXMENUSIZE,	        TEXT ("SM_CXMENUSIZE"),            
			                TEXT ("Menu bar button width"),
	SM_CYMENUSIZE,	        TEXT ("SM_CYMENUSIZE"),            
			                TEXT ("Menu bar button height"),
	SM_ARRANGE,	            TEXT ("SM_ARRANGE"),               
			                TEXT ("How minimized windows arranged"),
	SM_CXMINIMIZED,	        TEXT ("SM_CXMINIMIZED"),           
			                TEXT ("Minimized window width"),
	SM_CYMINIMIZED,	        TEXT ("SM_CYMINIMIZED"),           
			                TEXT ("Minimized window height"),
	SM_CXMAXTRACK,	        TEXT ("SM_CXMAXTRACK"),            
			                TEXT ("Maximum draggable width"),
	SM_CYMAXTRACK,	        TEXT ("SM_CYMAXTRACK"),            
			                TEXT ("Maximum draggable height"),
	SM_CXMAXIMIZED,	        TEXT ("SM_CXMAXIMIZED"),           
			                TEXT ("Width of maximized window"),
	SM_CYMAXIMIZED,	        TEXT ("SM_CYMAXIMIZED"),           
			                TEXT ("Height of maximized window"),
	SM_NETWORK, 	        TEXT ("SM_NETWORK"),               
			                TEXT ("Network present flag"),
	SM_CLEANBOOT,       	TEXT ("SM_CLEANBOOT"),             
			                TEXT ("How system was booted"),
	SM_CXDRAG,	            TEXT ("SM_CXDRAG"),                
			                TEXT ("Avoid drag x tolerance"),
	SM_CYDRAG,	            TEXT ("SM_CYDRAG"),                
			                TEXT ("Avoid drag y tolerance"),
	SM_SHOWSOUNDS, 	        TEXT ("SM_SHOWSOUNDS"),            
			                TEXT ("Present sounds visually"),
	SM_CXMENUCHECK,	        TEXT ("SM_CXMENUCHECK"),           
			                TEXT ("Menu check-mark width"),
	SM_CYMENUCHECK,	        TEXT ("SM_CYMENUCHECK"),           
		                   	TEXT ("Menu check-mark height"),
	SM_SLOWMACHINE,	        TEXT ("SM_SLOWMACHINE"),           
			                TEXT ("Slow processor flag"),
	SM_MIDEASTENABLED,	    TEXT ("SM_MIDEASTENABLED"),        
			                TEXT ("Hebrew and Arabic enabled flag"),
	SM_MOUSEWHEELPRESENT,	TEXT ("SM_MOUSEWHEELPRESENT"),     
			                TEXT ("Mouse wheel present flag"),
	SM_XVIRTUALSCREEN,	    TEXT ("SM_XVIRTUALSCREEN"),        
			                TEXT ("Virtual screen x origin"),
	SM_YVIRTUALSCREEN,	    TEXT ("SM_YVIRTUALSCREEN"),        
			                TEXT ("Virtual screen y origin"),
	SM_CXVIRTUALSCREEN,	    TEXT ("SM_CXVIRTUALSCREEN"),       
			                TEXT ("Virtual screen width"),
	SM_CYVIRTUALSCREEN,	    TEXT ("SM_CYVIRTUALSCREEN"),       
			                TEXT ("Virtual screen height"),
	SM_CMONITORS,	        TEXT ("SM_CMONITORS"),             
			                TEXT ("Number of monitors"),
	SM_SAMEDISPLAYFORMAT,	TEXT ("SM_SAMEDISPLAYFORMAT"),     
			                TEXT ("Same color format flag")
} ;

��ʾ��Ѷ�ij�ʽ����ΪSYSMETS1��SYSMETS1.C��ԭʼ�����ʽ4-2��ʾ�����ڴ������ʽ�뿴����������Ϥ��WinMain�еij�ʽ��ʵ������HELLOWIN�еij�ʽ����ͬ������WndProc�еĴ󲿷ֳ�ʽ�붼�Ѿ����۹��ˡ�

 ï¿½ï¿½Ê½4-2  SYSMETS1.C
/*------------------------------------------------------------------
 SYSMETS1.C -- System Metrics Display Program No. 1
         	       (c) Charles Petzold, 1998
  ----------------------------------------------------------------*/
#include <windows.h>
#include "sysmets.h"

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
		      PSTR szCmdLine, int iCmdShow)
{
	static TCHAR szAppName[] = TEXT ("SysMets1") ;
	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 ("This program requires Windows NT!"), 
            			szAppName, MB_ICONERROR) ;
    
	   return 0 ;
     }
	hwnd = CreateWindow (szAppName, TEXT ("Get System Metrics No. 1"),
			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 int	cxChar, cxCaps, cyChar ;
	HDC     		hdc ;
	int     		i ;
	PAINTSTRUCT ps ;	
	TCHAR       		szBuffer [10] ;
	TEXTMETRIC  tm ;

	switch (message)
     {
 	case	WM_CREATE:
	  	hdc = GetDC (hwnd) ;

	   	GetTextMetrics (hdc, &tm) ;
	   	cxChar = tm.tmAveCharWidth ;
	   	cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;
	   	cyChar = tm.tmHeight + tm.tmExternalLeading ;

	   	ReleaseDC (hwnd, hdc) ;
	   	return 0 ;

	case 	WM_PAINT :
	   	hdc = BeginPaint (hwnd, &ps) ;

	   	for (i = 0 ; i < NUMLINES ; i++)
          		{
		TextOut 	(hdc, 0, cyChar * i,                      
	          		sysmetrics[i].szLabel,
	          		lstrlen (sysmetrics[i].szLabel)) ;

		TextOut 	(hdc, 22 * cxCaps, cyChar * i,      
	          		sysmetrics[i].szDesc,
	          		lstrlen (sysmetrics[i].szDesc)) ;

			SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;
	     TextOut (hdc, 22 * cxCaps + 40 * cxChar, cyChar * i, 	szBuffer,
	wsprintf (szBuffer, TEXT ("%5d"),
	GetSystemMetrics (sysmetrics[i].iIndex))) ;
	           SetTextAlign (hdc, TA_LEFT | TA_TOP) ;
          }
		EndPaint (hwnd, &ps) ;
		return 0 ;
	case	WM_DESTROY :
		PostQuitMessage (0) ;
	return 0 ;
     }
	return DefWindowProc (hwnd, message, wParam, lParam) ;
}

ͼ4-4��ʾ���ڱ�׼VGA��ִ�е�SYSMETS1���ڳ�ʽ��ʾ�����ǰ���п��Կ�����өĻ������640��ͼ�أ�өĻ�߶���480��ͼ�أ�������ֵ�Լ���ʽ����ʾ������ֵ���ܻ�����Ѷ��ʾ����̬�IJ�ͬ����ͬ��


��

ͼ4-4 SYSMETS1����ʾ

SYSMETS1.C�Ӵ�ѶϢ������ʽ
��

SYSMETS1.C��ʽ�е�WndProc�Ӵ�ѶϢ������ʽ��������ѶϢ��WM_CREATE��WM_PAINT��WM_DESTROY��WM_DESTROYѶϢ�Ĵ�������������µ�HELLOWIN��ʽ��ͬ��

WM_CREATEѶϢ���Ӵ�ѶϢ������ʽ���յ��ĵ�һ��ѶϢ����CreateWindow��ʽ�����Ӵ�ʱ��Windows�������ѶϢ���ڴ���WM_CREATEѶϢʱ��SYSMETS1����GetDCȡ���Ӵ���װ�����ݣ�������GetTextMetricsȡ���ڶ�ϵͳ��������ִ�С��SYSMETS1��ƽ����Ԫ���ȱ�����cxChar�У�����Ԫ���ܸ߶ȣ������ⲿ��ࣩ������cyChar�С�

SYSMETS1������д��ĸ��ƽ�����ȱ����ھ�̬����cxCaps�С���춹̶����ȵ����壬 cxCaps���cxChar����춿ɱ�������壬cxCaps�趨ΪcxChar����150������춿ɱ�������壬TEXTMETRIC�ṹ�е�tmPitchAndFamily��λ�ĵ�λԪΪ1����춹̶��������壬��ֵΪ0�� SYSMETS1ʹ�����λԪ��cxChar����cxCaps��

cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;

SYSMETS1�ڴ���WM_PAINTѶϢ�����ڼ���������Ӵ�����������ͨ�����Ӵ�ѶϢ������ʽ�Ⱥ���BeginPaintȡ��װ�����ݴ��ţ�Ȼ����һ��for������SYSMETS.H�ж����sysmetrics�ṹ��ÿһ�н��л�Ȧ����������������TextOut��ʽ��ʾ�����ÿһ�У�TextOut�ĵ������������趨Ϊ��

cyChar * i

�������ָʾ���ִ�����������ʾ���򶥲���ͼ��λ�á�

��һ��TextOut�����ڵ�һ����ʾ�˴�дʶ���֡�TextOut�ĵڶ���������0������˵���ִ���ʾ��������Ե��ʼ�����ֵ���������sysmetrics�ṹ��szLabel��λ����ʹ��Windows��ʽlstrlen�������ִ��ij��ȣ�����TextOut��Ҫ������һ��������

�ڶ���TextOut������ʾ�˶�ϵͳ�ߴ�ֵ����������Щ���������sysmetrics�ṹ��szDesc��λ�С�����������£�TextOut�ĵڶ��������趨Ϊ��

22 * cxCaps

��һ����ʾ����Ĵ�дʶ������20����Ԫ����˵ڶ��б����ڵ�һ�����ֿ�ͷ����20 �� cxCaps����ʼ����ʹ��22����������֮���һ�����Ŀռ䡣

������TextOut������ʾ��GetSystemMetrics��ʽȡ�õ���ֵ���������ʹ�ø�ʽ�����Ҷ������ֵ��Щ���֡���0��9�����־�����ͬ�Ŀ��ȣ�����������ȱȿո���ȴ���ֵ���Ա�һ�����ֿ������Բ�ͬ����ֵӦ�ôӲ�ͬ�ĺ���λ�ÿ�ʼ��

��ô���������ָ���ִ�������ͼ��λ�ã�������ָ���ִ��Ŀ�ʼλ�ã��Դ����Ҷ�����ֵ���Ƿ������һЩ�أ���SetTextAlign��ʽ�Ϳ���������һ�㡣��SYSMETS1���У�

SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;

֮�ᣬ��������TextOut��ʽ�����꽫ָ���ִ������Ͻǣ����������Ͻǡ�

��ʾ������TextOut��ʽ�ĵڶ��������趨Ϊ��

22 * cxCaps + 40 * cxChar

ֵ40*cxChar�����˵ڶ��еĿ��Ⱥ͵����еĿ��ȡ���TextOut��ʽ֮�ᣬ��һ����SetTextAlign�ĺ��н����뷽ʽ�趨����ͨ��ʽ���Խ����´λ�Ȧ��

�ռ䲻��
��

��SYSMETS1��ʽ�д�����һ�����Ѵ��������⣺��������һ����өĻ���߽����ȵ���ʾ����������޷�����ϵͳ�߶��б������Ἰ�С�����Ӵ�̫խ����������������ֵ��

SYSMETS1��֪��������⡣�������Ǿͻ���ʾһ��ѶϢ����˵����Ǹ������ʽ������֪��������ʾ�����ж�������Ӵ�������ʼ������֣�������Windows�ü�������ʾ����ײ������ݡ�

��Ȼ����ܲ����롣Ϊ�˽��������⣬���ǵĵ�һ��������ȷ����ʽ����ʾ������������������ݡ�

��ʾ����Ĵ�С
��

�����ʹ�ù����е�WindowsӦ�ó�ʽ�����ܻᷢ���Ӵ��ijߴ�仯�����Ӵ����ʱ���ٶ��Ӵ�ֻ�б����в���û�й��ܱ�������ʾ���򼸺�ռ��������өĻ����һ����˵���ʾ����ijߴ����ͨ����SM_CXFULLSCREEN��SM_CYFULLSCREENΪ��������GetSystemMetrics����á��Ӵ�����С�ߴ���Ժ�С����ʱ���������ڣ�������˵��ʾ�����ˡ�

�����һ�£�����ʹ��GetClientRect��ʽ��ȡ����ʾ����Ĵ�С��ʹ�������ʽû��ʲô���ã���������ÿ��Ҫʹ����Ѷʱ��ȥ������һ����û��Ч�ʵġ�ȷ���Ӵ���ʾ�����С�ĸ��÷��������Ӵ�ѶϢ������ʽ�д���WM_SIZEѶϢ�����Ӵ���С�ı�ʱ��Windows���Ӵ�ѶϢ������ʽ����һ��WM_SIZEѶϢ�������Ӵ�ѶϢ������ʽ��lParam�����ĵ������а�����ʾ����Ŀ��ȣ��������а�����ʾ����ĸ߶ȡ�Ҫ������Щ�ߴ磬��Ҫ���Ӵ�ѶϢ������ʽ�ж���������̬������

static int cxClient, cyClient ;

��cxChar��cyChar���ƣ��������������Ӵ�ѶϢ������ʽ�ڶ���Ϊ��̬��������Ϊ�����ᴦ������ѶϢʱ���õ����ǡ�����WM_SIZE�ķ������£�

case	WM_SIZE:
 	cxClient = LOWORD (lParam) ;
 	cyClient = HIWORD (lParam) ;
 	return 0 ;

ʵ����������ÿ��Windows��ʽ�п������Ƶij�ʽ�롣LOWORD��HIWORD�޼���Windows��ͷ����WINDEF.H�ж��塣��Щ�޼��Ķ��忴������������

#define LOWORD(l) ((WORD)(l))
#define HIWORD(l) ((WORD)(((DWORD)(l) >> 16) & 0xFFFF))

�������޼�����WORDֵ��16λԪ������������������Χ��0��0xFFFF����һ�㣬����Щֵ������32λԪ�к������С���Ͳ���ǣ�����κ�ת�����⣬��ʹ����Щֵ��������Ҫ���κμ��������ʹ�á�

������Windows��ʽ�У�WM_SIZEѶϢ��Ȼ����һ��WM_PAINTѶϢ��Ϊʲô�أ���Ϊ�����Ƕ����Ӵ����ʱָ���Ӵ������ʽΪ��

CS_HREDRAW | CS_VREDRAW

�����Ӵ������ʽ����Windows�����ˮƽ���ߴ�ֱ��С�����ı䣬 ��ǿ�Ƹ�����ʾ����

�����¹�ʽ�����������ʾ��������ʾ�����ֵ���������

cyClient / cyChar

�����ʾ����ĸ߶�̫С�����޷���ʾһ����������Ԫ�������ʽ�Ľ������Ϊ0�����Ƶأ�����ʾ�����ˮƽ���������ʾ��Сд��Ԫ�Ľ�����ĿΪ��

cxClient / cxChar

����ڴ���WM_CREATEѶϢ�����ڼ�ȡ��cxChar��cyChar�����õ��������������㹫ʽ�л���ֱ�0�����������WinMain����CreateWindowʱ���Ӵ�ѶϢ������ʽ����һ��WM_CREATEѶϢ����WinMain����ShowWindow֮����յ���һ��WM_CREATEѶϢ����ʱcxChar��cyChar�Ѿ����������ķ���ֵ�ˡ�

�����ʾ����Ĵ�С�������������е����ݣ���ô��֪���Ӵ���ʾ����Ĵ�Сֻ��Ϊʹ�����ṩ������ʾ�����ھ������ֵĵ�һ��������������������������WindowsӦ�ó�ʽ����Ϥ���ͺܿ���֪������������£�������Ҫʹ�á������С���

������
��

��������ͼ��ʹ���߽�������õĹ���֮һ����������ʹ�ã������ṩ�˺ܺõ��Ӿ�����Ч����������ʹ�þ�������ʾ�κζ���--���������֡�ͼ�Ρ��������Ͽ��¼��ͼ�������ҳ��ֻҪ������Ŀռ䳬�����Ӵ�����ʾ���������ṩ�Ŀռ䣬�Ϳ���ʹ�þ����С�

�����м��д�ֱ����ģ��������ƶ�����Ҳ��ˮƽ����ģ��������ƶ�����ʹ���߿���ʹ�û����ھ��������˵ļ�ͷ�ϻ����ڼ�ͷ֮��������е�һ�£���ʱ�����������项�ھ������ڵ��ƶ�λ��������ʾ����Ѷ�������ļ��еĽ������λ�óɱ�����ʹ����Ҳ�����û����϶��������鵽�ض���λ�á�ͼ4-5��ʾ�˴�ֱ�����еĽ����÷���


��

ͼ4-5 ��ֱ������

��ʱ����ʽд���߶Ծ�������������⣬��Ϊ���ǵĹ۵���ʹ���ߵĹ۵㲻ͬ��ʹ�������¾������뿴���ļ�������IJ��֣����ǣ���ʽʵ�����ǽ��ļ�������ʾ�Ӵ������ƶ���Windows�ļ��ͱ�ͷ����ʶ����������ʹ���ߵĹ۵㣺���Ͼ�����ζ�����ļ��Ŀ�ͷ�ƶ������¾�����ζ�����ļ�β���ƶ���

��������Ӧ�ó�ʽ�а���ˮƽ���ߴ�ֱ�ľ����У���ʽд����ֻ��Ҫ��CreateWindow�ĵ����������а����Ӵ���ʽ��WS��ʶ����WS_VSCROLL����ֱ��������/��WS_HSCROLL��ˮƽ���������ɡ���Щ������ͨ�������Ӵ����Ҳ��͵ײ�����չΪ��ʾ������������Ȼ���ȡ���ʾ���򲻰�����������ռ�ݵĿռ䡣����ض�����ʾ������ʽ����ʾ�����ȣ���ֱ�����еĿ��Ⱥ�ˮƽ�����еĸ߶��Ǻ㶨�ġ������Ҫ��Щֵ������ʹ��GetSystemMetrics������ȡ�ã���ǰ��ij�ʽ��������

Windows�������Ծ����е����л�����������ǣ��Ӵ�������û���Զ��ļ��̽��档��������α������ɾ������ܣ�������ṩ�ⷽ��ij�ʽ�루���ǽ�����һ����һ���汾��SYSMETS��ʽ��������һ�㣩��

�����еķ�Χ��λ��
��

ÿ�������о���һ����صġ���Χ��������һ���������ֱ������Сֵ�����ֵ���͡�λ�á������Ǿ��������ڴ˷�Χ�ڵ�λ�ã��������������ھ����еĶ��������󲿣�ʱ�����������λ���Ƿ�Χ����Сֵ���ھ����еĵײ������Ҳ���ʱ�����������λ���Ƿ�Χ�����ֵ��

���ڶ�����£������еķ�Χ�Ǵ�0���������󲿣���100���ײ����Ҳ�����������Χ�ı�Ϊ������춳�ʽ����ֵҲ�Ǻ����׵ģ�

SetScrollRange (hwnd, iBar, iMin, iMax, bRedraw) ;

����iBarΪSB_VERT����SB_HORZ��iMin��iMax�ֱ��Ƿ�Χ����Сֵ�����ֵ�������ҪWindows�����·�Χ�ػ������У�������bRedrawΪTRUE������ں���SetScrollRange�ᣬ������Ӱ�������λ�õ�������ʽ����Ӧ�ý�bRedraw�趨ΪFALSE�Ա��������ػ�����

���������λ��������ɢ������ֵ�����磬��ΧΪ0��4�ľ����о���5����������λ�ã���ͼ4-6��ʾ��


��

ͼ4-6 ����5����������λ�õľ�����

������ʹ��SetScrollPos�ھ����з�Χ�������µľ�������λ�ã�

SetScrollPos (hwnd, iBar, iPos, bRedraw) ;

����iPos����λ�ã���������iMin��iMax�ķ�Χ�ڡ�Windows�ṩ�����Ƶĺ�ʽ��GetScrollRange��GetScrollPos����ȡ�þ����е�Ŀǰ��Χ��λ�á�

�ڳ�ʽ��ʹ�þ�����ʱ����ʽд������Windows��ͬ����ά���������Լ����¾��������λ�á�������Windows�Ծ����еĴ�����

  • �������о����л����¼�
    ��
  • ��ʹ�����ھ������ڵ�������ʱ���ṩһ�֡�������ʾ������˸
    ��
  • ��ʹ�����ھ��������϶���������ʱ���ƶ���������
    ��
  • Ϊ�����������Ӵ����Ӵ�ѶϢ������ʽ���;�����ѶϢ
    ��

�����dz�ʽд����Ӧ����ɵĹ�����

  • ��ʼ�������еķ�Χ��λ��
    ��
  • �����Ӵ�ѶϢ������ʽ�ľ�����ѶϢ
    ��
  • ���¾������ھ��������λ��
    ��
  • ������ʾ����������Ի�Ӧ�Ծ����еĸ���
    ��

�������еĴ��������һ���������ǿ�һЩ��ʽ��ʱ��Щ���Եø��������塣

������ѶϢ
��

���û��󵥻������л����϶���������ʱ��Windows���Ӵ�ѶϢ������ʽ����WM_VSCROLL���������ƶ�����WM_HSCROLL���������ƶ���ѶϢ���ھ������ϵ�ÿ�������������ٲ�������ѶϢ��һ���ڰ��»���ťʱ������һ�����ͷŰ�ťʱ������

�����е�ѶϢһ���� WM_VSCROLL��WM_HSCROLLҲ����wParam��lParamѶϢ���������������Ϊ�Ӵ���һ���ֶ������ľ�����ѶϢ�������Ժ���lParam����ֻ������Ϊ���Ӵ��������ľ����У�ͨ���ڶԻ������ڣ���

wParamѶϢ��������Ϊһ���������һ�������顣wParam�ĵ�������һ����ֵ����ָ���˻���Ծ����н��еIJ����������ֵ������һ����֪ͨ�롹��֪ͨ���ֵ����SB��������scroll bar�������У�������ͷ��ʶ���ֶ��塣��������WINUSER.H�ж����֪ͨ�룺

#define SB_LINEUP 	        0
#define SB_LINELEFT  	    0
#define SB_LINEDOWN  	    1
#define SB_LINERIGHT 	    1
#define SB_PAGEUP  	        2 
#define SB_PAGELEFT  	    2
#define SB_PAGEDOWN  	    3
#define SB_PAGERIGHT 	    3
#define SB_THUMBPOSITION	4
#define SB_THUMBTRACK	    5
#define SB_TOP 	            6
#define SB_LEFT 	        6
#define SB_BOTTOM 	        7
#define SB_RIGHT 	        7
#define SB_ENDSCROLL 	    8

����LEFT��RIGHT��ʶ�������ˮƽ�����У�����UP��DOWN��TOP��BOTTOM��ʶ������춴�ֱ�����С������ھ����еIJ�ͬ���򵥻���������֪ͨ����ͼ4-7��ʾ��


��

ͼ4-7 ��춾�����ѶϢ��wParamֵ��ʶ����

����ھ����еĸ�����λ��ס���������ʽ�����յ����������ѶϢ�����ͷŻ�����ᣬ��ʽ���յ�һ������SB_ENDSCROLL֪ͨ���ѶϢ��һ����Ժ������ѶϢ��Windows����ȥ�ı���������λ�ã����������ڳ�ʽ�к���SetScrollPos���ı���������λ�á�

���ѻ�����α���ھ��������ϲ���ס�����ʱ�����Ϳ����ƶ��������顣�����Ͳ����˴���SB_THUMBTRACK��SB_THUMBPOSITION֪ͨ��ľ�����ѶϢ����wParam�ĵ�������SB_THUMBTRACKʱ��wParam�ĸ�������ʹ�������϶���������ʱ��Ŀǰλ�á���λ��λ춾����з�Χ����Сֵ�����ֵ֮�䡣��wParam�ĵ�������SB_THUMBPOSITIONʱ��wParam�ĸ�������ʹ�����ͷŻ������������������λ�á���������ľ����в�����wParam�ĸ�����Ӧ�ñ����ԡ�

Ϊ�˸�ʹ�����ṩ������Windows�����û����϶���������ʱ�ƶ�����ͬʱ���ij�ʽ���յ�SB_THUMBTRACKѶϢ��Ȼ���������ͨ������SetScrollPos������SB_THUMBTRACK��SB_THUMBPOSITIONѶϢ����ʹ�����ͷŻ�����ᣬ���������Ѹ������ԭ����λ�á�

��ʽ�ܹ�����SB_THUMBTRACK��SB_THUMBPOSITIONѶϢ����һ�㲻ͬʱ�������ߡ��������SB_THUMBTRACKѶϢ����ʹ�����϶���������ʱ����Ҫ�ƶ���ʾ��������ݡ����������SB_THUMBPOSITIONѶϢ����ֻ����ʹ����ֹͣ�϶���������ʱ�ƶ���ʾ��������ݡ�����SB_THUMBTRACKѶϢ����һЩ���������ѣ������ijЩ��̬�����ϣ����ij�ʽ���ܺ��Ѹ��ϲ�����ѶϢ��

WINUSER.H��ͷ����������SB_TOP��SB_BOTTOM��SB_LEFT��SB_RIGHT֪ͨ�룬ָ���������Ѿ����Ƶ���������С�����λ�á�Ȼ���������ΪӦ�ó�ʽ�Ӵ�һ���ֶ������ľ�������˵����Զ������յ���Щ֪ͨ�롣

�ھ����з�Χʹ��32λԪ��ֵҲ����Ч�ģ������ⲻ������Ȼ����wParam�ĸ�����ֻ��16λԪ�Ĵ�С���������ʵ���ָ��SB_THUMBTRACK��SB_THUMBPOSITION������λ�á�����������£���Ҫʹ��GetScrollInfo��ʽ�����������������õ���Ѷ��

��SYSMETS����������
��

ǰ���˵���Ѿ����꾡�ˣ����ڣ�Ҫ����Щ���������������ˡ������ǿ�ʼʱ��Щ���Ӵ�ֱ�������֣���Ϊ����ʵ��̫��Ҫ��ֱ�����ˣ�����ʱ�����Բ���ˮƽ������SYSMET2���ʽ4-3��ʾ�������ʽ�����Ǿ����е���򵥵�Ӧ�á�

 ï¿½ï¿½Ê½4-3  SYSMETS2.C
/*------------------------------------------------------------------
	SYSMETS2.C -- System Metrics Display Program No. 2
	         (c) Charles Petzold, 1998
 ------------------------------------------------------------------*/
#include <windows.h>
#include "sysmets.h"

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
		      PSTR szCmdLine, int iCmdShow)
{
	static TCHAR szAppName[] = TEXT ("SysMets2") ;
	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 ("This program requires Windows NT!"), 
	        szAppName, MB_ICONERROR) ;
	 return 0 ;
     }

	hwnd = CreateWindow (szAppName, TEXT ("Get System Metrics No. 2"),
			WS_OVERLAPPEDWINDOW | WS_VSCROLL,
			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 int  cxChar, cxCaps, cyChar, cyClient, iVscrollPos ;
	HDC         hdc ;	
	int         i, y ;	
	PAINTSTRUCT ps ;
	TCHAR       szBuffer[10] ;	
	TEXTMETRIC  tm ;	
	switch (message)	
     {
case WM_CREATE:
	hdc = GetDC (hwnd) ;
	GetTextMetrics (hdc, &tm) ;
	cxChar = tm.tmAveCharWidth ;
	cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;
	cyChar = tm.tmHeight + tm.tmExternalLeading ;

	ReleaseDC (hwnd, hdc) ;
	SetScrollRange (hwnd, SB_VERT, 0, NUMLINES - 1, FALSE) ;
	SetScrollPos   (hwnd, SB_VERT, iVscrollPos, TRUE) ;
		return 0 ;

	case WM_SIZE:
		cyClient = HIWORD (lParam) ;
		return 0 ;

	case WM_VSCROLL:
		switch (LOWORD (wParam))
          {
	case SB_LINEUP:
  		iVscrollPos -= 1 ;
		break ;
     
	case SB_LINEDOWN:
		iVscrollPos += 1 ;
		break ;

	case SB_PAGEUP:
		iVscrollPos -= cyClient / cyChar ;
		break ;
     
	case SB_PAGEDOWN:
		iVscrollPos += cyClient / cyChar ;
		break ;
     
	case SB_THUMBPOSITION:
		iVscrollPos = HIWORD (wParam) ;
		break ;
     
	default :
		break ;
          }

	iVscrollPos = max (0, min (iVscrollPos, NUMLINES - 1)) ;
	if (iVscrollPos != GetScrollPos (hwnd, SB_VERT))
          {
		SetScrollPos (hwnd, SB_VERT, iVscrollPos, TRUE) ;
		InvalidateRect (hwnd, NULL, TRUE) ;
          }
		return 0 ;
	case WM_PAINT:
		hdc = BeginPaint (hwnd, &ps) ;
		for (i = 0 ; i < NUMLINES ; i++)
		{
			y = cyChar * (i - iVscrollPos) ;
			TextOut (hdc, 0, y,
				sysmetrics[i].szLabel,
				lstrlen (sysmetrics[i].szLabel)) ;
     
			TextOut (hdc, 22 * cxCaps, y,
				sysmetrics[i].szDesc,
				lstrlen (sysmetrics[i].szDesc)) ;
     
			SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;
			TextOut (hdc, 22 * cxCaps + 40 * cxChar, y, szBuffer,
				wsprintf (szBuffer, TEXT ("%5d"),
						GetSystemMetrics (sysmetrics[i].iIndex))) ;
			SetTextAlign (hdc, TA_LEFT | TA_TOP) ;
          }
		EndPaint (hwnd, &ps) ;
		return 0 ;

	case WM_DESTROY:
		PostQuitMessage (0) ;
		return 0 ;
     }
	return DefWindowProc (hwnd, message, wParam, lParam) ;
}

�µ�CreateWindow�����ڵ����������а�����WS_VSCROLL�Ӵ���ʽ���Ӷ����Ӵ��м����˴�ֱ�����У����Ӵ���ʽΪ��

WS_OVERLAPPEDWINDOW | WS_VSCROLL

WndProc�Ӵ�ѶϢ������ʽ�ڴ���WM_CREATEѶϢʱ���������������������ô�ֱ�����еķ�Χ�ͳ�ʼλ�ã�

SetScrollRange (hwnd, SB_VERT, 0, NUMLINES - 1, FALSE) ;
SetScrollPos (hwnd, SB_VERT, iVscrollPos, TRUE) ;

sysmetrics�ṹ����NUMLINES�����֣����Ծ����з�Χ���趨Ϊ0��NUMLINES-1�������е�ÿ��λ�ö�Ӧ������ʾ���򶥲���ʾ��һ�������С�������������λ��Ϊ0�����һ�лᱻ��������ʾ����Ķ��������λ�ô��0�������оͻ��������ʾ����Ķ�������λ��ΪNUMLINES-1ʱ��������һ�����ֳ�������ʾ����Ķ�����

Ϊ������춴���WM_VSCROLLѶϢ�����Ӵ�ѶϢ������ʽ�ж�����һ����̬����iVscrollPos����һ�����Ǿ������ھ��������Ŀǰλ�á����SB_LINEUP��SB_LINEDOWN��ֻ��Ҫ�������������һ����λ��λ�á����SB_PAGEUP��SB_PAGEDOWN���������ƶ�һ��������ݣ������ƶ�cyClient /cyChar����λ��λ�á����SB_THUMBPOSITION���µľ�������λ����wParam�ĸ����顣SB_ENDSCROLL��SB_THUMBTRACKѶϢ�����ԡ�

�ڳ�ʽ�����յ���WM_VSCROLLѶϢ������µ�iVscrollPosֵ�ᣬ��min��max�޼�������iVscrollPos����ȷ���������ֵ����Сֵ֮�䡣��ʽȻ�ὫiVscrollPos�����GetScrollPosȡ�õ���ǰλ����Ƚϣ��������λ�÷����˱仯����ʹ��SetScrollPos�����и��£����Һ���InvalidateRectʹ�����Ӵ���Ч��

InvalidateRect���в���һ��WM_PAINTѶϢ��SYSMETS1�ڴ���WM_PAINTѶϢʱ��ÿһ�е�y������㹫ʽΪ��

cyChar * i

��SYSMETS2�У����㹫ʽΪ��

cyChar * (i - iVscrollPos)

��Ȧ��Ȼ��ʾNUMLINES�����֣����Ƕ�춷���ֵ��iVscrollPos�Ǹ�������ʽʵ��������ʾ����������ʾ��Щ�����С���Ȼ��Windows������ʾ��Щ�У����өĻ�Ե�Ǭ����Ư����

ǰ��˵��������һ��ʼ����Ū��̫���ӣ������ij�ʽ����˷ѣ�Ч�ʺܵ͡��������ǶԴ˼����޸ģ�������Ҫ������WM_VSCROLLѶϢ֮�������ʾ����ķ�����

��ͼ��ʽ����֯
��

�ڴ����������ѶϢ�ᣬSYSMETS2��������ʾ�����෴��������InvalidateRectʹ��ʾ����ʧЧ���⵼��Windows��һ��WM_PAINTѶϢ����ѶϢ�����С�

�����ʹWindows��ʽ�ڻ�ӦWM_PAINTѶϢʱ������е���ʾ������ƹ��ܡ���Ϊ��ʽ������һ���յ�WM_PAINTѶϢʱ�͸���������ʾ��������ڳ�ʽ����������Ҳ���ƵĻ������ܿ���ʹ��ʽ���ظ���

���ȣ������ܶ����ֹ���Ĩ�ǵķ�ʽ�е��ᷳ����Windows�����ڣ���Ϊ���ַ�ʽ������ģʽ�ij�ʽ��Ʋ��̫�󣬳�ʽд���߸е����ָ���������⡣���ң���ʽҪ���ϵ�ͨ�����ϻ��ƻ�������Ӧ���̺ͻ����������ȷ�������Ч�������ںܶ�����£�����ȫ����Ҫ�������������ڻ�ӦWM_PAINTѶϢʱ���ۻ�����ʾ��������Ҫ��ȫ����Ѷ��ԭ��֮�ᣬ������ֽ���е�����ġ�

��ͬSYSMETS2ʾ���ģ���ʽ��Ȼ��Ҫ�ڴ�����WM_PAINTѶϢʱ�����ض�����ʾ����ʹ��InvalidateRect�ͺܷ��㣬����������ʹ��ʾ�����ڵ��ض����λ���������ʾ����ʧЧ��

ֻ���Ӵ���ʾ������Ϊ��Ч�Բ���WM_PAINTѶϢ�����ijЩӦ�ó�ʽ��˵Ҳ��������ȫ���������ѡ���ں���InvalidateRect֮�ᣬWindows��WM_PAINTѶϢ����ѶϢ�����У��������Ӵ�ѶϢ������ʽ��������Ȼ����Windows��WM_PAINTѶϢ���ɵ�����˳��ѶϢ�����ϵͳ�����������Ķ������ڷ�������ôҲ���������ȴ�һ���������ʱ�����Ի�������ʧʱ���������һЩ�հ׵ġ���������ʽ��Ȼ�ȴ����������Ӵ���

�����ϣ������������Ч���򣬿����ں���InvalidateRect֮�����UpdateWindow��

UpdateWindow (hwnd) ;

�����ʾ�������һ������Ч����UpdateWindow������Windows��WM_PAINTѶϢ�����Ӵ�ѶϢ������ʽ�����������ʾ������Ч���򲻺����Ӵ�ѶϢ������ʽ������һWM_PAINTѶϢ������ѶϢ���У�ֱ����Windows�����Ӵ�ѶϢ������ʽ���Ӵ�ѶϢ������ʽ��ɸ����������˳���Windows�����ƴ��ظ���ʽ��UpdateWindow����֮���������

������ע�⵽��UpdateWindow��WinMain������������һ��WM_PAINTѶϢ�ĺ�ʽ��ͬ����������Ӵ�ʱ��������ʾ�������ݱ�Ϊ��Ч��UpdateWindowָʾ�Ӵ�ѶϢ������ʽ������ʾ����

�������õĹ���
��

SYSMETS2�������ã�����ֻ��ģ��������ʽ�еľ����У�����Ч�ʺܵ͡��ܿ��ҽ�ʾ��һ���µİ汾���Ľ����IJ��㡣Ҳ������Ȥ��������°汾��ʹ��Ŀǰ�����۵��ĸ������к�ʽ���෴������ʹ��Win32 API�в��е��º�ʽ��

��������Ѷ��ʽ
��

�������ļ�����/Platform SDK/User Interface Services/Controls/Scroll Bars�У�ָ��SetScrollRange��SetScrollPos��GetScrollRange��GetScrollPos��ʽ�ǡ���ʱ�ġ������Ⲣ����ȫ��ȷ����Щ��ʽ��Windows 1.0�оͳ����ˣ���Win32 API�������Դ���32λԪ������������Ȼ�������õĹ��ܡ����ң����Dz���Windows��ʽ������º�ʽ���ͻ����������ڴ�������ʹ�����ǵ�ԭ��

Win32 API���ܵ����������к�ʽ����SetScrollInfo��GetScrollInfo����Щ��ʽ���������ǰ��ʽ��ȫ�����ܣ������������������ԡ�

��һ�������漰��������Ĵ�С��������ע�⵽�����������С��SYSMETS2��ʽ���ǹ̶��ġ�Ȼ������������ʹ�õ���һЩWindowsӦ�ó�ʽ�У����������С�����Ӵ�����ʾ���ļ���С�ɱ�������ʾ�Ĵ�С������ҳ���С�������㷨Ϊ��


��

����ʹ��SetScrollInfo������ҳ���С���Ӷ������˾�������Ĵ�С�����罫Ҫ������SYSMETS3��ʽ��ʾ��

GetScrollInfo��ʽ�����˵ڶ�����Ҫ�Ĺ��ܣ�����˵���Ľ���ĿǰAPI�IJ��㡣������Ҫʹ��65,536�����λ�ķ�Χ������16λԪWindows���Dz����ܵġ���Ȼ��Win32�У���ʽ������Ϊ�ɽ���32λԪ�����������û������ġ�����ס���ʹ��������ķ�Χ�����������ʵ������λ������Ȼ�ɾ����е�ͼ�ش�С���ƣ���Ȼ������ʹ��SB_THUMBTRACK��SB_THUMBPOSITION֪ͨ��õ�WM_VSCROLL��WM_HSCROLLѶϢʱ��ֻ�ṩ��16λԪ������ָ�����������Ŀǰλ�á�ͨ��GetScrollInfo��ʽ����ȡ����ʵ��32λԪֵ��

SetScrollInfo��GetScrollInfo��ʽ���﷨��

SetScrollInfo (hwnd, iBar, &si, bRedraw) ;
GetScrollInfo (hwnd, iBar, &si) ;

�������������к�ʽ��������iBar������SB_VERT��SB_HORZ��������������춾����п��Ƶ�SB_CTL��SetScrollInfo������һ������������TRUE��FALSE��ָ�����Ƿ�ҪWindows���»��Ƽ���������Ѷ��ľ����С�

������ʽ�ĵ�����������SCROLLINFO�ṹ������Ϊ��

typedef struct tagSCROLLINFO
{
	UINT cbSize ;	// set to sizeof (SCROLLINFO)
	UINT fMask ;	// values to set or get
	int  nMin ;	    // minimum range value
	int  nMax ; 	// maximum range value
	UINT nPage ;	// page size
	int  nPos ; 	// current position
	int  nTrackPos ;// current tracking position
}
SCROLLINFO, * PSCROLLINFO ;

�ڳ�ʽ�У����Զ������µ�SCROLLINFO�ṹ��̬��

SCROLLINFO si ;

�ں���SetScrollInfo��GetScrollInfo֮ǰ�����뽫cbSize��λ�趨Ϊ�ṹ�Ĵ�С��

si.cbSize = sizeof (si) ;

��

si.cbSize = sizeof (SCROLLINFO) ;

����ϤWindows�ᣬ���ͻᷢ�����⼸���ṹ������ṹһ������һ����λָ���˽ṹ��С�������λʹ������Windows�汾��������ṹ�������µĹ��ܣ�������Ȼ����ǰ����İ汾���ݡ�

��fMask��λ�趨Ϊһ��������SIF���׿�ͷ����꣬���ҿ���ʹ��C��λԪ����OR������(|)�����Щ��ꡣ

SetScrollInfo��ʽʹ��SIF_RANGE���ʱ�������nMin��nMax��λ�趨Ϊ����ľ����з�Χ��GetScrollInfo��ʽʹ��SIF_RANGE���ʱ��Ӧ��nMin��nMax��λ�趨Ϊ�Ӻ�ʽ���ص�Ŀǰ��Χ��

SIF_POS���Ҳһ������ͨ��SetScrollInfoʹ����ʱ������ѽṹ��nPos��λ�趨Ϊ�����λ�á�����ͨ��GetScrollInfoʹ��SIF_POS�����ȡ��Ŀǰλ�á�

ʹ��SIF_PAGE����ܹ�ȡ��ҳ���С����SetScrollInfo��ʽ��nPage�趨Ϊ�����ҳ���С��GetScrollInfoʹ��SIF_PAGE������ȡ��Ŀǰҳ��Ĵ�С���������õ��������ľ����У��Ͳ�Ҫʹ�ø���ꡣ

����������SB_THUMBTRACK��SB_THUMBPOSITION֪ͨ���WM_VSCROLL��WM_HSCROLLѶϢʱ��ͨ��GetScrollInfoֻʹ��SIF_TRACKPOS��ꡣ�Ӻ�ʽ�Ĵ����У�SCROLLINFO�ṹ��nTrackPos��λ��ָ��Ŀǰ��32λԪ�ľ�������λ�á�

��SetScrollInfo��ʽ�н�ʹ��SIF_DISABLENOSCROLL��ꡣ���ָ���˴���꣬�����µľ����в���ʹ��������ʧ����þ����оͲ���ʹ���ˣ�������и���Ľ��ͣ���

SIF_ALL�����SIF_RANGE��SIF_POS��SIF_PAGE��SIF_TRACKPOS����ϡ���WM_SIZEѶϢ�����ڼ����þ����в���ʱ�����Ǻܷ���ģ���SetScrollInfo��ʽ��ָ��SIF_TRACKPOS�ᣬ���ᱻ���ԣ������ڴ���������ѶϢʱҲ�Ǻܷ���ġ�

������Χ
��

��SYSMETS2�У�������Χ������СΪ0�����ΪNUMLINES-1����������λ����0ʱ����һ����Ѷ��ʾ����ʾ����Ķ������������е�λ����NUMLINES-1ʱ������һ����ʾ����ʾ����Ķ��������ҿ����������С�

����˵SYSMETS2������Χ̫����ʵ��ֻ�����Ѷ����һ����ʾ����ʾ����ĵײ������Ƕ������ɡ����ǿ��Զ�SYSMETS2����һЩ�޸��Դﵽ�˵㡣������WM_CREATEѶϢʱ�����þ����з�Χ�����ǵȵ����յ�WM_SIZEѶϢ�������˹�����

iVscrollMax = max (0, NUMLINES - cyClient / cyChar) ;
SetScrollRange (hwnd, SB_VERT, 0, iVscrollMax, TRUE) ;

�ٶ�NUMLINES���75�����ٶ��ض��Ӵ���С�ǣ�50��cyChar����cyClient�������仰˵��������75����Ѷ��ֻ��50�п�����ʾ����ʾ�����С�ʹ����������г�ʽ�룬�ѷ�Χ������СΪ0�����Ϊ25����������λ�õ��0ʱ����ʽ��ʾ0��49�С���������λ�õ��1ʱ����ʽ��ʾ1��50�У����ҵ�������λ�õ��25�����ֵ��ʱ����ʽ��ʾ25��74�С���������Ҫ�Գ�ʽ���������������޸ģ������ǿ��еġ�

�¾����к�ʽ��һ���õĹ����ǵ�ʹ��������з�Χһ�����ҳ��ʱ�����Ѿ�Ϊ��������һ������¡�����������ij�ʽ��һ��ʹ��SCROLLINFO�ṹ��SetScrollInfo��

si.cbSize 	= sizeof (SCROLLINFO) ;
si.cbMask 	= SIF_RANGE | SIF_PAGE ;
si.nMin 	= 0 ;
si.nMax 	= NUMLINES - 1 ;
si.nPage 	= cyClient / cyChar ;
SetScrollInfo (hwnd, SB_VERT, &si, TRUE) ;

������֮�ᣬWindows������ľ�����λ������Ϊsi.nMax - si.nPage +1������si.nMax����ǰ�������������裺NUMLINES���75 ������si.nMax���74����si.nPage���50������ζ�����ľ�����λ������Ϊ74 - 50 + 1����25��������������Ҫ�ġ�

��ҳ���С������з�Χһ����ʱ���ᷢ��ʲô����أ�����������У�����nPage���75�����������Windowsͨ�����ؾ����У���Ϊ��������Ҫ������������ؾ����У����ں���SetScrollInfoʱʹ��SIF_DISABLENOSCROLL��Windowsֻ�����Ǹ������в��ܱ�ʹ�ã�������������

��SYSMETS
��

SYSMETS3�������������SYSMETS��ʽ�汾����ʾ�ڳ�ʽ4-4�С��˰汾ʹ��SetScrollInfo��GetScrollInfo��ʽ���������Ҿ�����ˮƽ�����У����ܸ���Ч���ػ���ʾ����

 ï¿½ï¿½Ê½4-4  SYSMETS3
SYSMETS3.C
/*------------------------------------------------------------------
   SYSMETS3.C -- System Metrics Display Program No. 3
		      (c) Charles Petzold, 1998
  ----------------------------------------------------------------*/
#include <windows.h>
#include "sysmets.h"

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
             PSTR szCmdLine, int iCmdShow)
{
	static TCHAR szAppName[] = TEXT ("SysMets3") ;
	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 ("Get System Metrics No. 3"),
			WS_OVERLAPPEDWINDOW | WS_VSCROLL | WS_HSCROLL,
			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 int  cxChar, cxCaps, cyChar, cxClient, cyClient, iMaxWidth ;
	HDC	hdc ;
	int	i, x, y, iVertPos, iHorzPos, iPaintBeg, iPaintEnd ;
	PAINTSTRUCT ps ;
	SCROLLINFO  si ;
	TCHAR       szBuffer[10] ;
	TEXTMETRIC  tm ;
     
	switch (message)
     {
	case WM_CREATE:
		hdc = GetDC (hwnd) ;
	GetTextMetrics (hdc, &tm) ;
	cxChar = tm.tmAveCharWidth ;
	cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2 ;
	cyChar = tm.tmHeight + tm.tmExternalLeading ;
          
	ReleaseDC (hwnd, hdc) ;
		// Save the width of the three columns
	iMaxWidth = 40 * cxChar + 22 * cxCaps ;
	return 0 ;

case WM_SIZE:
	cxClient = LOWORD (lParam) ;
	cyClient = HIWORD (lParam) ;

		// Set vertical scroll bar range and page size
	si.cbSize 	= sizeof (si) ;
	si.fMask  	= SIF_RANGE | SIF_PAGE ;
	si.nMin   	= 0 ;
	si.nMax   	= NUMLINES - 1 ;
	si.nPage  	= cyClient / cyChar ;
	SetScrollInfo (hwnd, SB_VERT, &si, TRUE) ;
		// Set horizontal scroll bar range and page size
	si.cbSize 	= sizeof (si) ;
	si.fMask  	= SIF_RANGE | SIF_PAGE ;
	si.nMin   	= 0 ;
	si.nMax   	= 2 + iMaxWidth / cxChar ;
	si.nPage  	= cxClient / cxChar ;
	SetScrollInfo (hwnd, SB_HORZ, &si, TRUE) ;
	return 0 ;
          
case WM_VSCROLL:
		// Get all the vertical scroll bar information
	si.cbSize 	= sizeof (si) ;
	si.fMask  	= SIF_ALL ;
	GetScrollInfo (hwnd, SB_VERT, &si) ;
		// Save the position for comparison later on
	iVertPos = si.nPos ;
	switch (LOWORD (wParam))
	{
	case	SB_TOP:
		si.nPos 	= si.nMin ;
		break ;
               
	case 	SB_BOTTOM:
       		si.nPos 	= si.nMax ;
 	 	break ;
               
	case SB_LINEUP:
		si.nPos -	= 1 ;
		break ;
               
	case 	SB_LINEDOWN:
		si.nPos += 1 ;
		break ;
               
	case 	SB_PAGEUP:
		si.nPos -= si.nPage ;
		break ;

	case 	SB_PAGEDOWN:
		si.nPos += si.nPage ;
		break ;
               
	case 	SB_THUMBTRACK:
		si.nPos = si.nTrackPos ;
		break ;
               
	default:
	break ;         
	}
		// Set the position and then retrieve it.  Due to adjustments
		//  by Windows it may not be the same as the value set.

	si.fMask = SIF_POS ;
	SetScrollInfo (hwnd, SB_VERT, &si, TRUE) ;
	GetScrollInfo (hwnd, SB_VERT, &si) ;

		// If the position has changed, scroll the window and update it
	if (si.nPos != iVertPos)
   	{                    
		ScrollWindow (	hwnd, 0, cyChar * (iVertPos - si.nPos), 
						NULL, NULL) ;
		UpdateWindow (hwnd) ;
	}
	return 0 ;
	case WM_HSCROLL:
			// Get all the vertical scroll bar information
		si.cbSize = sizeof (si) ;
		si.fMask  = SIF_ALL ;

			// Save the position for comparison later on
		GetScrollInfo (hwnd, SB_HORZ, &si) ;
		iHorzPos = si.nPos ;

		switch (LOWORD (wParam))
		{
	case 	SB_LINELEFT:
		si.nPos -= 1 ;
		break ;
               
	case 	SB_LINERIGHT:
		si.nPos += 1 ;
		break ;
               
	case 	SB_PAGELEFT:
		si.nPos -= si.nPage ;
		break ;
               
	case 	SB_PAGERIGHT:
		si.nPos += si.nPage ;
		break ;
               
	case 	SB_THUMBPOSITION:
		si.nPos = si.nTrackPos ;
		break ;
               
		default :
		break ;
	}
		// Set the position and then retrieve it.  Due to adjustments
		//   by Windows it may not be the same as the value set.

		si.fMask = SIF_POS ;
		SetScrollInfo (hwnd, SB_HORZ, &si, TRUE) ;
		GetScrollInfo (hwnd, SB_HORZ, &si) ;
          
		// If the position has changed, scroll the window 

	if (si.nPos != iHorzPos)
	{
		ScrollWindow (	hwnd, cxChar * (iHorzPos - si.nPos), 0, 
       				NULL, NULL) ;
	}
		return 0 ;
	case WM_PAINT :
		hdc = BeginPaint (hwnd, &ps) ;
		// Get vertical scroll bar position
	si.cbSize = sizeof (si) ;
	si.fMask  = SIF_POS ;
	GetScrollInfo (hwnd, SB_VERT, &si) ;
	iVertPos = si.nPos ;

		// Get horizontal scroll bar position
	GetScrollInfo (hwnd, SB_HORZ, &si) ;
	iHorzPos = si.nPos ;
		// Find painting limits
	iPaintBeg = max (0, iVertPos + ps.rcPaint.top / cyChar) ;
	iPaintEnd = min (	NUMLINES - 1,
			iVertPos + ps.rcPaint.bottom / cyChar) ;
          
	for (i = iPaintBeg ; i <= iPaintEnd ; i++)
	{
		x = cxChar * (1 - iHorzPos) ;
		y = cyChar * (i - iVertPos) ;
               
		TextOut (hdc, x, y,
			sysmetrics[i].szLabel,
			lstrlen (sysmetrics[i].szLabel)) ;
               
		TextOut (hdc, x + 22 * cxCaps, y,
			sysmetrics[i].szDesc,
			lstrlen (sysmetrics[i].szDesc)) ;
               
		SetTextAlign (hdc, TA_RIGHT | TA_TOP) ;
		TextOut (hdc, x + 22 * cxCaps + 40 * cxChar, y, szBuffer,
			wsprintf (szBuffer, TEXT ("%5d"),
			GetSystemMetrics (sysmetrics[i].iIndex))) ;

		SetTextAlign (hdc, TA_LEFT | TA_TOP) ;
	}

		EndPaint (hwnd, &ps) ;
		return 0 ;
          
	case	WM_DESTROY :
		PostQuitMessage (0) ;
		return 0 ;
}
	return DefWindowProc (hwnd, message, wParam, lParam) ;
}

����汾�ij�ʽ����Windows�����������Ѷ�����߽��顣��WM_VSCROLL��WM_HSCROLL�����Ŀ�ʼ����ȡ�����еľ�������Ѷ������֪ͨ�����λ�ã�Ȼ�����SetScrollInfo������λ�á���ʽȻ�����GetScrollInfo�������λ�ó�����SetScrollInfo���еķ�Χ������Windows��������λ�ò�����GetScrollInfo�����д�����ȷ��ֵ��

SYSMETS3ʹ��ScrollWindow��ʽ���Ӵ�����ʾ�����о�����Ѷ�������ػ�������Ȼ�ú�ʽ�ܸ��ӣ����°汾��Windows���ѱ������ӵ�ScrollWindowEx���������SYSMETS3�����൱�򵥵ķ�ʽʹ��������ʽ�ĵڶ�������������ˮƽ������ʾ�������ֵ�������������Ǵ�ֱ������ʾ�������ֵ����λ����ͼ�ء�

ScrollWindow���������������趨ΪNULL����ָ����Ҫ����������ʾ����Windows�Զ�����ʾ������δ�������������ǵľ�����Ϊ��Ч��������WM_PAINTѶϢ����Ҳ����ҪInvalidateRect�ˡ�ע��ScrollWindow����GDI��ʽ����Ϊ������װ�����ݴ��š���������������GDI��Windows��ʽ֮һ�������Ըı��Ӵ�����ʾ������ۡ������⵫�����㣬����������к�ʽһ��������ļ��С�

WM_HSCROLL��������SB_THUMBPOSITION֪ͨ�벢����SB_THUMBTRACK����������ʹ������ˮƽ���������϶��������飬��ʹ�����ͷŻ���ť֮ǰ����ʽ����ˮƽ�����Ӵ������ݡ�

WM_VSCROLL�ķ�����֮��ͬ����ʽ����SB_THUMBTRACKѶϢ������SB_THUMBPOSITION���������ʽ��ʹ�����ڴ�ֱ���������϶������������ֱ�ع������ݡ������뷨�ܺã���Ӧע�⣺һ��ʹ���߷��ֳ�ʽ��������Ӧ�϶��ľ������飬���Ǿͻ᲻�ϵ������϶��������顣���˵������ڵ�PC��ÿ���ʤ�������Ͽ�IJ��ԡ������ڽ����Ļ����ϣ����Կ���ΪGetSystemMetricsʹ��SB_SLOWMACHINE������������ִ�����

�ӿ�WM_PAINT������һ��������SYSMETS3չʾ��WM_PAINT������ʽȷ����Ч�����е������в������ػ���Щ�С���Ȼ����ʽ�븴��һЩ�����ٶȺܿ졣

���û�����ô��
��

��Windows�����ڣ��д�����ʹ���߲�ϲ��ʹ�û��󣬶��ң�Windows����Ҳ��Ҫ������л�����Ȼ��û�л����PC���������˵�ɫ��ʾ���͵���ӡ������û��֮·��������Ȼ��������д����ʹ�ü����������뻬�������ͬЧ���ij�ʽ��������������������Ļ����������������ˡ���Ϊ���ǵļ�����һ���α��ƶ���������Ӧ��ʵ��ͬ���IJ�����

����һ�£�����ѧϰʹ�ü��̺���SYSMETS3�����Ӽ��̽���ķ����������ܻ�ע�⵽��SYSMETS3�ƺ���֪ͨ����SB_TOP��SB_BOTTOMʱ������WM_VSCROLLѶϢ��ǰ���Ѿ��ᵽ�����Ӵ�ѶϢ������ʽ���Ӿ����н�����ЩѶϢ�����ԣ�Ŀǰ���Ƕ���ij�ʽ�롣����������һ���ٴλص������ʽʱ��������������������ԭ��