�������� Linux Tags
4. �������
��춳�ʽ����ʾ��������������Ϊ����Ϊ��ֻ���������ܼٶ��Ӵ���С��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ѶϢ��
��ijЩ����£���ʾ�����һ���ֱ���ʱ���ǣ�Windows��ͼ����һ����ʾ���򣬲�������ָ��������ⲻһ���ܳɹ�������������£�Windows���ܷ���WM_PAINTѶϢ��
��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�ʽ�롣����������һ���ٴλص������ʽʱ��������������������Ô��