�������� Linux Tags
5. ͼ�λ���
���ҵ��ǣ����Ҫ��GDI����ȫ��Ľ���������Ҫһ�����é£ï¿½ï¿½È»ï¿½ï¿½ï¿½ï¿½ï¿½â±¾ï¿½é¡£ï¿½Ú±ï¿½ï¿½ï¿½ï¿½Ð£ï¿½ï¿½ï¿½Ö»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½á¹©ï¿½ï¿½ï¿½ßºï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ä»ï¿½ï¿½ï¿½ÖªÊ¶ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½æ¼¸ï¿½Âµï¿½GDI�Ѿ��㹻�ˡ������漸���лὲ��GDI֧Ԯ�ĵ���ͼ��metafile�Լ���ʽ�����֡�
GDI�Ľṹ
��
�ӳ�ʽд���ߵĹ۵�������GDI�ɼ��ٸ���ʽ���к�һЩ��ص�������̬���޼��ͽṹ��ɡ������ڿ�ʼ������Щ��ʽ��ϸ��֮ǰ���������ȴӾ޹����˽�һ��GDI������ṹ��
GDI��
��
Windows 98��Microsoft Windows NT�е�ͼ����Ҫ��GDI32.DLL��̬�����ʽ������ĺ�ʽ����������Windows 98�У����GDI32.DLLʵ��������16λԪGDI.EXE��̬�����ʽ����ִ�����ຯʽ����Windows NT�У�GDI.EXEֻ���16λԪ�ij�ʽ��
��Щ��̬�����ʽ���������װ����Ѷ��ʾ�����κ�ӡ��������������ʽ�еij�ʽ����Ѷ������ʽ��ȡ��Ѷ��ʾ����Ӳ�壬ӡ����������ʽ��GDI����ת��Ϊ����ӡ�����ܹ�����Ĵ�����������Ȼ����ͬ����Ѷ��ʾ����ӡ����Ҫ��ͬ��װ��������ʽ��
��ΪPC���ݻ����Ͽ������������ֲ�ͬ����Ѷ�豸�����ԣ�GDI����ҪĿ��֮һ��֧Ԯ��װ���޹ص�ͼ�Ρ�Windows��ʽӦ���ܹ��������ѵ���Windows֧Ԯ������һ��ͼ������豸��ִ�У�GDIͨ�������ij�ʽ�Ͳ�ͬ����豸�����Ը��뿪���ķ������ﵽ��һĿ�ġ�
ͼ������豸��Ϊ�����ࣺλԪӳ���豸�������豸�������PC������豸��λԪӳ���豸������ζ��������ͼ�㹹�ɵ���������ʾͼ�������豸������Ѷ��ʾ��������ӡ����������ӡ�����������豸ʹ����������ͼ��ͨ������춻�ͼ����
���ഫͳ�ĵ���ͼ�γ�ʽ��Ʒ�ʽ������ȫ������Ϊ���ģ�����ζ��ʹ������ͼ��ϵͳ�ij�ʽ��Ӳ������һ����εĸ��롣����豸��ͼ�ر�ʾͼ�Σ����dz�ʽ���ʽ����֮�䲢������ͼ�ؽ��й�ͨ�ġ�����Ȼ����ʹ��Windows GDI��Ϊһ���߽׵���������ϵͳ��ͬʱҲ���Խ�����춱Ƚϵͽ׵�ͼ�ز�����
���ⷽ��������Windows GDI�ʹ�ͳ��ͼ�ν�������֮��Ĺ�ϵ������ͬC��������ʽ�������֮��Ĺ�ϵһ����C�����ڲ�ͬ��ҵϵͳ�ͻ���֮��ĸ߶ȿ�Я�Զ�������Ȼ��CҲ��������ʽд���߽��еͽ�ϵͳ���ж���������Щ�����������߽�������ͨ���Dz����ܵġ�����C��ʱ����Ϊ��һ�֡��߼�������ԡ�һ������������ΪGDI��ͼ���豸Ӳ��֮���һ�ָ߽׽��档
���Ѿ�������Windows�ڶ�ʹ��ͼ������ϵͳ���������ͳ��ͼ������ʹ�á����⡹����ϵ����ˮƽ�ʹ�ֱ��ķ�Χ��0��32,767֮�䡣��Ȼ��Щͼ�����Բ�����ʹ��ͼ�����꣬����Windows GDI������ʹ����������ϵͳ֮һ����������ʵ�ʶ����������ϵ����������ʹ����������ϵ�Ա��ó�ʽ�����Ӳ��֮�⣬����Ҳ����ʹ���豸����ϵ����ȫÓ��Ӳ���豸�ṩ�Ļ�����
ijЩ��ʽд������Ϊһ����ʼʹ�ò���ͼ�صij�ʽ��Ʒ�ʽ���ͷ�����װ���޹��ԡ���������һ�¿������ⲻ��ȫ����ȷ�ģ����еľ���������װ���޹صķ�ʽ��ʹ��ͼ�ء���Ҫ��ͼ�ν�������Ϊ��ʽ�ṩһЩ������ȷ���豸��Ӳ�����磬�������ʵ��ĵ��ڡ����磬��SYSMETS��ʽ�У����Ǹ��ݱ�׼ϵͳ������Ԫ��ͼ�ش�С��ȷ��өĻ�ϵ����ּ�࣬���ַ���������ʽ��Խ����ȡ����ִ�С�ͷ������������ͬ����ʾ��������Ӧ�ĵ��ڡ������ڱ��¿���һЩ���ȷ����ʾ�ߴ������������
���ڣ�����ʹ�����ڵ�ɫ��ʾ����ִ��Windows����ʹ�Ǽ���ǰ���ʼDZ�����Ҳ��ֻ�лҽ���ʾ��Ϊ�ˣ�GDI����Ʊ�֤���������ڱ�дһ����ʽʱ����̫����ɫ�����â£Ò²ï¿½ï¿½ï¿½ï¿½Ëµï¿½ï¿½Windows���Խ�ɫ��ת��Ϊ�ҽ���ʾ�������ڽ��죬Windows 98ʹ�õ���Ѷ��ʾ�Ѿ������˲�ͬ��ɫ��������16ɫ��256ɫ����high-Color���Լ���true-color��������Ȼ����ɫ��īӡ�����ijɱ��Ѿ��ܵ��ˣ����Ǵ����ʹ������Ȼ���ʹ�úڰ�ӡ������äĿ��ʹ����Щ�豸�ǿ��Եģ��������ij�ʽҲӦ���ܾ�����ij����ʾ�豸���ж���ɫ�ʿ���ʹ�ã��Ӷ��������Ӳ�幦�ܡ�
��Ȼ������ͬ����дC��ʽʱ��Ϊ��ʹ��������������ִ�ж�����һЩ΢�����ֲ������һ������Ҳ���ܲ�С����װ���������������Windows��ʽ������Dz���Ӳ����ȫ����Ĵ��ۡ�����Ӧ��֪��Windows GDI�ľ��ޡ���Ȼ��������ʾ���ϵ����ƶ�ͼ���������GDIͨ����һ����̬����ʾϵͳ��ֻ�����޵Ķ���֧Ԯ�������ҪΪ��Ϸ��д���ӵĶ�������Ӧ���о�һ��Microsoft DirectX�����ṩ������Ҫ��֧Ԯ��
GDI��ʽ����
��
���GDI�ļ��ٸ���ʽ���п��Է�Ϊ�����ࣺ
GDI����ͼ��
��
����өĻ��ӡ��������ʾ��ͼ����̬�������Ա���Ϊ���࣬ͨ������Ϊ������ͼ�Ρ��������ǣ�
��������
��
GDI�����������޷���ô���׵ط��࣬�����ǣ�
װ������
��
�ڿ�ʼ��ͼ֮ǰ�������DZȵ����¸���ȷ������һ��װ�����ݡ�
��������һ��ͼ������豸������өĻ����ӡ�������ϻ�ͼʱ�������ȱ�����һ��װ�����ݣ�����DC���Ĵ��š������Ŵ��ظ���ʽʱ��Windows�͸�����ʹ���豸������Ȩ��Ȼ������GDI��ʽ�н����������Ϊһ����������Windows��ʶ���������Ͻ��л�ͼ���豸��
װ�������а�������ȷ��GDI��ʽ������豸�Ϲ�����Ŀǰ�����ԡ�����Щ�����������ݸ�GDI��ʽ�IJ���ֻ������ʼ������߳ߴ���Ѷ�������ذ���Windows���豸����ʾ���ʱ��Ҫ������������Ѷ�����磬����TextOutʱ����ֻ��Ҫ�ں�ʽ�и���װ�����ݴ��š���ʼ���ꡢ���ֺ����ֵij��ȡ�������ָ�����塢������ɫ����������ı���ɫ���Լ���Ԫ��࣬��Ϊ��Щ���Զ���װ�����ݵ�һ���֡�������ı���Щ����֮һʱ��������һ�����Ըı�װ�����������Եĺ�ʽ��������Ը�װ�����ݵ�TextOut������ʹ�øı�������ԡ�
ȡ��װ�����ݴ���
��
Windows�ṩ�˼���ȡ��װ�����ݴ��ŵķ���������ڴ���һ��ѶϢʱȡ����װ�����ݴ��ţ�Ӧ�����˳��Ӵ���ʽ֮ǰ�ͷ���������ɾ��������һ���ͷ��˴��ţ����Ͳ�����Ч�ˡ����ӡ����װ�����ݴ��ţ������û����ô�ϸ��ڵ�ʮ���»�������ӡ��
��õ�ȡ�ò��ͷ�װ�����ݴ��ŵķ����ǣ��ڴ���WM_PAINTѶϢʱ��ʹ��BeginPaint��EndPaint���У�
hdc = BeginPaint (hwnd, &ps) ; �����г�ʽ EndPaint (hwnd, &ps) ;
����ps����̬ΪPAINTSTRUCT�Ľṹ���ýṹ��hdc��λ��BeginPaint���ص�װ�����ݴ��š� PAINTSTRUCT�ṹ�ְ���һ����ΪrcPaint��RECT�����Σ��ṹ��rcPaint����һ����Χ�Ӵ���ʾ������Ч��Χ�ľ��Ρ�ʹ�ô�BeginPaint��õ�װ�����ݴ��ţ�ֻ������������ڻ�ͼ��BeginPaint����ʹ��������Ч��
Windows��ʽ�������ڴ�����WM_PAINTѶϢʱȡ��װ�����ݴ��ţ�
hdc = GetDC (hwnd) ; �����г�ʽ ReleaseDC (hwnd, hdc) ;
���װ������������Ӵ�����Ϊhwnd����ʾ������Щ������BeginPaint��EndPaint�����֮��Ļ��������ǣ����ô�GetDC���صĴ��ſ�����������ʾ�����ϻ�ͼ����Ȼ�� GetDC��ReleaseDC��ʹ��ʾ�������κο��ܵ���Ч��������Ч��
Windows��ʽ������ȡ������������Ӵ�������������Ӵ�����ʾ���򣩵�װ�����ݴ��ţ�
hdc = GetWindowDC (hwnd) ; �����г�ʽ ReleaseDC (hwnd, hdc) ;
���װ�����ݳ�����ʾ����֮�⣬�������Ӵ��ı����С����ܱ��������кͿ�ܣ�frame����GetWindowDC��ʽ����ʹ�ã�����볢����һ��������������ش���WM_NCPAINTѶϢ��Windowsʹ�ø�ѶϢ���Ӵ��ķ���ʾ�����ϻ�ͼ��
BeginPaint��GetDC��GetWindowDC��õ�װ�����ݶ�����Ѷ��ʾ���ϵ�ij���ض��Ӵ���ء�ȡ��װ�����ݴ��ŵ���һ����ͨ�õĺ�ʽ��CreateDC��
hdc = CreateDC (pszDriver, pszDevice, pszOutput, pData) ; �����г�ʽ DeleteDC (hdc) ;
���磬������ͨ������ĺ�����ȡ������өĻ��װ�����ݴ��ţ�
hdc = CreateDC (TEXT ("DISPLAY"), NULL, NULL, NULL) ;
���Ӵ�֮��д�ë»ï¿½ï¿½Ò»ï¿½ï¿½ï¿½Ç²ï¿½Ç¡ï¿½ï¿½ï¿½Ä£ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ò»Ð©ï¿½ï¿½Í¬Ñ°ï¿½ï¿½ï¿½ï¿½Ó¦ï¿½Ã³ï¿½Ê½ï¿½ï¿½Ëµï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ü·ï¿½ï¿½ã£¨ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Í¨ï¿½ï¿½ï¿½Úºï¿½ï¿½ï¿½GetDCʱʹ��һ��NULL�������Ӷ�ȡ������өĻ��װ�����ݴ��ţ����������ļ����Ѿ��ᵽ�ˣ����ڵ�ʮ�����У����ǽ�ʹ��CreateDC��ʽ��ȡ��һ��ӡ����װ�����ݴ��š�
��ʱ��ֻ����Ҫȡ�ù��ijװ�����ݵ�һЩ��Ѷ�����������κλæ»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Â£ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê¹ï¿½ï¿½CreateIC��ȡ��һ������Ѷ���ݡ��Ĵ��ţ��������CreateDC��ʽ��ͬ�����磺
hdc = CreateIC (TEXT ("DISPLAY"), NULL, NULL, NULL) ;
�������������Ѷ���ݴ������豸��д������
ʹ�õ���ͼʱ��ȡ��һ����������װ�����ݡ���ʱ�����õģ�
hdcMem = CreateCompatibleDC (hdc) ; �����г�ʽ DeleteDC (hdcMem) ;
�����Խ�����ͼѡ��������װ�����ݣ�Ȼ��ʹ��GDI��ʽ�ڵ���ͼ�ϻæ»ï¿½ï¿½ï¿½Ò½ï¿½ï¿½Úµï¿½Ê®ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ð©ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
ǰ���Ѿ��ᵽ����metafile��һЩGDI���еļ��ϣ��Զ���λ��ʽ���롣������ͨ��ȡ��metafileװ������������metafile��
hdcMeta = CreateMetaFile (pszFilename) ; �����г�ʽ hmf = CloseMetaFile (hdcMeta) ;
��metafileװ��������Ч�ڼ䣬�κ���hdcMeta������GDI���ж����metafile��һ���ֶ�������ʾ���ں���CloseMetaFile֮�ᣬװ�����ݴ��ű�Ϊ��Ч����ʽ����һ��ָ��metafile��hmf���Ĵ��š��һ��ڵ�ʮ��������metafile��
ȡ��װ��������Ѷ
��
һ��װ������ͨ����ָһ��ʵ����ʾ�豸������Ѷ��ʾ����ӡ������ͨ��������Ҫȡ���йظ��豸����Ѷ��������ʾ���Ĵ�С����λΪͼ�ػ���ʵ�ʳ��ȵ�λ����ɫ����ʾ������������ͨ������GetDeviceCaps����ȡ���豸���ܡ�����ʽ��ȡ����Щ��Ѷ��
iValue = GetDeviceCaps (hdc, iIndex) ;
���У�����iIndexȡֵΪWINGDI.H��ͷ�����ж����29��ʶ����֮һ�����磬iIndexΪHORZRESʱ��ʹGetDeviceCaps�����豸�Ŀ��ȣ���λΪͼ�أ���iIndexΪVERTRESʱ����GetDeviceCaps�����豸�ĸ߶ȣ���λΪͼ�أ������hdc��ӡ����װ�����ݵĴ��ţ���GetDeviceCaps����ӡ������ʾ����ĸ߶ȺͿ��ȣ�����Ҳ����ͼ��Ϊ��λ�ġ�
������ʹ��GetDeviceCaps��ȷ���豸������ͬ��̬ͼ�ε�������������Ѷ��ʾ����������Ҫ�����Ƕ����ӡ�豸ȴ�Ƿdz���Ҫ�����磬�������ͼ�����ܻ�����ͼͼ��GetDeviceCaps�Ϳ��Խ���һ�����������
DEVCAPS1��ʽ
��
��ʽ5-1��ʾ��DEVCAPS1��ʽ��ʾ����һ����Ѷ��ʾ����װ������Ϊ����ʱ�����Դ� GetDeviceCaps��ʽ�л�õIJ�����Ѷ���ó�ʽ����һ������汾DEVCAPS2���ڵ�ʮ���¸��������ȡ��ӡ������Ѷ����
��ʽ5-1 DEVCAPS1 DEVCAPS1.C /*------------------------------------------------------------------------ DEVCAPS1.C -- Device Capabilities Display Program No. 1 (c) Charles Petzold, 1998 ----------------------------------------------------------------------*/ #include <windows.h> #define NUMLINES ((int) (sizeof devcaps / sizeof devcaps [0])) struct { int iIndex ; TCHAR * szLabel ; TCHAR * szDesc ; } devcaps [] = { HORZSIZE, TEXT ("HORZSIZE"),TEXT ("Width in millimeters:"), VERTSIZE, TEXT ("VERTSIZE"),TEXT ("Height in millimeters:"), HORZRES, TEXT ("HORZRES"), TEXT ("Width in pixels:"), VERTRES, TEXT ("VERTRES"), TEXT ("Height in raster lines:"), BITSPIXEL, TEXT ("BITSPIXEL"),TEXT ("Color bits per pixel:"), PLANES, TEXT ("PLANES"), TEXT ("Number of color planes:"), NUMBRUSHES, TEXT ("NUMBRUSHES"), TEXT ("Number of device brushes:"), NUMPENS, TEXT ("NUMPENS"), TEXT ("Number of device pens:"), NUMMARKERS, TEXT ("NUMMARKERS"), TEXT ("Number of device markers:"), NUMFONTS, TEXT ("NUMFONTS"), TEXT ("Number of device fonts:"), NUMCOLORS, TEXT ("NUMCOLORS"), TEXT ("Number of device colors:"), PDEVICESIZE, TEXT ("PDEVICESIZE"), TEXT ("Size of device structure:"), ASPECTX, TEXT ("ASPECTX"), TEXT ("Relative width of pixel:"), ASPECTY, TEXT ("ASPECTY"), TEXT ("Relative height of pixel:"), ASPECTXY, TEXT ("ASPECTXY"), TEXT ("Relative diagonal of pixel:"), LOGPIXELSX, TEXT ("LOGPIXELSX"), TEXT ("Horizontal dots per inch:"), LOGPIXELSY, TEXT ("LOGPIXELSY"), TEXT ("Vertical dots per inch:"), SIZEPALETTE, TEXT ("SIZEPALETTE"), TEXT ("Number of palette entries:"), NUMRESERVED, TEXT ("NUMRESERVED"), TEXT ("Reserved palette entries:"), COLORRES, TEXT ("COLORRES"), TEXT ("Actual color resolution:") } ; LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("DevCaps1") ; 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 ("Device Capabilities"), 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 ; TCHAR szBuffer[10] ; HDC hdc ; int i ; PAINTSTRUCT ps ; 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, devcaps[i].szLabel, lstrlen (devcaps[i].szLabel)) ; TextOut ( hdc, 14 * cxCaps, cyChar * i, devcaps[i].szDesc, lstrlen (devcaps[i].szDesc)) ; SetTextAlign (hdc, TA_RIGHT | TA_TOP) ; TextOut (hdc, 14*cxCaps+35*cxChar, cyChar*i, szBuffer, wsprintf (szBuffer, TEXT ("%5d"), GetDeviceCaps (hdc, devcaps[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) ; }
���Կ����������ʽ�dz����Ƶ����µ�SYSMETS1��Ϊ�˱��ֳ�ʽ��Ķ�С����û��ʹ�þ����У���Ϊ��֪����Ѷ������һ����������ʾ��������256ɫ��640��480��VGA����ʾ�Ľ����ͼ5-1��ʾ��
��
ͼ5-1 256ɫ��640��480VGA�ϵ�DEVCAPS1��ʾ |
װ�õĴ�С
��
�ٶ�Ҫ���Ʊ߳�Ϊ1Ӣ��������Σ�������ʽд���ߣ���Windows����ҵϵͳ����Ҫ֪����Ѷ��ʾ��1Ӣ���Ӧ����ͼ�ء�ʹ��GetDeviceCaps��ʽ��ȡ���й�����Ѷ��ʾ����ӡ����֮������豸��ʵ����ʾ��С��Ѷ��
��Ѷ��ʾ����ӡ������������ͬ���豸����Ҳ������Ե������ǡ������ȡ���װ����ϵ�����ķ�ʽ�����ӡ���������Ǿ����á�ÿӢ��ĵ�����dpi������ʾ�����ȡ����磬���������ӡ������300��600dpi�Ľ����ȡ�Ȼ������Ѷ��ʾ���Ľ���������ˮƽ�ʹ�ֱ����ͼ��������ʾ�ģ����磬1024��768��������˲������������ӡ������һ��ֽ��ˮƽ�ʹ�ֱ��ӡ����ͼ�ػ����ǵ���Ѷ��ʾ����ÿӢ���ж���ͼ�ء�
�ڱ����У����á������ȡ����ϸ���ÿ������λ��һ��ΪӢ�磩�ڵ�ͼ��������ʹ�á�ͼ�ش�С����ͼ�سߴ硹��ʾ�豸ˮƽ��ֱ��ʾ����ͼ��������������С���򡸶����ߴ硹����Ӣ������Ϊ��λ���豸��ʾ����Ĵ�С�������ӡ����ҳ�棬����������ҳ�棬ֻ�ǿ���ӡ�����򡣣�ͼ�ش�С���Զ�����С�͵õ������ȡ�
����Windowsʹ�õĴ������Ѷ��ʾ����өĻ���ǿ��ȸ߶�33%����ͱ�ʾ�ݺ��Ϊ1.33:1��һ��д����4:3����ʷ�ϣ��ñ�����׷�ݵ�Thomas Edison������Ӱ���������һֱ��Ϊ��Ӱ�ı�׼�ݺ�ȣ�ֱ��1953����ָ�����̬�Ŀ���ĻͶӰ�������ӻ�өĻ���ݺ��Ҳ��4:3��
Ȼ����WindowsӦ�ó�ʽ��Ӧ������Ѷ��ʾ������4:3���ݺ�ȡ����ǽ������ִ���ʱϣ����Ѷ��ʾ����һ��ֽ�ij��Ϳ����ơ�����ͨ��ѡ���ǰ�4:3��Ϊ3:4��ʾ���ѱ�׼��ʾ��תһ�¡�
����豸��ˮƽ�������봹ֱ��������ȣ��ͳ��豸���С�������ͼ�ء������ڣ�Windows�ձ�ʹ�õ���Ѷ��ʾ��������������ͼ�أ���Ҳ�����⡣��Ӧ�ó�ʽҲ��Ӧ������Ѷ��ʾ�����Ǿ���������ͼ�ء���Windows��һ�η���ʱ����׼��ʾ������IBM Color Graphics Adapter��CGA��������640��200��ͼ�ش�С��Enhanced Graphics Adapter��EGA����640��350��ͼ�ش�С��Hercules Graphics Card��720��348��ͼ�ش�С��������Щ��ʾ����ʹ��4:3�ݺ�ȵ���ʾ��������ˮƽ�ʹ�ֱͼ�����ı�ֵ������4:3��
ִ��Windows��ʹ���ߺ�����ȷ����Ѷ��ʾ����ͼ�ش�С���ڡ�����̨����ִ�С���ʾ��������ѡ���趨��ҳ���ǩ���ڱ��С��������򡹵���λ�У����Կ�����Щͼ�سߴ�֮һ��
������Щ����4:3��������1280��1024ͼ�ش�С���ⲻ����Щ���ã�����Щ���˷��С�������Щͼ�سߴ綼��Ϊ��4:3����ʾ���ϻ���������ε�ͼ�ء���
WindowsӦ�ó�ʽ����ʹ��SM_CXSCREEN��SM_CYSCREEN������GetSystemMetrics�õ�ͼ�سߴ硣��DEVCAPS1��ʽ������ע�⵽����ʽ������HORZRES��ˮƽ�����ȣ���VERTRES������GetDeviceCaps�еõ�ͬ����ֵ����������ȡ�ָ����ͼ�ش�С������ÿ������λ��ͼ������
��Щ���豸��С�ļ򵥲��֣����ڿ�ʼ���ӵIJ��֡�
ǰ�����豸������HORZSIZE��VERTSIZE���ļ��г�Ϊ���Ժ��׼Ƶ�ʵ��өĻ�Ŀ��ȡ������Ժ��׼Ƶ�ʵ��өĻ�ĸ߶ȡ�����/Platform SDK/Graphics��Multimedia Services/GDI/Device Contexts/Device Context Reference/Device Context Functions/GetDeviceCaps�У�����Щ����������ֱ�ӵĶ��塣���磬������Ѷ��ʾ������ʾ���Ľ������ԣ�Windows�������֪����ʾ���Ĵ�С�أ��������̨ϥ���͵��ԣ�������Ѷ������ʽ��֪��׼ȷ��өĻ��С�������������ⲿ��ʾ����������������أ��������ѶͶӰ�����ӵ��������أ�
��Windows��16λԪ�汾�У�����Windows NT�У���WindowsΪHORZSIZE��VERTSIZEʹ�á���׼������ʾ��С��Ȼ������Windows 95��ʼ��HORZSIZE��VERTSIZEֵ�Ǵ�HORZRES��VERTRES��LOGPIXELSX��LOGPIXELSYֵ�����������ġ��������Ĺ�����ʽ��
�����ڡ�����̨����ʹ�á���ʾ������ʽѡ����ʾ��ͼ�ش�Сʱ��Ҳ����ѡ��ϵͳ����Ĵ�С�����ѡ���Ô�������640��480��ʾ��������������1024��768�����ʱ��̫С������������Ҫ�����ϵͳ���塣��Щϵͳ�����Сָ����ʾ������ʽ�ġ��趨��ҳ���ǩ�еġ�С���塹�͡������塹��
�ڴ�ͳ���Ű��У��������ĸ��С�ɡ��㡹��ʾ��1���Լ1/72Ӣ�磬�ڵ����Ű���1������Ϊ1/72Ӣ�硣
�����ϣ�����ĵ�ֵ�Ǵ���������ߵ���Ԫ����������j��p��q��y����ĸ�²�����Ԫ�ײ��ľ��룬���в������������š����磬��10��������д˾�����10/72Ӣ�硣����TEXTMETRIC�ṹ������ĵ�ֵ���tmHeight��λ��ȥtmInternalLeading��λ����ͼ5-2��ʾ����ͼ����һ�µ�ͼ4-3һ������
��
ͼ5-2 С�����TEXTMETRIC��λ�� |
���������Ű��У�����ĵ�ֵ��������ĸ��ʵ�ʴ�С����������ȡ�����������������ʵ����Ԫ�ȵ�ֵָʾ��Ҫ��һЩ��СһЩ���Ͼ������������һ�����������ǿ�ѧ��
TEXTMETRIC�ṹ��tmHeight��λָ�����ֵ���������өĻ��ӡ�����ϼ���ķ�ʽ����Ҳ�����õ������������磬12����о�ָ�����������еĻ�׼��Ӧ�ü��12/72����1/6��Ӣ�硣��Ӧ��Ϊ10������ʹ��10���о࣬��Ϊ���ֵ������л�����һ��
10������������������С�10������岻��춳�ʱ���Ķ���
Windowsϵͳ���å£ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç´ï¿½ï¿½ï¿½ï¿½å»¹ï¿½ï¿½Ð¡ï¿½ï¿½ï¿½å£¬Ò²ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ñ¡ï¿½ï¿½ï¿½ï¿½ï¿½ÆµÍ¼ï¿½Ø´ï¿½Ð¡ï¿½ï¿½ï¿½Ì¶ï¿½ï¿½ï¿½ï¿½ï¿½Îª10�������12���оࡣ������������֣�������嶼��10�㣬Ϊʲô�������dz�Ϊ�������С�����أ�
����ǣ� �����ڡ�����̨���ġ���ʾ����ʽ��ѡ��С����������ʱ��ʵ������ѡ����һ���ٶ�����Ѷ��ʾ�����ȣ���λ��ÿӢ��ĵ��� ����ѡ��С����ʱ����ҪWindows�ٶ���Ѷ��ʾ������ΪÿӢ��96�㡣��ѡ�������ʱ����ҪWindows�ٶ���Ѷ��ʾ������ΪÿӢ��120�㡣
�ٿ���ͼ5-2������С���壬�����ݵ���ʾ������ΪÿӢ��96�㡣��˵������10�����塣10�㼴��10/72Ӣ�磬�������96�㣬ÿӢ���ž�Ϊ13ͼ�ء��⼴��tmHeight��ȥtmInternalLeading��ֵ���о���12�㣬��12/72Ӣ�磬������96�㣬ÿӢ���Ϊ16ͼ�ء��⼴��tmHeight��ֵ��
ͼ5-3��ʾ�����塣��������ÿӢ��120��Ľ����ȡ�ͬ��������10�����壬10/72����120�㣬ÿӢ����16ͼ�أ�����tmHeight��tmInternalLeading��ֵ��12���о���20ͼ�أ�����tmHeight��ֵ�����������һ�����ٴ�ǿ������ʾ����ʵ�ʵĶ�����С����������������������ķ�ʽ����Ҫ�����ij�ʽ�жԴ�д����ʽ����
��
ͼ5-3 �������FONTMETRIC��λ |
��Windows��ʽ�У�������ʹ��GetDeviceCaps��ʽȡ��ʹ�����ڡ�����̨���ġ���ʾ������ʽ��ѡ�����ÿӢ��ĵ���Ϊ��λ�ļٶ������ȡ�Ҫ�õ���Щֵ�������Ѷ��ʾ��������������ͼ�أ�����������Щֵ�Dz�ͬ�ģ�������ʹ������LOGPIXELSX��LOGPIXELSY��LOGPIXELSָ�߼�ͼ�أ����Ļ�����˼�ǡ���ÿӢ���ͼ����Ϊ��λ�ķ�ʵ�ʽ����ȡ���
��HORZSIZE��VERTSIZE������GetDeviceCaps�õ����豸���������ļ��ϳ�Ϊ��ʵ��өĻ�Ŀ��ȣ���λ���ס�����ʵ��өĻ�ĸ߶ȣ���λ���ס�����Ϊ��Щֵ�Ǵ�HORZRES��VERTRES��LOGPIXELSX��LOGPIXELSYֵ�����������ģ���������Ӧ�ó�Ϊ���߼����ȡ��͡��߼��߶ȡ�����ʽ�ǣ�
��
��
����25.4��춰�Ӣ��ת��Ϊ���ס�
�⿴�������ֲ����߼����˲����Ͼ�����Ѷ��ʾ���ǿ����ó��Ժ���Ϊ��λ�Ĵ�С�������ǽ��Ƶģ������ġ�����Windows 98�������������С���෴������ʹ����ѡ�����ʾͼ�ش�С��ϵͳ�����СΪ���������Ժ���Ϊ��λ����ʾ��С��������ʾ��ͼ�ش�С������GetDeviceCaps���Ķ�����С������ʲô�����أ�
��dz������塣�ٶ���һ��17Ӣ�����ʾ����ʵ�ʵ���ʾ��С��Լ��12Ӣ���9Ӣ�硣�ٶ�����СҪ���640��480ͼ�ش�С��ִ��Windows������ζ��ʵ�ʵĽ�������ÿӢ��53�㡣10�����壨��ֽ�ϱ���Ķ�����өĻ�ϴ�A�Ķ�����q�ĵײ�ֻ��7��ͼ�ء�������������ѿ����Ҳ��׶�������������Щ�ھɵ�Color Graphics Adapter��ִ��Windows�����ǡ���
���ڣ������ĵ��Խ�����ѶͶӰ����ͶӰ����Ѷ��ʾ����4Ӣ�߿���3Ӣ�߸ߡ�ͬ����640��480ͼ�ش�С�����Ǵ�ԼÿӢ��13��Ľ����ȡ���������������ͼ��ʾ10��������Ǻܿ�Ц�ġ�
10����������Ѷ��ʾ����Ӧ�ǿɶ��ģ���Ϊ������ӡʱ�ǿ϶��ɶ��ġ�����10������ͳ�Ϊһ����Ҫ�IJ��ա���WindowsӦ�ó�ʽȷ��10��өĻ����Ϊƽ����Сʱ�����ܹ�ʹ��8��������ʾ��С�����֣��Կɶ��������ô��10���������ʾ�ϴ�����֡��������Ƶ�����ȣ���ÿӢ��ĵ���Ϊ��λ����10�������ͼ�ش�С��ȷ���Ǻ�������ġ�
Ȼ������Windows NT�У����ϵķ�������HORZSIZE��VERTSIZEֵ�����ַ�����Windows��16λԪ�汾һ�¡�HORZRES��VERTRESֵ��Ȼ��ʾˮƽ�ʹ�ֱͼ�ص���ֵ��LOGPIXELSX��LOGPIXELSY��Ȼ���ڡ�����̨���ġ���ʾ������ʽ��ѡ��������йء���Windows 98�У�LOGPIXELSX��LOGPIXELSY�ĵ���ֵ��96��120 dpi����ȡ�����ѡ�����С���廹�Ǵ����塣
��Windows NT�е�������HORZSIZE��VERTSIZEֵ�̶���ʾ��׼��ʾ����С�������ͨ����ʾ����ȡ�õ�HORZSIZE��VERTSIZEֵ�ֱ���320��240���ס���Щֵ����ͬ�ģ���ѡ���ͼ�ش�С�޹ء���ˣ���Щֵ����HORZRES��VERTRES��LOGPIXELSX��LOGPIXELSY������GetDeviceCaps�еõ���ֵ��ͬ��Ȼ����������ǰ��Ĺ�ʽ������Windows 98�µ�HORZSIZE��VERTSIZEֵ��
�����ʽ��Ҫʵ�ʵ���Ѷ��ʾ��С����ô�죿Ҳ����õĽ���������öԻ�������ʹ�����������ǡ�
���ᣬ����GetDeviceCaps��������ֵ����Ѷ��С�йء�ASPECTX��ASPECTY��ASPECTXYֵ��ÿһ��ͼ�ص���Կ��ȡ��߶ȺͶԽ��ߴ�С���������뵽���������������ͼ�أ�ASPECTX��ASPECTYֵ��ͬ��������Σ�ASPECTXYֵӦ���ASPECTX��ASPECTYƽ���͵�ƽ����������ֱ��������һ����
���ɫ��
��
�����Ѷ��ʾ������ʾ��ɫͼ�غͰ�ɫͼ�أ���ÿ��ͼ��ֻ��Ҫ�������е�һλԪ����ɫ��ʾ����ÿ��ͼ����Ҫ���λԪ��λԪ��Խ�࣬ɫ��Խ�࣬���߸������˵������ͬʱ��ʾ�IJ�ͬɫ�ʵ���Ŀ���2��λԪ���η���
��Full-Color����Ѷ��ʾ���Ľ�������ÿ��ͼ��24λԪ��8λԪ��ɫ��8λԪ��ɫ�Լ�8λԪ��ɫ���졢�̡�������ɫ����Ôɫ������������ֻ�����ɫ��������������������ɫ����ͨ���Ŵ󾵿���ʾĻ���Ϳ��Կ�������
��High-Color����ʾ��������ÿ��ͼ��16λԪ��5λԪ��ɫ��6λԪ��ɫ�Լ�5λԪ��ɫ����ɫ��һλԪ����Ϊ���۶���ɫ������һЩ��
��ʾ256����ɫ����ʾ��ÿ��ͼ����Ҫ8λԪ��Ȼ������Щ8λԪ��ֵһ���ɶ���ʵ����ɫ�ĵ�ɫ����֯�ġ��һ��ڵ�ʮ������ϸ���������ǡ�
���ᣬ��ʾ16����ɫ����ʾ��ÿ��ͼ����Ҫ4λԪ����16����ɫһ��̶���Ϊ���Ļ����ĺ졢�ڡ������ࡢ�ϡ��ơ����ֻ�ɫ����16����ɫҪ���ݵ���ʽ��IBM CGA��
ֻ����ijЩ����ij�ʽ�в���Ҫ֪����Ѷ��ʾ���ϵļ������������֯�ģ�����GetDeviceCapsʹ��ʽд���߿���֪����ʾ���Ĵ�����֯�Լ����ܹ���ʾ��ɫ����Ŀ������ĺ��д���ɫ��ƽ�����Ŀ��
iPlanes = GetDeviceCaps (hdc, PLANES) ;
����ĺ��д���ÿ��ͼ�ص�ɫ��λԪ����
iBitsPixel = GetDeviceCaps (hdc, BITSPIXEL) ;
�������ɫͼ����ʾ�豸ʹ�ö��ɫ��ƽ���ÿͼ���ж��ɫ��λԪ����ƣ����Dz���ͬʱһ��ʹ�������ַ�ʽ�����仰˵�����������б���һ������1����ʾ���ܹ���ʾ��ɫ�������������¹�ʽ�����㣺
iColors = 1 << (iPlanes * iBitsPixel) ;
���ֵ����NUMCOLORS�����õ���ɫ����ֵ����һ����Ҳ���ܲ�һ����
iColors = GetDeviceCaps (hdc, NUMCOLORS) ;
���ᵽ����256ɫ����ʾ��ʹ��ɫ�ʵ�ɫ�̡�����������£���NUMCOLORSΪ����ʱ��GetDeviceCaps������Windows������ɫ������ֵΪ20��ʣ���236����ɫ������Windows��ʽ�õ�ɫ�̹������趨�����High-Color��True-Color��ʾ�����ȣ�����NUMCOLORS������GetDeviceCapsͨ������-1���������޷��õ���Ҫ����Ѷ�����Ӧ��ʹ��ǰ����ʾ�Ĵ���PLANES��BITSPIXELֵ��iColors��ʽ��
�ڴ����GDI��ʽ�����У�ʹ��COLORREFֵ��ֻ��һ��32λԪ���������ų�����������ʾһ��ɫ�ʡ�COLORREFֵ���պ졢�̺���ɫ������ָ����һ����ɫ��ͨ��������RGBɫ�ʡ� ��32λԪ��COLORREFֵ���趨��ͼ5-4��ʾ��
��
ͼ5-4 32λCOLORREFֵ |
ע����ǰ���DZ�Ϊ0��8��λԪ������ÿ��Ôɫ��ָ��Ϊһ��8λԪ��ֵ�������ϣ�COLORREF����ָ�����Ķ�ʮ�Ĵη��ֻ�һǧ��������ɫ�ʡ�
����������ų�����������Ϊһ����RGBɫ�ʡ���Windows��ͷ����WINGDI.H�ṩ�˼���ʹ��RGBɫ��ֵ�ľ޼���RGB�޼�Ҫ�����������ֱ�����졢�̺���ֵ��Ȼ�Ὣ�������Ϊһ���������ų�������
#define RGB(r,g,b) ((COLORREF)(((BYTE)(r) | \ ((WORD)((BYTE)(g)) << 8)) | \ (((DWORD)(BYTE)(b)) << 16)))
ע������������˳���Ǻ졢�̺�������ˣ�ֵ��
RGB (255, 255, 0)
��0x0000FFFF�����ɫ����ɫ����ɫ�ĺϳɣ������������������趨Ϊ0ʱ��ɫ��Ϊ��ɫ�������в����趨Ϊ255ʱ��ɫ��Ϊ��ɫ��GetRValue��GetGValue��GetBValue�޼���COLORREFֵ�г�ȡ��Ôɫֵ��������ʹ�ô���RGBɫ��ֵ��Windows��ʽʱ����Щ�޼���ʱ��ܷ��㡣
��16ɫ��256ɫ��ʾ���ϣ�Windows����ʹ�á���ɫ��������豸�ܹ���ʾ����ɫ֮���ɫ�ʡ���ɫ�������ɶ���ɫ�ʵ�ͼ����ɵ�ͼ��ͼ�������Ժ���GetNearestColor��������ijһɫ����ӽ��Ĵ�ɫ��
crPureColor = GetNearestColor (hdc, crColor) ;
װ����������
��
ǰ���Ѿ��ᵽ����Windowsʹ��װ���������������GDI��ʽ����ʾ������β����ġ����ԡ������磬����TextOut��ʽ��ʾ����ʱ����ʽд���߲���ָ�����ֵ�ɫ�ʺ����壬Windows��װ������ȡ�������Ѷ��
��ʽȡ��һ��װ�����ݵĴ���ʱ��Windows��Ԥ��ֵ�趨���е����ԣ�����һ�ڻῴ�����ȡ�������趨������5-1�г���Windows 98֧Ԯ��װ���������ԣ���ʽ���Ըı����ȡ���κ�һ�����ԡ�
��5-1 |
װ���������� | Ԥ��ֵ | �޸ĸ�ֵ�ĺ�ʽ | ȡ�ø�ֵ�ĺ�ʽ |
---|---|---|---|
Mapping Mode | MM_TEXT | SetMapMode | GetMapMode |
Window Origin | (0, 0) |
SetWindowOrgEx OffsetWindowOrgEx |
GetWindowOrgEx |
Viewport Origin | (0, 0) |
SetViewportOrgEx OffsetViewportOrgEx |
GetViewportOrgEx |
Window Extents | (1, 1) |
SetWindowExtEx SetMapMode ScaleWindowExtEx |
GetWindowExtEx |
Viewport Extents | (1, 1) |
SetViewportExtEx SetMapMode ScaleViewportExtEx |
GetViewportExtEx |
Pen | BLACK_PEN | SelectObject | SelectObject |
Brush | WHITE_BRUSH | SelectObject | SelectObject |
Font | SYSTEM_FONT | SelectObject | SelectObject |
Bitmap | None | SelectObject | SelectObject |
Current Position | (0, 0) |
MoveToEx LineTo PolylineTo PolyBezierTo |
GetCurrentPositionEx |
Background Mode | OPAQUE | SetBkMode | GetBkMode |
Background Color | White | SetBkColor | GetBkColor |
Text Color | Black | SetTextColor | GetTextColor |
Drawing Mode | R2_COPYPEN | SetROP2 | GetROP2 |
Stretching Mode | BLACKONWHITE | SetStretchBltMode | GetStretchBltMode |
Polygon Fill Mode | ALTERNATE | SetPolyFillMode | GetPolyFillMode |
Intercharacter Spacing | 0 | SetTextCharacterExtra | GetTextCharacterExtra |
Brush Origin | (0, 0) | SetBrushOrgEx | GetBrushOrgEx |
Clipping Region | None |
SelectObject SelectClipRgn IntersectClipRgn OffsetClipRgn ExcludeClipRect SelectClipPath |
GetClipBox |
����װ������
��
ͨ������������GetDC��BeginPaintʱ��Windows��Ԥ��ֵ����һ���µ�װ�����ݣ���������������һ�иı���װ��������ReleaseDC��EndPaint�����ͷ�ʱ�����ᶪʧ��������ij�ʽ��Ҫʹ�÷��ڶ���װ���������ԣ�����������ÿ��ȡ��װ�����ݴ���ʱ��ʼ��װ�����ݣ�
case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; װ���������� �����Ӵ���ʾ���� EndPaint (hwnd, &ps) ; return 0 ;
��Ȼ��ͨ����������ַ����Ѿ������������ˣ���������������Ҫ���ͷ�װ������֮�ᣬ��Ȼ�����ʽ�ж�װ���������������ĸı䣬�Ա�����һ�κ���GetDC��BeginPaintʱ������Ȼ�ܹ������á�Ϊ�ˣ����ڵ�¼�Ӵ����ʱ����CS_OWNDC��������Ӵ�����һ���֣�
wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC ;
���ڣ���������Ӵ������������ÿ���Ӵ�����ӵ���Լ���װ�����ݣ���һֱ���ڣ�ֱ���Ӵ���ɾ�������ʹ����CS_OWNDC��񣬾�ֻ���ʼ��װ������һ�Σ������ڴ���WM_CREATEѶϢ�����ڼ������һ������
case WM_CREATE: hdc = GetDC (hwnd) ; ��ʼ��װ���������� ReleaseDC (hwnd, hdc) ;
��Щ�����ڸı�֮ǰһֱ��Ч��
CS_OWNDC���ֻӰ��GetDC��BeginPaint��õ�װ�����ݣ���Ӱ��������ʽ����GetWindowDC����õ�װ�����ݡ���ǰ���ᳫʹ��CS_OWNDC�����Ϊ����Ҫ�����壻���ڣ��ڴ�������ͼ�ε�Windows NTӦ�ó�ʽ�У�������������ܡ���ʹ����CS_OWNDC������ȻӦ�����˳��Ӵ�ѶϢ������ʽ֮ǰ�ͷ�װ�����ݡ�
ijЩ����£���������ı�ijЩװ���������ԣ��øı�������Խ��л�ͼ��Ȼ��ָ�Ô����װ�����ݡ�Ҫ����һ���̣�����ͨ�����º���������װ�����ݵ�״̬��
idSaved = SaveDC (hdc) ;
���ڣ����Ըı�һЩ���ԣ�����Ҫ�ص�����SaveDCǰ���ڵ�װ������ʱ�����У�
RestoreDC (hdc, idSaved) ;
�������ں���RestoreDC֮ǰ����SaveDC���Ρ�
�������ʽд�����Բ�ͬ�ķ�ʽʹ��SaveDC��RestoreDC��Ȼ����������������е�PUSH��POPָ���������SaveDCʱ������Ҫ���洫��ֵ��
SaveDC (hdc) ;
Ȼ�ᣬ�����Ը���ijЩ���Բ��ٴκ���SaveDC��Ҫ��װ�����ݻָ���һ���Ѿ������״̬�����У�
RestoreDC (hdc, -1) ;
��ͽ�װ�����ݻָ��������SaveDC��ʽ�����״̬�С�
�������
��
�ڵ�һ�£�����̸�۹�Windowsͼ��װ�ý��潫ͼ������豸��װ��������ʽ���������һ��ķ�ʽ���������ϣ�ֻҪ�ṩSetPixel��GetPixel��ʽ���Ϳ���ʹ��ͼ��װ��������ʽ����һ�ж����ˡ������һ�ж�����ʹ��GDIģ����ʵ���ĸ��߽׵ij�ʽ�����������磬����ʱ��ֻ��GDI����SetPixel���Σ����ʵ��ص���x��y���ꡣ
��ʵ������У�Ҳ��ȷ���Խ�ʹ��SetPixel��GetPixel��ʽ��������Ҫ���κλ��ơ���Ҳ��������Щ��ʽ�Ļ�������Ƴ����͹������õ�ͼ�α��ϵͳ��Ψһ�����������ܡ����һ����ʽͨ�����κ��в��ܵ���SetPixel��ʽ����ô��ִ��������dz��������һ��ͼ��ϵͳ���ߺͽ����������ӵ�ͼ�β�������װ��������ʽ�IJ���ϣ����ͻ����Ч�ö࣬��Ϊװ��������ʽ�������Щ�����ij�ʽ���������ѻ������⣬һЩ��ʾ��������ͼ�θ�������������������ѶӲ���Լ�����ͼ�Ρ�
�趨ͼ��
��
��ʹWindows GDI������SetPixel��GetPixel��ʽ��������ʹ�����ǡ��ڱ��飬���ڵ����µ�CONNECT��ʽ��ʹ����SetPixel��ʽ�����ڵڰ��µ�WHATCLR��ʽ��ʹ����GetPixel��ʽ��������ˣ������ǿ�ʼ���о�ͼ�����Ƿdz����㡣
SetPixel��ʽ��ָ����x��y�������ض�����ɫ�趨ͼ�أ�
SetPixel (hdc, x, y, crColor) ;
��ͬ���κλ�ͼ��ʽ��һ������һ��������װ�����ݵĴ��š��ڶ����͵���������ָ��������λ�á�ͨ��Ҫ����Ӵ���ʾ�����װ�����ݣ�����x��y����ڸ���ʾ��������Ͻǡ�����һ��������COLORREF��ָ̬������ɫ������ں�ʽ��ָ������ɫ��Ѷ��ʾ����֧Ԯ����ʽ��ͼ���趨Ϊ��ӽ��Ĵ�ɫ���Ӻ�ʽ���ظ�ֵ��
GetPixel��ʽ����ָ�����괦��ͼ����ɫ��
crColor = GetPixel (hdc, x, y) ;
ֱ��
��
Windows���Ի�ֱ�ߡ���Բ�ߣ���ԲԲ���ϵ����ߣ��ͱ��������ߡ�Windows 98֧Ԯ��7�����ߺ�ʽ�ǣ�
���⣬Windows NT��֧Ԯ3�ֻ��ߺ�ʽ��
��������ʽWindows 98��֧Ԯ��
�ڱ��µ������ҽ�����һЩ�Ȼ���Ҳ��������ͼ�εķ������ĺ�ʽ����Щ��ʽ�ǣ�
װ�����ݵ��������Ӱ��������Щ��ʽ�����ߵ���ۣ�Ŀǰ���ʵ�λ�ã������LineTo��PolylineTo��PolyBezierTo��ArcTo �������ʡ�������ʽ������ɫ�ͻ�ͼģʽ��
��һ��ֱ�ߣ��������������ʽ����һ����ʽָ�����ߵĿ�ʼ�㣬�ڶ�����ʽָ�����ߵ��յ㣺
MoveToEx (hdc, xBeg, yBeg, NULL) ; LineTo (hdc, xEnd, yEnd) ;
MoveToExʵ���ϲ��á»ï¿½ß£ï¿½ï¿½ï¿½Ö»ï¿½ï¿½ï¿½è¶¨ï¿½ï¿½×°ï¿½ï¿½ï¿½ï¿½ï¿½ÝµÄ¡ï¿½Ä¿Ç°Î»ï¿½Ã¡ï¿½ï¿½ï¿½ï¿½Ô¡ï¿½È»ï¿½ï¿½LineTo��ʽ��Ŀǰ��λ�õ�����ָ���ĵã»Ò»ï¿½ï¿½Ö±ï¿½ß¡ï¿½Ä¿Ç°Î»ï¿½ï¿½Ö»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½GDI��ʽ�Ŀ�ʼ�㡣���ڶ���װ�������У�Ŀǰλ������趨�ڵ㣨0,0��������ں���LineTo֮ǰû���趨Ŀǰλ�ã���ô��������ʾ��������Ͻǿ�ʼ���ߡ�
С��ʷ��
Windows��16λԪ�汾�У������ı�Ŀǰλ�õĺ�ʽ��MoveTo���ú�ʽֻ��������������װ�����ݴ��š�x��y���ꡣ��ʽͨ������16λԪ��ƴ�ɵ�32λԪ�������ų�����������ǰ��Ŀǰλ�á�Ȼ������Windows��32λԪ�汾�У�������32λԪ����ֵ����C��32λԪ�汾����û�ж���64λԪ������������̬��������ָı���ζ��MoveTo���䴫��ֵ�в���ָ����ǰ��Ŀǰλ�á���ʵ�ʵij�ʽд���У���MoveTo���ص�ֵ�����������ã���˾���Ҫһ���º�ʽ�������MoveToEx��
MoveToEx������һ��������ָ��POINT�ṹ��ָ�ꡣ�Ӹú�ʽ�����ᣬPOINT�ṹ��x��y��λָ������ǰ��Ŀǰλ�á����������Ҫ������Ѷ��ͨ����ˣ������Լ򵥵��������������ʾ������������һ�������趨ΪNULL��
���棺
����Windows 98�е�����ֵ��������32λԪ�ģ�ʵ����ȴֻ�õ��˵�16λԪ������ֵʵ���ϱ�������-32,768��32,767֮�䡣��Windows NT�У�ʹ��������32λԪֵ��
�������ҪĿǰλ�ã��Ϳ���ͨ�����º��л�ã�
GetCurrentPositionEx (hdc, &pt) ;
���У�pt��POINT�ṹ�ġ�
����ij�ʽ����Ӵ������Ͻǿ�ʼ������ʾ�����л�һ������������֮�����100��ͼ�أ�����hwnd���Ӵ����ţ�hdc��װ�����ݴ��ţ���x��y��������
GetClientRect (hwnd, &rect) ; for ( x = 0 ; x < rect.right ; x+= 100) { MoveToEx (hdc, x, 0, NULL) ; LineTo (hdc, x, rect.bottom) ; } for (y = 0 ; y < rect.bottom ; y += 100) { MoveToEx (hdc, 0, y, NULL) ; LineTo (hdc, rect.right, y) ; }
��Ȼ��������ʽ����һ��ֱ���Ե���Щ�鷳��������ϣ����һ��������ֱ��ʱ��Ŀǰ����λ�������ֻ��ú����á����磬�������붨��һ������5���㣨10��ֵ�������У�����һ�����εı߽��
POINT apt[5] = { 100, 100, 200, 100, 200, 200, 100, 200, 100, 100 } ;
ע�⣬����һ�������һ������ͬ�����ڣ�ֻ��Ҫʹ��MoveToEx�Ƶ���һ���㣬��������ĵ�ʹ��LineTo��
MoveToEx (hdc, apt[0].x, apt[0].y, NULL) ; for ( i = 1 ; i < 5 ; i++) LineTo (hdc, apt[i].x, apt[i].y) ;
���LineTo��Ŀǰλ�û���������������LineTo��ʽ�и����ĵ㣬������γ�ʽ��û�����κ����괦�����Ρ���Ȼ����ʾ���϶�������β��������⣬�����ڻ�ͼ���ϻ�����������ͼ��ʽ���������ϻὲ�����£��Ӿ�Ч���Ͳ�̫���ˡ�
����Ҫ�������еĵ����ӳ���ʱ��ʹ��Polyline��ʽҪ�򵥵öࡣ����������������������һ�γ�ʽ����ͬ�ľ��Σ�
Polyline (hdc, apt, 5) ;
����һ�������ǵ����Ŀ�����ǻ�����ʹ��(sizeof (apt) / sizeof (POINT))����ʾ���ֵ��Polyline��һ��MoveToEx��ʽ����Ӽ���LineTo��ʽ��Ч����ͬ�����ǣ�Polyline�Ȳ�ʹ��Ҳ���ı�Ŀǰλ�á�PolylineTo��Щ��ͬ�������ʽʹ��Ŀǰλ����Ϊ��ʼ�㣬����Ŀǰλ���趨Ϊ����һ���ߵ��յ㡣����ij�ʽ�ë»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê¾Ò»ï¿½ï¿½ï¿½Ä¾ï¿½ï¿½Î£ï¿½
MoveToEx (hdc, apt[0].x, apt[0].y, NULL) ; PolylineTo (hdc, apt + 1, 4) ;
�����ԶԼ�����ʹ��Polyline��PolylineTo����Щ��ʽ�ڻ��Ƹ��������������ˡ���ʹ���ɼ���������ǧ������ɵļ����߶Σ�����������һ�����һ������һ�������磬�����Ҳ����������ģ���ʽ5-2��ʾ��SINEWAVE��ʽ��ʾ�����������һ�㡣
��ʽ5-2 SINEWAVE SINEWAVE.C /*------------------------------------------------------------------- SINEWAVE.C -- Sine Wave Using Polyline (c) Charles Petzold, 1998 ---------------------------------------------------------------------*/ #include <windows.h> #include <math.h> #define NUM 1000 #define TWOPI (2 * 3.14159) LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("SineWave") ; 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 ("Sine Wave Using Polyline"), 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 cxClient, cyClient ; HDC hdc ; int i ; PAINTSTRUCT ps ; POINT apt [NUM] ; switch (message) { case WM_SIZE: cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; return 0 ; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; MoveToEx (hdc, 0, cyClient / 2, NULL) ; LineTo (hdc, cxClient, cyClient / 2) ; for (i = 0 ; i < NUM ; i++) { apt[i].x = i * cxClient / NUM ; apt[i].y = (int) (cyClient / 2 * (1 - sin (TWOPI * i / NUM))) ; } Polyline (hdc, apt, NUM) ; return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
�����ʽ��һ������1000��POINT�ṹ�����С�����for��Ȧ��0���ӵ�999���ṹ��x��Ա�趨Ϊ��0��������ֵcxClient���ṹ��y��Ա�趨Ϊһ�����ڵ���������ֵ�������Ŵ���������ʾ�����������ߵĻ��ƽ���ʹ����һ��Polyline���С���ΪPolyline��ʽ����װ��������ʽ�����ʵ���ģ������Ҫ�Ⱥ���1000��LineTo��ö࣬�����ͼ5-5��ʾ��
ͼ5-5 SINEWAVE��ʾ |
�߽��ʽ
��
�����������۵���Arc��ʽ����������Բ���ߡ�Ȼ���������������һ��Ellipse��ʽ����ôArc��ʽ���������⣻�������������Rectangle��ʽ����ôEllipse��ʽ�ֽ��������⣻���������Ellipse��Rectangle��ʽ����ô���ֻ�����RoundRect��Chord��Pie��ʽ��
������춣�Rectangle��Ellipse��RoundRect��Chord��Pie��ʽ�ϸ���˵���ǻ��ߺ�ʽ��û������Щ��ʽ���ڻ��ߣ�������ͬʱ�����ë»Ë¢ï¿½ï¿½ï¿½ï¿½Ò»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ë¢ï¿½Ú¶ï¿½Îªï¿½ï¿½É«ï¿½ï¿½ï¿½ï¿½Ëµï¿½ï¿½ï¿½ï¿½ï¿½Ò»ï¿½ï¿½Ê¹ï¿½ï¿½ï¿½ï¿½Ð©ï¿½ï¿½Ê½Ê±ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ü²ï¿½ï¿½ï¿½×¢ï¿½âµ½ï¿½ï¿½ï¿½Ç²ï¿½Ö»ï¿½Ç»ï¿½ï¿½ß¡ï¿½ï¿½Ï¸ï¿½ï¿½Ëµï¿½ï¿½ï¿½ï¿½Ð©ï¿½ï¿½Ê½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½æ¡¸ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ò¡¹µï¿½Ð¡ï¿½Ú£ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ò»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç¡ï¿½
�����ᵽ�ĺ�ʽ��һ����ͬ���ԣ������Ƕ�������һ�����α߽������ͼ�ġ�������һ������������Ŀ򣬼����߽��(bounding box)����Windows����������ڻ����������
��Щ��ʽ����򵥵ľ��ǻ�һ�����Σ�
Rectangle (hdc, xLeft, yTop, xRight, yBottom) ;
��(xLeft, yTop)�Ǿ��ε����Ͻǣ�(xRight, yBottom)�Ǿ��ε����½ǡ��ú�ʽRectangle������ͼ����ͼ5-6��ʾ�����εı�����ƽ������ʾ����ˮƽ�ʹ�ֱ�ߡ�
��
ͼ5-6 ʹ��Rectangle��ʽ������ͼ�� |
��ǰд��ͼ�γ�ʽ�ij�ʽд������Ϥͼ��ƫ������⡣��Щͼ��ϵͳ������ͼ�ΰ���������͵����꣬����Щ��ֻ����������������������͵����ꡣWindows������һ�ַ�����������һ�ָ��򵥵ķ�����˼��������⡣
��������ĺ�ʽ���У�
Rectangle (hdc, 1, 1, 5, 4) ;
���������ᵽ��Windows�ڱ߽���ڻ�ͼ�����Խ���ʾ�������һ���������У�ÿ��ͼ�ض���һ������Ԫ�ڡ��߽���������ϣ�Ȼ���ڱ߽���ڻ����Σ�����˵����ͼ�λ�����ʱ�����ӣ�
��
�����κ���ʾ�������ϽǷֿ���������l��ͼ�ؿ��� |
����ǰ�ᵽ����Rectangle�ϸ��˵���ǻ��ߺ�ʽ��GDIҲ����������Ȼ������Ϊ�ڶ��ð�ɫ�����������GDI�������򲢲����ԡ�
��֪������λ����Σ�Ҳ��֪������λ���Բ����Ϊ����ʹ�õIJ���������ͬ�ģ�
Ellipse (hdc, xLeft, yTop, xRight, yBottom) ;
��Ellipse��ʽ������ͼ����ͼ5-7��ʾ�����������߹��ɵı߽�򣩡�
��
ͼ5-7 ��Ellipse��ʽ������ͼ�� |
��Բ�Ǿ��εĺ�ʽʹ���뺯ʽRectangle��Ellipse��ʽ��ͬ�ı߽�򣬻�������������������
RoundRect ( hdc, xLeft, yTop, xRight, yBottom, xCornerEllipse, yCornerEllipse) ;
�������ʽ������ͼ����5-8��ʾ��
��
ͼ5-8 ��RoundRect��ʽ������ͼ�� |
Windowsʹ��һ��С��Բ����Բ�ǣ������Բ�Ŀ�ΪxCornerEllipse����ΪyCornerEllipse�������������С��Բ��Ϊ���ĸ����֣�һ������һ����ÿ���պ����ھ��ε�һ�����ϡ� xCornerEllipse��yCornerEllipse��ֵԽ�󣬽Ǿ�Խ���ԡ����xCornerEllipse���xLeft��xRight�IJ��yCornerEllipse���yTop��yBottom�IJ��ôRoundRect��ʽ������һ����Բ��
�ڻ���ͼ5-8��ʾ��Բ�Ǿ���ʱ����������Ĺ�ʽ�����������Բ�ijߴ硣
xCornerEllipse = (xRight - xLeft) / 4 ; yCornerEllipse = (yBottom- yTop) / 4 ;
����һ�ּ򵥵ķ��������ǽ���������е㲻�Ծ�����Ϊ�ǵ����������ھ��γ���һ��Ҫ��Щ��Ҫ������һ���⣬��������xCornerEllipse��yCornerEllipse��ֵ��ȡ�
Arc��Chord��Pie��ʽ��ֻҪ��ͬ�IJ�����
Arc (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) ; Chord (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) ; Pie (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) ;
��Arc��ʽ����������ͼ5-9��ʾ����Chord��Pie��ʽ�������߷ֱ���ͼ5-10��5-11��ʾ��Windows��һ��������߽�(xStart, yStart)����Բ���������ӣ��Ӹ�����߽��Ľ��㿪ʼ�� Windows����ʱ�뷽��������Բ��һ������Windows������һ��������߽�(xEnd��yEnd)����Բ���������ӣ��ڸ�����߽��Ľ��㴦��Windowsֹͣ������
��
ͼ5-9 Arc��ʽ�������� |
��
ͼ5-10 Chord��ʽ�������� |
��
ͼ5-11 Pie��ʽ�������� |
���Arc��ʽ�������ͽ����ˡ���Ϊ��ֻ��һ����Բ�ε��߶��ѣ�������һ���������򡣶��Chord��ʽ��Windows���ӻ��ߵĶ˵㡣�����Pie��ʽ��Windows�����������˵�����Բ�����������ӡ���������ͼ���ڲ���Ŀǰ��ˢ���롣
�����ܲ�̫������Arc��Chord��Pie��ʽ�п�ʼ�ͽ���λ�õ��÷���Ϊʲô���򵥵�����Բ��������ָ����ʼ�ͽ������أ��ǵģ���������ô���������������ò������Щ�㡣Windows�ķ����ڲ�Ҫ�����־�ȷ�Ե������£�ȴ�������ͬ�Ĺ�����
��ʽ5-3 LINEDEMO��һ�����Ρ�һ����Բ��һ��Բ�Ǿ��κ������߶Σ��������ǰ���һ˳�򡣳�ʽ�����˶���������ĺ�ʽʵ���϶���Щ������������룬��Ϊ����Բ������߱���ס�ˣ������ͼ5-12����ʾ��
��ʽ5-3 LINEDEMO LINEDEMO.C /*--------------------------------------------------------- LINEDEMO.C -- Line-Drawing Demonstration Program (c) Charles Petzold, 1998 ----------------------------------------------------------*/ #include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("LineDemo") ; 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 ("Line Demonstration"), 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 cxClient, cyClient ; HDC hdc ; PAINTSTRUCT ps ; switch (message) { case WM_SIZE: cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; return 0 ; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; Rectangle (hdc, cxClient / 8, cyClient / 8, 7 * cxClient / 8, 7 * cyClient / 8) ; MoveToEx (hdc, 0, 0, NULL) ; LineTo (hdc, cxClient, cyClient) ; MoveToEx (hdc, 0, cyClient, NULL) ; LineTo (hdc, cxClient, 0) ; Ellipse (hdc, cxClient / 8, cyClient / 8, 7 * cxClient / 8, 7 * cyClient / 8) ; RoundRect (hdc, cxClient / 4, cyClient / 4, 3 * cxClient / 4, 3 * cyClient / 4, cxClient / 4, cyClient / 4) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
��
ͼ5-12 LINEDEMO��ʾ |
����������
��
�����ߡ�����ʴ�ǰָ����һƬľͷ����Ƥ���߽�����������ֽ�ϻ����ߡ�����˵���������һЩ��ͬͼ�㣬����Ҫ������֮�ä»Ò»ï¿½ï¿½ï¿½ï¿½ï¿½ß£ï¿½ï¿½Ú²ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½å£©ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½È½ï¿½ï¿½ï¿½Ð©ï¿½ï¿½ï¿½ï¿½ï¿½Ú»ï¿½Í¼Ö½ï¿½Ï£ï¿½È»ï¿½á£¬ï¿½ï¿½ï¿½ï¿½ï¿½ß¶ï¿½ï¿½ï¿½ï¿½ï¿½Ð©ï¿½ï¿½ï¿½Ï£ï¿½ï¿½ï¿½ï¿½ï¿½Ç¦ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ð©ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ä·ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ß¡ï¿½
��Ȼ��ʱ�����գ������Ѿ���ѧ��ʽ���ˡ��кܶ��ֲ�ͬ�����߹�ʽ�����Ǹ���ǧ������������ǵ��Գ�ʽ������õ��������߹�ʽ֮һ������ֱ������żӵ���ҵϵͳ��ε�ͼ��֧Ԯ�еġ�����ʮ���Renault������˾���������ֹ���Ƴ��壨Ҫ�õ�ճ���������Ը�����Ƶ�ת�䡣������ҪһЩ��ѧ���ߣ���Pierm Bezier�ҵ���һ�׹�ʽ��������ʾ�����׹�ʽӦ�������Ĺ����dz����á�
���ᣬ��ά�ı��������߳��˵���ͼѧ�������õ����ߣ���ֱ�ߺ���Բ֮�ᣩ����PostScript�У��������߶��ñ��������߱�ʾ����Բ���ñ������������ƽ�������������Ҳ��춶���PostScript�������Ԫ������TrueTypeʹ��һ�ָ��򵥸����ٵ����߹�ʽ����
һ����ά�ı������������ĸ��㶨�å£ï¿½ï¿½ï¿½ï¿½ï¿½Ëµï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Æµã¡£ï¿½ï¿½ï¿½ßµÄ¶Ëµï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ëµï¿½ï¿½Ï£ï¿½ï¿½ï¿½ï¿½Æµï¿½Íºï¿½ï¿½ñ¡¸´ï¿½Ê¯ï¿½ï¿½Ò»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ß´ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ëµï¿½ï¿½ï¿½Ö±ï¿½ß´ï¿½ï¿½ï¿½ï¿½ß¡ï¿½ï¿½ï¿½Ò»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Éµï¿½ï¿½Âµï¿½BEZIER������̸��ʽ������õ�չʾ�����ʽ5-4��ʾ��
��ʽ5-4 BEZIER BEZIER.C /*----------------------------------------------------------------------- BEZIER.C -- Bezier Splines Demo (c) Charles Petzold, 1998 ------------------------------------------------------------------------*/ #include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("Bezier") ; 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 ("Bezier Splines"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } void DrawBezier (HDC hdc, POINT apt[]) { PolyBezier (hdc, apt, 4) ; MoveToEx (hdc, apt[0].x, apt[0].y, NULL) ; LineTo (hdc, apt[1].x, apt[1].y) ; MoveToEx (hdc, apt[2].x, apt[2].y, NULL) ; LineTo (hdc, apt[3].x, apt[3].y) ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static POINT apt[4] ; HDC hdc ; int cxClient, cyClient ; PAINTSTRUCT ps ; switch (message) { case WM_SIZE: cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; apt[0].x = cxClient / 4 ; apt[0].y = cyClient / 2 ; apt[1].x = cxClient / 2 ; apt[1].y = cyClient / 4 ; apt[2].x = cxClient / 2 ; apt[2].y = 3 * cyClient / 4 ; apt[3].x = 3 * cxClient / 4 ; apt[3].y = cyClient / 2 ; return 0 ; case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_MOUSEMOVE: if (wParam & MK_LBUTTON || wParam & MK_RBUTTON) { hdc = GetDC (hwnd) ; SelectObject (hdc, GetStockObject (WHITE_PEN)) ; DrawBezier (hdc, apt) ; if (wParam & MK_LBUTTON) { apt[1].x = LOWORD (lParam) ; apt[1].y = HIWORD (lParam) ; } if (wParam & MK_RBUTTON) { apt[2].x = LOWORD (lParam) ; apt[2].y = HIWORD (lParam) ; } SelectObject (hdc, GetStockObject (BLACK_PEN)) ; DrawBezier (hdc, apt) ; ReleaseDC (hwnd, hdc) ; } return 0 ; case WM_PAINT: InvalidateRect (hwnd, NULL, TRUE) ; hdc = BeginPaint (hwnd, &ps) ; DrawBezier (hdc, apt) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
��������ʽҪ�õ�һЩ�ڵ����²Ž��Ļ�������ʽ�������Ҳ����������������ڲ���������������Ҳ�Ǽ򵥵ģ��������������ʽ��ʵ���Եز��ݱ��������ߡ��������ʽ�У����������趨����ʾ��������¾��С�����λ�1/4��3/4����λ�ã��������Ƶ���Ըı䣬��ס����������Ҽ����϶�������Էֱ�Ķ��������Ƶ�֮һ��ͼ5-13��һ�����͵����ӡ�
���˱��������߱�������ʽ���ӵ�һ�����Ƶ�����ߵĵ�һ���˵㣨Ҳ������ʼ�㣩��һ��ֱ�ߣ����ӵڶ������Ƶ����ұߵĶ˵ã»Ò»ï¿½ï¿½Ö±ï¿½ß¡ï¿½
������漸���ص㣬�����������ڵ��Ը�������зdz����á����ȣ�����������ϰ���Ϳ��԰����ߵ���������Ҫ����״�dz��ӽ���
��
ͼ5-13 BEZIER��ʽ����ʾ |
��Σ����������߷dz��ÿ��ơ�����е�����������˵�����߲������κ�һ����������ߵĵ㡣�����������������������˵㿪ʼ�ͽ����ģ��������Ƶ���������ʽʱ�����ļ���֮һ�������⣬��Щ��ʽ�����߹�ʽ������㣬����Щ�㴦������������Զ�����ڵ��Ը��������ͨ���Ǻܲ����ʵġ���ʵ�ϣ��������������������һ���ı��Σ�������͹������������ı����ɶ˵�Ϳ��Ƶ����Ӷ��ɡ�
�������ص��漰�˵�Ϳ��Ƶ�֮��Ĺ�ϵ�������������һ�����Ƶ㵽����ֱ�����У�������ͬһ����ͬʱ��Ҳ��ڶ������Ƶ㵽�յ��ֱ�����У�������ͬһ������������Ƶ���������ʽʱ�����������������衣
���ģ�����������ͨ���ȽϾ������С���֪������һ���������۵����⣬����������ֻ���Ҳ������롣
��32λԪ��Windows�汾֮ǰ������������Polyline���Լ��������������ߣ����һ���Ҫ֪������ı��������ߵIJ������̡������( x0,y0)���յ���( x3,y3)���������Ƶ���(x1,y1)��(x2,y2)������t��ֵ��0��1�ı仯���Ϳ��Ի������ߣ�
x(t) = (1 - t)3 x0 + 3t (1 - t)2 x1 + 3t2 (1 - t) x2 + t3 x3 y(t) = (1 - t)3 y0 + 3t (1 - t)2 y1 + 3t2 (1 - t) y2 + t3 y3
��Windows 98�У�������Ҫ֪����Щ��ʽ��Ҫ��һ����������ӵı��������ߣ�ֻ����У�
PolyBezier (hdc, apt, iCount) ;
��
PolyBezierTo (hdc, apt, iCount) ;
��������£�apt����POINT�ṹ�����С���PolyBezier��ǰ�ĸ��㣨����˳�򣩸������������ߵ���㡢��һ�����Ƶ㡢�ڶ������Ƶ���յ㡣�����ÿһ������������ֻ����������㣬��Ϊ��һ�����������ߵ�������ǰһ�����������ߵ��յ㣬������ơ�iCount�������1�����������Ƶ���Щ��β�������������������
PolyBezierTo��ʽʹ��Ŀǰ����Ϊ��һ����㣬��һ���Լ������ı��������߶�ֻ��Ҫ���������㡣����ʽ����ʱ��Ŀǰ���趨Ϊ����һ���յ㡣
һ����ʾ���ڻ�һϵ�������ı���������ʱ��ֻ�е���һ�����������ߵĵڶ������Ƶ㡢��һ�����������ߵ��յ㣨Ҳ���ǵڶ������ߵ���㣩�͵ڶ������������ߵĵ�һ�����Ƶ��������ʱ��Ҳ����˵����������ͬһ��ֱ����ʱ�����������ӵ㴦���ǹ⻬�ġ�
ʹ�����л��ʣ�Stock Pens��
��
����������һ�������۵��κλ��ߺ�ʽʱ��Windowsʹ��װ��������Ŀǰѡ�еġ����ʡ������ߡ����ʾ����ߵ�ɫ�ʡ����Ⱥͻ�����ʽ��������ʽ������ʵ�ߡ��㻮�߻������ߣ��ڶ�װ�������л���ΪBLACK_PEN������ӳ�䷽ʽ��ʲô�����ֻ��ʶ�����һ��ͼ�ؿ��ĺ�ɫʵ������BLACK_PEN��Windows�ṩ���������л���֮һ������������WHITE_PEN��NULL_PEN��NULL_PENʲô����������Ҳ�����Լ��Զ����ʡ�
Windows��ʽ�Դ�����ʹ�û��ʡ� Windows��ͷ����WINDEF.H�а���һ������HPEN����̬���壬�����ʵĴ��ţ����Զ��������̬�ı���������hPen����
HPEN hPen ;
����GetStockObject�����Ի�����л��ʵĴ��š����磬��������ʹ����ΪWHITE_PEN�����л��ʣ���������ȡ�û��ʵĴ��ţ�
hPen = GetStockObject (WHITE_PEN) ;
���ڱ��뽫����ѡ��װ�����ݣ�
SelectObject (hdc, hPen) ;
Ŀǰ�Ļ����ǰ�ɫ������������ᣬ�������߽�ʹ��WHITE_PEN��ֱ����������һ������ѡ��װ�����ݻ����ͷ�װ�����ݴ���Ϊֹ��
��Ҳ���Բ�����hPen����������GetStockObject��SelectObject���кϲ���һ��������
SelectObject (hdc, GetStockObject (WHITE_PEN)) ;
�����ָ���ʹ��BLACK_PEN��״̬��������һ������ȡ�����ֻ��ʵĴ��ţ�������ѡ��װ�����ݣ�
SelectObject (hdc, GetStockObject (BLACK_PEN)) ;
SelectObject�Ĵ���ֵ�Ǵ˺���ǰװ�������еĻ��ʴ��š��������һ���µ�װ�����ݲ�����
hPen = SelectObject (hdc, GetStockobject (WHITE_PEN)) ;
��װ�������е�Ŀǰ���ʽ�ΪWHITE_PEN������hPen������BLACK_PEN�Ĵ��š�����ͨ������
SelectObject (hdc, hPen) ;
���ܹ���BLACK_PENѡ��װ�����ݡ�
���ʵĽ�����ѡ���ɾ��
��
����ʹ�����л��ʷdz����㣬��ȴ�����ʵ�ĵĺڻ��ʡ�ʵ�ĵİ׻��ʻ���û�л�������������������õ����ḻ��ʵ�Ч�����ͱ��뽨���Լ��Ļ��ʡ�
��һ����ͨ���ǣ�ʹ�ú�ʽCreatePen��CreatePenIndirect����һ�����߼����ʡ���������ǶԻ��ʵ���������Щ��ʽ�����߼����ʵĴ��ţ�Ȼ�ᣬ����SelectObject������ѡ��װ�����ݡ����ڣ��Ϳ���ʹ���µĻ����������ˡ����κ�ʱ�򣬶�ֻ����һ�ֻ���ѡ��װ�����ݡ����ͷ�װ�����ݣ�������ѡ������һ�ֻ��ʵ�װ�������У�֮�ᣬ�Ϳ��Ժ���DeleteObject��ɾ�����������߼������ˡ���ɾ���ᣬ�û��ʵĴ��žͲ�����Ч�ˡ�
�߼�������һ�֡�GDI����������������Խ���������GDI���֮һ�����������ǻ�ˢ������ͼ����������͵�ɫ�̡����˵�ɫ��֮�⣬��Щ�������ͨ��SelectObjectѡ��װ�����ݵġ�
��ʹ�û��ʵ�GDI���ʱ��Ӧ������������������
��Щ����Ȼ���е����ģ�������ʱ�������ͦ΢��ġ��������ǽ���Щ����������������Щ����
CreatePen��ʽ���﷨���磺
hPen = CreatePen (iPenStyle, iWidth, crColor) ;
���У�iPenStyle����ȷ��������ʵ�ߡ����߻������ߣ��ò���������WINGDI.H��ͷ�����ж��������ʶ���֣�ͼ5-14��ʾ��ÿ�ֻ��ʲ����Ļ�����ʽ��
��
ͼ5-14 ���ֻ�����ʽ |
���PS_SOLID��PS_NULL��PS_INSIDEFRAME������ʽ��iWidth�����ǻ��ʵĿ��ȡ�iWidthֵΪ0����ζ�����ʿ���Ϊһ��ͼ�ء����л�����һ��ͼ�ؿ������ָ�����ǵ㻮�߻�������ʽ������ʽ��ͬʱ��ָ��һ�����1��ʵ�ʿ��ȣ���ôWindows��ʹ��ʵ�߻��������档
CreatePen��crColor������һ��COLORREFֵ����ָ�����ʵ���ɫ����춳���PS_INSIDEFRAME֮��Ļ�����ʽ�����������ѡ��װ�������У�Windows�Ὣ��ɫת��Ϊ�豸���ܱ�ʾ��������Ĵ�ɫ��PS_INSIDEFRAME��Ψһһ�ֿ���ʹ�û�ɫ�Ļ�����ʽ������ֻ���ڿ��ȴ��1������²���ˡ�
���붨��һ����������ĺ�ʽһ��ʹ��ʱ��PS_INSIDEFRAME������ʽ��������һ������֮������춳���PS_INSIDEFRAME��������л�����ʽ��˵������������߽��Ļ��ʿ��ȴ��1��ͼ�أ���ô���ʽ����ж����ڱ߽�����ϣ������߽���ߵ�һ���ֽ�λ춱߽��֮�⣻�����PS_INSIDEFRAME������ʽ��˵�������߽���߶����ڱ߽��֮�ڡ�
��Ҳ����ͨ������һ����̬ΪLOGPEN�����߼����ʡ����Ľṹ��������CreatePenIndirect���������ʡ�������ij�ʽʹ����������Ôʼ���г�ʼ���Ļ��ʣ���ôʹ�����ַ�������Ч�öࡣ
Ҫʹ��CreatePenIndirect�����ȶ���һ��LOGPEN��̬�Ľṹ��
LOGPEN logpen ;
�˽ṹ��������Ա��lopnStyle����������������UINT���ǻ�����ʽ��lopnWidth��POINT�ṹ���ǰ��߼���λ�����Ļ��ʿ��ȣ�lopnColor (COLORREF)�ǻ�����ɫ��Windowsֻʹ��lopnWidth�ṹ��xֵ��Ϊ���ʿ��ȣ�������yֵ��
���ṹ��λַ���ݸ�CreatePenIndirect�ṹ�Ϳ��Խ��������ˣ�
hPen = CreatePenIndirect (&logpen) ;
ע�⣬CreatePen��CreatePenIndirect��ʽ����Ҫװ�����ݴ�����Ϊ��������Щ��ʽ������װ������û����ϵ���߼����ʡ�ֱ������SelectObject֮�ᣬ���ʲ���װ�����ݷ�����ϵ����ˣ����ԶԲ�ͬ���豸����өĻ��ӡ������ʹ����ͬ���߼����ʡ�
�����ǽ�����ѡ���ɾ�����ʵ�һ�ַ������������ij�ʽʹ�����ֻ��ʣ�һ�ֿ���Ϊ1�ĺڻ��ʡ�һ�ֿ���Ϊ3�ĺì»ï¿½Êºï¿½Ò»ï¿½Öºï¿½É«ï¿½ï¿½Ê½ï¿½ï¿½ï¿½Ê£ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½È¶ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ð©ï¿½ï¿½ï¿½ÊµÄ´ï¿½ï¿½Å£ï¿½
static HPEN hPen1, hPen2, hPen3 ;
�ڴ���WM_CREATE�ڼ䣬�����Խ��������ֻ��ʣ�
hPen1 = CreatePen (PS_SOLID, 1, 0) ; hPen2 = CreatePen (PS_SOLID, 3, RGB (255, 0, 0)) ; hPen3 = CreatePen (PS_DOT, 0, 0) ;
�ڴ���WM_PAINT�ڼ䣬��������ӵ��һ��װ��������Ч���ŵ��κ�ʱ����������Խ�����������֮һѡ��װ�����ݲ����������ߣ�
SelectObject (hdc, hPen2) ;
���ߺ�ʽ
SelectObject (hdc, hPen1) ;
�������ߺ�ʽ
�ڴ���WM_DESTROY�ڼ䣬������ɾ�������������ֻ��ʣ�
DeleteObject (hPen1) ; DeleteObject (hPen2) ; DeleteObject (hPen3) ;
���ǽ�����ѡ���ɾ��������ֱ�ӵķ������������ij�ʽ����֪��ִ���ڼ���Ҫ��Щ�߼����ʣ�Ϊ�ˣ���������Ҫ��ÿ��WM_PAINTѶϢ�����ڼ佨�����ʣ����ں���EndPaint֮��ɾ�����ǣ��������ں���EndPaint֮ǰɾ�����ǣ�����ҪС�ģ���Ҫɾ��װ��������Ŀǰѡ��Ļ��ʣ���
�����ܻ�ϣ����ʱ�������ʣ�����CreatePen��SelectObject������ϵ�ͬһ�������У�
SelectObject (hdc, CreatePen (PS_DASH, 0, RGB (255, 0, 0))) ;
�����ٿ�ʼ���ߣ�����ʹ��һ����ɫ���߻��ʡ��ڻ����ɫ����֮�ᣬ����ɾ�����ʡ����ˣ����û�б��æ»ï¿½Ê´ï¿½ï¿½Å£ï¿½ï¿½ï¿½Ã´ï¿½ï¿½ï¿½ï¿½É¾ï¿½ï¿½ï¿½ï¿½Ð©ï¿½ï¿½ï¿½ï¿½ï¿½Ø£ï¿½ï¿½ï¿½Òªï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½×¡ï¿½ï¿½SelectObject������װ����������һ��ѡ��Ļ��ʴ��š����ԣ�������ͨ������SelectObject��BLACK_PENѡ��װ�����ݣ���ɾ����SelectObject���ص�ֵ��
DeleteObject (SelectObject (hdc, GetStockObject (BLACK_PEN))) ;
��������һ�ַ������ڽ��½����Ļ���ѡ��װ������ʱ������SelectObject���صĻ��ʴ��ţ�
hPen = SelectObject (hdc, CreatePen (PS_DASH, 0, RGB (255, 0, 0))) ;
����hPen��ʲô�أ����������ȡ��װ������֮���һ�κ���SelectObject����hPen��BLACK_PEN����Ĵ��š����ڣ����Խ�hPenѡ��װ�����ݣ���ɾ���������Ļ��ʣ��ڶ���SelectObject���д��صĴ��ţ���ֻҪһ���������ɣ�
DeleteObject (SelectObject (hdc, hPen)) ;
�����һ�����ʵĴ��ţ��Ϳ���ͨ������GetObjectȡ��LOGPEN�ṹ������Ա��ֵ��
GetObject (hPen, sizeof (LOGPEN), (LPVOID) &logpen) ;
�����ҪĿǰѡ��װ�����ݵĻ��ʴ��ţ����Ժ��У�
hPen = GetCurrentObject (hdc, OBJ_PEN) ;
�ڵ�ʮ���½�������һ���������ʵĺ�ʽExtCreatePen��
�����϶
��
ʹ�õ�ʽ���ʺ����߻��ʻ����һ����Ȥ�����⣺�������֮��Ŀ�϶�������أ�������Ҫ����ʲô��
��϶����ɫȡ���װ�����ݵ��������ԣ�����ģʽ�ͱ�����ɫ���ڶ�����ģʽΪOPAQUE�������ַ�ʽ�£�Windowsʹ�ñ���ɫ�������϶���ڶ��ı���ɫΪ��ɫ�����������ʽ���Ӵ��������WHITE_BRUSH�������Ӵ�������������һ�µġ�
������ͨ�����º������ı�Windows���������϶�ı���ɫ��
SetBkColor (hdc, crColor) ;
�ë»ï¿½ï¿½É«ï¿½ï¿½ï¿½ï¿½Ê¹ï¿½Ãµï¿½crColor����һ����Windows������ı���ɫת��Ϊ��ɫ������ͨ����GetBkColor��ȡ��װ�������ж����Ŀǰ����ɫ��
ͨ��������ģʽת��ΪTRANSPARENT��������ֹWindows�����϶��
SetBkMode (hdc, TRANSPARENT) ;
���ᣬWindows�����Ա���ɫ�����Ҳ������϶������ͨ������GetBkMode��ȡ��Ŀǰ����ģʽ��TRANSPARENT����OPAQUE����
��ͼ��ʽ
��
װ�������ж���Ļ�ͼ��ʽҲӰ����ʾ���������ߵ���ۡ����ë»ï¿½ï¿½ï¿½ï¿½Ò»ï¿½ï¿½Ö±ï¿½ß£ï¿½ï¿½ï¿½ï¿½ï¿½É«ï¿½ï¿½ï¿½É»ï¿½ï¿½ï¿½É«ï¿½ÊºÍ»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ô����ɫ�ʹ�ͬ������������ͬһ�ֻ����ڰ�ɫ�����ϻ������߶��ں�ɫ�����ϻ������ߣ����Ҳ���֪��������ʲôɫ�ʡ������Ĺ��ܶ���������ͨ����ͼ��ʽ���趨����Щ������ʵ����
��Windowsʹ�û���������ʱ����ʵ����ִ�л���ͼ����Ŀ��λ�ô�Ô��ͼ��֮���ij��λԪ�������㡣ͼ�ؼ��λԪ�������������λԪӳ�����㡹�����Ϊ��ROP������춻�һ��ֱ��ֻ�漰����ͼ�أ����ʺ�Ŀ�꣩��������ֲ��������ֳ�Ϊ����ԪλԪӳ�����㡹�����Ϊ��ROP2����Windows������16��ROP2���룬��ʾWindows��ϻ���ͼ�غ�Ŀ��ͼ�صķ�ʽ�����ڶ�װ�������У���ͼ��ʽ����ΪR2_COPYPEN�������Windowsֻ�ǽ�����ͼ�ظ��Ƶ�Ŀ��ͼ�أ���Ҳ������ͨ������֪�ġ����⣬����15��ROP2�롣
16�ֲ�ͬ��ROP2���������������أ�Ϊ��ʾ������Ҫ�����Ǽ���ʹ�õ�ɫϵͳ��Ŀ��ɫ���Ӵ���ʾ�����ɫ�ʣ�Ϊ��ɫ����0����ʾ�����߰�ɫ����1����ʾ��������Ҳ����Ϊ��ɫ���߰�ɫ���ú�ɫ���߰�ɫ�����ں�ɫ���߰�ɫĿ���ϻ�ͼ��������ϣ��ױ����Ŀ�ꡢ�ױ����Ŀ�ꡢ�ڱ����Ŀ�ꡢ�ڱ����Ŀ�ꡣ
������Ŀ���ϻ������õ�ʲô�أ�һ�ֿ����Dz��ܻ��ʺ�Ŀ���ɫ�ʣ������������Ǻ�ɫ�ģ����ֻ�ͼ��ʽ��ROP2����R2_BLACK��ʾ����һ�ֿ�����ֻ�е�������Ŀ�궼Ϊ��ɫʱ�������Ľ�����ǰ�ɫ����������»����Ķ��Ǻ�ɫ���������ƺ���Щ��֣�Windows����Ϊ���ַ�ʽ����һ�����֣�����R2_NOTMERGEPEN��Windowsִ��Ŀ��ͼ���ë»ï¿½ï¿½Í¼ï¿½Øµï¿½Î»Ôªï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ã£¬È»ï¿½á·×ªï¿½ï¿½ï¿½ï¿½É«ï¿½Ê¡ï¿½
��5-2��ʾ������16��ROP2��ͼ��ʽ������ָʾ�˻���ɫ��(P)��Ŀ��ɫ��(D)�������϶��ɽ��ɫ�ʵġ��ڱ��С����ֲ���������һ���У���C���Եı�ʾ��������Ŀ��ͼ���ë»ï¿½ï¿½Í¼ï¿½Øµï¿½ï¿½ï¿½Ï·ï¿½Ê½ï¿½ï¿½
��5-2 |
���� (P): Ŀ�� (D): | 1 1 | 1 0 | 0 1 | 0 0 | ���� ���� | ��ͼģʽ |
---|---|---|---|---|---|---|
����� | 0 | 0 | 0 | 0 | 0 | R2_BLACK |
0 | 0 | 0 | 1 | ~(P | D) | R2_NOTMERGEPEN | |
0 | 0 | 1 | 0 | ~P & D | R2_MASKNOTPEN | |
0 | 0 | 1 | 1 | ~P | R2_NOTCOPYPEN | |
0 | 1 | 0 | 0 | P & ~D | R2_MASKPENNOT | |
0 | 1 | 0 | 1 | ~D | R2_NOT | |
0 | 1 | 1 | 0 | P ^ D | R2_XORPEN | |
0 | 1 | 1 | 1 | ~(P & D) | R2_NOTMASKPEN | |
1 | 0 | 0 | 0 | P & D | R2_MASKPEN | |
1 | 0 | 0 | 1 | ~(P ^ D) | R2_NOTXORPEN | |
1 | 0 | 1 | 0 | D | R2_NOP | |
1 | 0 | 1 | 1 | ~P | D | R2_MERGENOTPEN | |
1 | 1 | 0 | 0 | P | R2_COPYPEN���ڶ��� | |
1 | 1 | 0 | 1 | P | ~D | R2_MERGEPENNOT | |
1 | 1 | 1 | 0 | P | D | R2_MERGEPEN | |
1 | 1 | 1 | 1 | 1 | R2_WHITE |
����ͨ�����º�����װ���������趨�µĻ�ͼģʽ��
SetROP2 (hdc, iDrawMode) ;
iDrawMode�����DZ��С���ͼģʽ��һ���и�����ֵ֮һ���������ú�ʽ��
iDrawMode = GetROP2 (hdc) ;
��ȡ��Ŀǰ��ͼ��ʽ��װ�������е��ڶ��趨ΪR2_COPYPEN�����û���ɫ�����Ŀ��ɫ�ʡ���R2_NOTCOPYPEN��ʽ�£�������Ϊ��ɫ���ò»³É°ï¿½É«ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Îªï¿½ï¿½É«ï¿½ï¿½ï¿½ò»³Éºï¿½É«ï¿½ï¿½R2_BLACK��ʽ�£����ܻ��ʺͱ���ɫΪ����ɫ�ʣ����ǻ��ɺ�ɫ������෴��R2_WHITE��ʽ�����ǻ��ɰ�ɫ��R2_NOP��ʽ���ǡ�������������Ŀ�걣�ֲ��䡣
���ڣ������Ѿ������˵�ɫϵͳ��Ȼ���������ϵͳ�Dz�ɫ�ġ��ڲ�ɫϵͳ�У�WindowsΪ���ʺ�Ŀ��ͼ�ص�ÿ����ɫλԪִ�л�ͼ��ʽ��λԪ���㣬���ٴ�ʹ���ϱ�������16��ROP2���롣R2_NOT��ͼ��ʽ���Ƿ�תĿ��ɫ���������ߵ���ɫ�������ܻ��ʵ�ɫ����ʲô�����磬����ɫĿ���ϵ��߻�����ɫ��R2_NOT��ʽ���Dz����ɼ��Ļ��ʣ����ǻ������еȻҶȵı����ϻ�ͼ���ҽ��ڵ����µ�BLOKOUT��ʽ��չʾR2_NOT��ͼ��ʽ��ʹ�á�
������������
��
�����ٸ���һ�����ӻ��ߵ���ͼ�Ρ�Windows���߸�����������Ե������ͼ�εĺ�ʽ��춱�5-3�С�
��5-3 |
��ʽ | ͼ�� |
---|---|
Rectangle | ֱ�Ǿ��� |
Ellipse | ��Բ |
RoundRect | Բ�Ǿ��� |
Chord | ��Բ���ϵĻ��������������� |
Pie | ��Բ�ϵ�Բ��ͼ |
Polygon | ����� |
PolyPolygon | �������� |
Windows��װ��������ѡ���Ŀǰ��������ͼ�εı߽�򣬱߽��ʹ��Ŀǰ������ʽ������ɫ�ʺͻ�ͼ��ʽ�����Windows����ʱһ�������ֱ�ߵ�һ��Ҳ�������Щͼ�εı߽��
ͼ����Ŀǰװ��������ѡ��Ļ�ˢ�����롣�ڶ�����£�ʹ���������������ζ��ͼ���ڲ�����Ϊ��ɫ��Windows�����������л�ˢ��WHITE_BRUSH��LTGRAY_BRUSH��GRAY_BRUSH��DKGRAY_BRUSH��BLACK_BRUSH��NULL_BRUSH ��Ҳ��HOLLOW_BRUSH���������Խ��κ�һ�����л�ˢѡ������װ�������У��ͺ���ѡ��һ�ֻ���һ����Windbws��HBRUSH����Ϊ��ˢ�Ĵ��ţ����Կ����ȶ���һ����ˢ���ű�����
HBRUSH hBrush ;
������ͨ������GetStockObject��ȡ��GRAY_BRUSH�Ĵ��ţ�
hBrush = GetStockObject (GRAY_BRUSH) ;
�����Ժ���SelectObject����ѡ��װ�����ݣ�
SelectObject (hdc, hBrush) ;
���ڣ������Ҫ���ϱ��е���һ��ͼ�Σ������ڲ���Ϊ��ɫ��
������ë»Ò»ï¿½ï¿½Ã»ï¿½Ð±ß½ï¿½ï¿½ï¿½Í¼ï¿½Î£ï¿½ï¿½ï¿½ï¿½Ô½ï¿½NULL_PENѡ��װ�����ݣ�
SelectObject (hdc, GetStockObject (NULL_PEN)) ;
������ë»ï¿½ï¿½Í¼ï¿½ÎµÄ±ß½ï¿½ò£¬µï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ú²ï¿½ï¿½ï¿½ï¿½ï¿½NULL_BRUSHѡ��װ�����ݣ�
SelectObject (hdc, GetStockobject (NULL_BRUSH) ;
��Ҳ�����Զ���ˢ������ͬ���Զ�����һ�������ǽ�����̸��������⡣
Polygon��ʽ�Ͷ�������뷽ʽ
��
���Ѿ����۹���ǰ����������뺯ʽ��Polygon�ǵ����������߽�������ͼ�εĺ�ʽ���ú�ʽ�ĺ�����Polyline��ʽ���ƣ�
Polygon (hdc, apt, iCount) ;
���У�apt������POINT�ṹ��һ�����У�iCount�ǵ����Ŀ������������е�����һ�������һ���㲻ͬ����Windows�����ټ�һ���ߣ�������һ�������һ��������������Polyline��ʽ�У�Windows������ô������PolyPolygon��ʽ������ʾ��
PolyPolygon (hdc, apt, aiCounts, iPolyCount) ;
�ú�ʽ���ƶ������Ρ�����һ�����������������Ķ���εĸ��������ÿ������Σ�aiCounts���и����˶���εĶ˵�����apt���о���ȫ������ε����е㡣������ֵ���⣬PolyPolygon�ڹ�����������Ĵ�����ͬ��
for (i = 0, iAccum = 0 ; i < iPolyCount ; i++) { Polygon (hdc, apt + iAccum, aiCounts[i]) ; iAccum += aiCounts[i] ; }
���Polygon��PolyPolygon��ʽ��Windowsʹ�ö�����װ�������е�Ŀǰ��ˢ������������߽��������������ڲ��ķ�ʽ����ȡ��춶�������뷽ʽ����������SetPolyFillMode��ʽ���趨��
SetPolyFillMode (hdc, iMode) ;
�ڶ�����£���������뷽ʽ��ALTERNATE�����������Խ����趨ΪWINDING�����ַ�ʽ������μ�ͼ5-15��ʾ��
��
ͼ5-15 �����ֶ�������뷽ʽ������ͼ��ALTERNATE���󣩺�WINDING���ң� |
���ȣ�ALTERNATE��WINDING��ʽ֮�����������ײ�������ALTERNATE��ʽ�������������һ�������ķ�������ڲ��ĵã»ï¿½ß£ï¿½Ö»ï¿½Ð¼ï¿½ï¿½ï¿½ï¿½ï¿½ß´ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ß½ï¿½ï¿½ï¿½Ê±ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ÇµÄ½Ç¶ï¿½ï¿½ï¿½ï¿½ï¿½Ã»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ô��
����ǵ�����ʹ��WINDING��ʽ��������ʵ���ϸ���һЩ���ڻ��Ƶ����Ķ����ʱ�� ���������£�WINDING��ʽ���������з�յ����򡣵���Ҳ�����⡣
��WINDING��ʽ��Ҫȷ��һ����������Ƿ����룬���Ծɿ���������Ǹ������������ߡ����������ߴ������������߽��ߣ�����ͱ����룬���ALTERNATE��ʽһ�������������ߴ�����ż�����߽��ߣ���������ܱ�����Ҳ���ܲ������롣���һ���������춼����ߣ��ı߽���������һ������ı߽���������ȣ�����������
���磬����ͼ5-16�е����塣���ϵļ�ͷָ���˻��ߵķ������ַ�ʽ��������������յ�L�����򣬺����1��3������Ϊ4��5������С�ڲ�������ALTERNATE��ʽ�²��ᱻ���롣���ǣ���WINDING��ʽ�£�����Ϊ5������ᱻ���룬��Ϊ�������ڱ��봩��������ͬ������߲��ܵ���ͼ���ⲿ������Ϊ4�����򲻻ᱻ���룬��Ϊ���봩�����������෴���ߡ�
���������Windowsû����ô��������ô��ʽ5-5 ALTWIND��չʾ��������
��
ͼ5-16 WINDING��ʽ�������������ڲ������ͼ�� |
��ʽ5-5 ALTWIND ALTWIND.C /*------------------------------------------------------------------- ALTWIND.C -- Alternate and Winding Fill Modes (c) Charles Petzold, 1998 -------------------------------------------------------------------*/ #include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("AltWind") ; 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 ("Alternate and Winding Fill Modes"), 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 POINT aptFigure [10] = {10,70, 50,70, 50,10, 90,10, 90,50, 30,50, 30,90, 70,90, 70,30, 10,30 }; static int cxClient, cyClient ; HDC hdc ; int i ; PAINTSTRUCT ps ; POINT apt[10] ; switch (message) { case WM_SIZE: cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; return 0 ; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; SelectObject (hdc, GetStockObject (GRAY_BRUSH)) ; for (i = 0 ; i < 10 ; i++) { apt[i].x = cxClient * aptFigure[i].x / 200 ; apt[i].y = cyClient * aptFigure[i].y / 100 ; } SetPolyFillMode (hdc, ALTERNATE) ; Polygon (hdc, apt, 10) ; for (i = 0 ; i < 10 ; i++) { apt[i].x += cxClient / 2 ; } SetPolyFillMode (hdc, WINDING) ; Polygon (hdc, apt, 10) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
ͼ�ε����꣨����Ϊ100��100����λ��������aptFigure�����С���Щ������������ʾ����Ŀ��Ⱥ͸߶Ȼ��ֵġ���ʽ��ʾͼ�����Σ�һ��ʹ��ALTERNATE���뷽ʽ����һ��ʹ��WINDING��ʽ�������ͼ5-17��
��
ͼ5-17 ALTWIND����ʾ |
�û�ˢ�����ڲ�
��
Rectangle��RoundRect��Ellipse��Chord��Pie��Polygon��PolyPolygonͼ�ε��ڲ�����ѡ��װ�����ݵ�Ŀǰ��ˢ��Ҳ��Ϊ��ͼ������������ġ���ˢ��һ��8��8�ĵ���ͼ����ˮƽ�ʹ�ֱ���ظ�ʹ���������ڲ�����
��Windows�û�ɫ�ķ�������ʾ��춿ɴ���ʾ���ϵõ���ɫ��ʱ��ʵ�����ǽ���ˢ���ɫ�ʡ��ڵ�ɫϵͳ�ϣ�Windows�ܹ�ʹ�ú�ɫ�Ͱ�ɫͼ�صĻ�ɫ����64�ֲ�ͬ�Ļ�ɫ������ȷ��˵��Windows�ܹ�����64�ֲ�ͬ�ĵ�ɫ��ˢ����춴���ɫ��8��8����ͼ�е�����λԪ��Ϊ0����һ�ֻ�ɫ��һλԪΪ1���ڶ��ֻ�ɫ����λԪΪ1���Դ����ƣ�ֱ��8��8����ͼ������λԪ��Ϊ1������ǰ�ɫ����16ɫ��256ɫ��ʾϵͳ�ϣ���ɫҲ�ǵ���ͼ�����ҿ��Եõ������ɫ�ʡ�
Windows���������ʽ���������������߼���ˢ��Ȼ��Ϳ�ʹ��SelectObject����ˢѡ��װ�����ݡ����߼�����һ�����߼���ˢҲ��GDI����������������л�ˢ�����뱻ɾ�������ǵ�������װ��������ʱ���ܽ���ɾ����
�����ǽ����߼���ˢ�ĵ�һ����ʽ��
hBrush = CreateSolidBrush (crColor) ;
��ʽ�е�Solid������ָ��ˢΪ��ɫ���ڽ���ˢѡ��װ��������ʱ��Windows����һ����ɫɫ�ĵ���ͼ����Ϊ��ˢʹ�øõ���ͼ��
��������ʹ����ˮƽ����ֱ������б������ɵġ�Ӱ�߱��(hatch marks)����������ˢ�����ַ��Ļ�ˢ����ɫ����ͼ���ڲ����ڻ�ͼ���Ͻ��л�ͼ�����á�����Ӱ�߻�ˢ�ĺ�ʽΪ��
hBrush = CreateHatchBrush (iHatchStyle, crColor) ;
iHatchStyle��������Ӱ�߱�ǵ���ۡ�ͼ5-18��ʾ�����ֿ��õ�Ӱ�߱�Ƿ��
��
ͼ5-18 ����Ӱ�߻�ˢ��� |
CreateHatchBrush�е�crColor������Ӱ�ߵ�ɫ�ʡ��ڽ���ˢѡ��װ������ʱ��Windows������ɫ��ת��Ϊ��֮������Ĵ�ɫ��Ӱ��֮����������װ�������ж���ı�����ʽ�ͱ���ɫ����ɫ�����������ʽΪOPAQUE�����ñ���ɫ����Ҳ��ת��Ϊ��ɫ����������֮��Ŀռ䡣����������£�Ӱ�ߺ�����ɫ�������ǻ�ɫ���ɵ���ɫ�����������ʽΪTRANSPARENT����Windowsֻ����Ӱ�ߣ�����������֮�������
��Ҳ����ʹ��CreatePatternBrush��CreateDIBPatternBrushPt�����Լ��ĵ���ͼ��ˢ��
�����߼���ˢ�ĵ������ʽ���������ĸ���ʽ��
hBrush = CreateBrushIndirect (&logbrush) ;
����logbrush��һ����̬ΪLOGBRUSH�����߼���ˢ�����Ľṹ���ýṹ��������λ���5-4��ʾ��lbStyle��λ��ֵȷ����Windows��ν�������������λ��ֵ��
��5-4 |
lbStyle (UINT) | lbColor (COLORREF) | lbHatch (LONG) |
---|---|---|
BS_SOLID | ��ˢ��ɫ�� | ���� |
BS_HOLLOW | ���� | ���� |
BS_HATCHED | Ӱ�ߵ�ɫ�� | Ӱ�߻�ˢ��� |
BS_PATTERN | ���� | ����ͼ�Ĵ��� |
BS_DIBPATTERNPT | ���� | ָ��DIB��ָ�� |
ǰ��������SelectObject���߼�����ѡ��װ�����ݣ���DeleteObjectɾ�����ʣ���GetObject��ȡ���߼����ʵ���Ѷ����춻�ˢ��ͬ����ʹ����������ʽ��һ����ȡ�õ��˻�ˢ���ţ��Ϳ���ʹ��SelectObject���û�ˢѡ��װ�����ݣ�
SelectObject (hdc, hBrush) ;
Ȼ�ᣬ������ʹ��DeleteObject��ʽɾ���������Ļ�ˢ��
DeleteObject (hBrush) ;
���ǣ���Ҫɾ��Ŀǰѡ��װ�����ݵĻ�ˢ��
�������Ҫȡ�û�ˢ����Ѷ�����Ժ���GetObject��
GetObject (hBrush, sizeof (LOGBRUSH), (LPVOID) &logbrush) ;
���У�logbrush��һ����̬ΪLOGBRUSH�Ľṹ��
GDIӳ�䷽ʽ
��
��ĿǰΪֹ�����еij�ʽ����������ʾ��������Ͻǣ���ͼ��Ϊ��λ��ͼ�ġ������ڶ������������Ψһѡ����ʵ�ϣ���ӳ�䷽ʽ����һ�ּ���Ӱ���κ���ʾ�����ͼ��װ���������ԡ�����������װ���������ԣ��Ӵ�Ô�㡢�Ӳ�Ô�㡢�Ӵ���Χ���Ӳ���Χ����ӳ�䷽ʽ������ء�
�����GDI��ͼ��ʽ��Ҫ����ֵ���С�����磬������TextOut��ʽ��
TextOut (hdc, x, y, psText, iLength) ;
����x��y�ֱ��ʾ���ֵĿ�ʼλ�á�����x����ˮƽ���ϵ�λ�ã�����y���ڴ�ֱ���ϵ�λ�ã�ͨ����(x,y)����ʾ����㡣
��TextOut�У��Լ��ڼ�������GDI��ʽ�У���Щ����ֵʹ�õĶ���һ�֡��߼���λ����Windows���뽫�߼���λת��Ϊ��װ�õ�λ������ͼ�ء�����ת������ӳ�䷽ʽ���Ӵ����Ӳ���Ô���Լ��Ӵ����Ӳ��ķ�Χ�����Ƶġ�ӳ�䷽ʽ��ָʾ��x���y��ķ���(orientation)��Ҳ����˵����ȷ���˵���������ʾ������������ƶ�ʱx��ֵ�������Ǽ�С���Լ��������ƶ�ʱy��ֵ�������Ǽ�С��
Windows������8��ӳ�䷽ʽ��������WINGDI.H����Ӧ��ʶ���ֺͺ������5-5��ʾ��
��5-5 |
ӳ�䷽ʽ | �߼���λ | ����ֵ | |
---|---|---|---|
xÖµ | yÖµ | ||
MM_TEXT | ͼ�� | �� | �� |
MM_LOMETRIC | 0.1 mm | �� | �� |
MM_HIMETRIC | 0.01 mm | �� | �� |
MM_LOENGLISH | 0.01 in. | �� | �� |
MM_HIENGLISH | 0.001 in. | �� | �� |
MM_TWIPS | 1/1440 in. | �� | �� |
MM_ISOTROPIC | ����(x = y) | ��ѡ | ��ѡ |
MM_ANISOTROPIC | ����(x != y) | ��ѡ | ��ѡ |
METRIC��ENGLISHָһ��ͨ�еĶ�����ϵͳ������ӡˢ�IJ�����λ��Լ���1/72Ӣ�磬����ͼ�γ�ʽ����мٶ�Ϊ����1/72Ӣ�硣��Twip�����1/20�㣬Ҳ����1/1440Ӣ�硣��Isotropic���͡�anisotropic���������ĵ��֣���˼�ǡ��ȷ��ԡ���ͬ���򣩺͡��췽�ԡ�����ͬ���򣩡�
������ʹ��������������趨ӳ�䷽ʽ��
SetMapMode (hdc, iMapMode) ;
���У�iMapMode��8��ӳ�䷽ʽʶ����֮һ��������ͨ�����º���ȡ��Ŀǰ��ӳ�䷽ʽ��
iMapMode = GetMapMode (hdc) ;
�ڶ�ӳ�䷽ʽΪMM_TEXT��������ӳ�䷽ʽ�£��߼���λ��ʵ�ʵ�λ��ͬ���������ǿ���ֱ����ͼ��Ϊ��λ���в�������TextOut�����У�����������������
TextOut (hdc, 8, 16, TEXT ("Hello"), 5) ;
���ִӾ�����ʾ�������8ͼ�ء��϶�16ͼ�ص�λ�ô���ʼ��
���ӳ�䷽ʽ�趨ΪMM_LOENGLISH��
SetMapMode (hdc, MM_LOENGLISH) ;
���߼���λ�ǰٷ�֮һ�����ڣ�TextOut�������£�
TextOut (hdc, 50, -100, TEXT ("Hello"), 5) ;
���ִӾ�����ʾ�������0.5Ӣ�硢�϶�1Ӣ���λ�ô���ʼ�����y����ǰ��ĸ��ţ��������Ƕ�ӳ�䷽ʽ����ϸ�����ۣ��������������ӳ�䷽ʽ������ʽ���պ��ס�ӡ�����ĵ��С�������ⵥλ����������ָ�����ꡣ
�������Ϊʹ��ͼ�ؽ��й����ܺ��ʣ���ô�Ͳ�Ҫʹ���ڶ���MM_TEXT��ʽ����κ�ӳ�䷽ʽ�������Ҫ��Ӣ����ߺ��׳ߴ���ʾͼ����ô���Դ�GetDeviceCaps��ȡ������Ҫ����Ѷ���Լ��ٽ������š�����ӳ�䷽ʽ���DZ������Լ��������ŵ�һ������;�����ѡ�
��Ȼ����GDI��ʽ��ָ����������32λԪ��ֵ�����ǽ���Windows NT�ܹ�����ȫ32λԪ����Windows 98�У����걻����Ϊ16λԪ����Χ��-32,768��32,767��һЩʹ�������ʾ���εĿ�ʼ��ͽ������Windows��ʽҲҪ����εĿ��͸�С춻��ߵ��32,767��
װ��������߼�����
��
��Ҳ�����ʣ����ʹ��MM_LOENGLISHӳ�䷽ʽ���Dz��ǽ���õ��԰ٷ�֮һӢ��Ϊ��λ��WM_SIZEѶϢ�أ����Բ��ᡣWindows������ѶϢ����WM_MOVE��WM_SIZE��WM_MOUSEMOVE���������з�GDI��ʽ��������һЩGDI��ʽ����Զʹ��װ�����ꡣ�������������ǣ����ӳ�䷽ʽ��һ��װ���������ԣ����ԣ�ֻ�ж���Ҫװ�����ݴ�����������GDI��ʽ��ӳ�䷽ʽ�Ż������á�GetSystemMetrics����GDI��ʽ��������������װ�õ�λ����ͼ�أ�Ϊ���������ش�С�ġ�����GetDeviceCaps��GDI��ʽ����Ҫһ��װ�����ݴ�����Ϊ����������Windows��Ȼ��HORZRES��VERTRES��װ�õ�λ��Ϊ����ֵ����Ϊ�ú�ʽ��Ŀ��֮һ���Ǹ���ʽ�ṩ��ͼ��Ϊ��λ���豸��С��
��������GetTextMetrics�����д��ص�TEXTMETRIC�ṹ��ֵ��ʹ���߼���λ�ġ�����ڽ��д˺���ʱӳ�䷽ʽΪMM_LOENGLISH����GetTextMetrics���԰ٷ�֮һӢ��Ϊ��λ�ṩ��Ԫ�Ŀ��Ⱥ͸߶ȡ��ں���GetTextMetrics��ȡ�ù����Ԫ�Ŀ��Ⱥ͸߶���Ѷʱ��ӳ�䷽ʽ�����趨�ɸ�����Щ��Ѷ�������ʱ��ʹ�õ�ӳ�䷽ʽ�������Ϳ��Լ򻯹�����
װ������ϵ
��
Windows��GDI��ʽ��ָ�����߼�����ӳ��Ϊװ�����ꡣ�������Ը��ֲ�ͬ��ӳ�䷽ʽʹ���߼�����ϵ֮ǰ������������һ��WindowsΪ��Ѷ��ʾ��������IJ�ͬ��װ������ϵ���������Ǵ����ʱ�����Ӵ�����ʾ�����ڹ�������Windows�ڲ�ͬ��ʱ��ʹ����������װ��������������װ������ϵ����ͼ��Ϊ��λ��ˮƽ�ᣨ��x�ᣩ�ϵ�ֵ�����ҵ�������ֱ�ᣨ��y�ᣩ�ϵ�ֵ���ϵ��µ�����
������ʹ������өĻʱ���͸��ݡ�өĻ���꡹���в�����өĻ�����Ͻ�Ϊ(0,0)�㣬өĻ��������WM_MOVEѶϢ����춷����Ӵ����Լ�����Windows��ʽ�У�CreateWindow��MoveWindow�����Ƕ�춷����Ӵ�����GetMessagePos��GetCursorPos��SetCursorPos��GetWindowRect�Լ�WindowFromPoint���ⲻ��ȫ����ʽ���б��������ǻ��������Ӵ��޹صĺ�ʽ���������α꺯ʽ���������DZ�������ij��өĻ�����ƶ�������Ѱ�ң��Ӵ��ĺ�ʽ�������DISPLAYΪ��������CreateDC����ȡ������өĻ��װ�����ݣ����ڶ������GDI������ָ�����߼����꽫��ӳ��ΪөĻ���ꡣ
��ȫ�Ӵ����꡹ �Գ�ʽ�������Ӵ�Ϊ��׼��������С����ܱ��������к��Ӵ��򶼰������ڡ��������ͨ�Ӵ����㣨0,0�������ű߿�����Ͻǡ�ȫ�Ӵ�������Windows�м���ʹ�ã����������GetWindowDCȡ��װ�����ݣ�GDI��ʽ�е��߼�����ͻ�ת��Ϊ��ʾ�������ꡣ
����������ϵ�������ʹ�õġ���ʾ��������ϵ�����㣨0,0������ʾ��������Ͻǡ���ʹ��GetDC��BeginPaintȡ��װ������ʱ��GDI��ʽ�е��߼�����ͻ��ڶ�ת��Ϊ��ʾ�������ꡣ
�ú�ʽClientToScreen��ScreenToClient���Խ���ʾ��������ת��ΪөĻ���꣬���߷���������өĻ����ת��Ϊ��ʾ�������ꡣҲ����ʹ��GetWindowRect��ʽȡ��өĻ�����µ������Ӵ���λ�úʹ�С����������ʽΪһ��װ������ת��Ϊ��һ���ṩ���㹻����Ѷ��
�Ӳ����Ӵ�
��
ӳ�䷽ʽ������Windows��ν�GDI��ʽ��ָ�����߼�����ӳ��Ϊװ�����꣬�����װ������ϵȡ��������ĸ���ʽ��ȡ��װ�����ݡ�Ҫ��������ӳ�䷽ʽ��������ҪһЩ���ӳ�䷽ʽ��춶���ӡ��Ӵ������߼����꣩�����Ӳ�����װ�����꣩��ӳ�䡣
���Ӵ����͡��Ӳ������������õò���ǡ����������ͼ�ν��������У��Ӳ�ͨ�������м����������˼�����ң������Ѿ����Ӵ���ָ��ʽ��өĻ��ռ�ݵ�����������������У����DZ���ѹ����Щ�ʵ�����֮������һ�ߡ�
���Ӳ���������װ�����꣨ͼ�أ��ġ�ͨ�����Ӳ�����ʾ������ͬ�����ǣ�������Ѿ���GetWindowDC��CreateDCȡ����һ��װ�����ݣ����Ӳ�Ҳ������ָ���Ӵ��������өĻ���ꡣ��(0,0)����ʾ���򣨻��������Ӵ���өĻ�������Ͻǣ�x��ֵ�������ӣ�y��ֵ�������ӡ�
���Ӵ����������߼�����ģ��߼����������ͼ�ء����ס�Ӣ���������Ҫ���κ�������λ������GDI��ͼ��ʽ��ָ���߼��Ӵ����ꡣ
�����������������ϣ��Ӳ����Ӵ�������ѧ�ϵĸ��������е�ӳ�䷽ʽ��Windows��������������ʽ�����Ӵ����߼�������ת��Ϊ�Ӳ����豸�����꣺
��
���У�(xWindow,yWindow)�Ǵ�ת�����߼��㣬(xViewport,yViewport)��ת�����װ������㣬һ�������²�������ʾ���������ˡ�
��������ʽʹ���˷ֱ�ָ���Ӵ����Ӳ���Ô�㡹�ĵ㣺(xWinOrg��yWinOrg)���߼�������Ӵ�Ô�㣻(xViewOrg,yViewOrg)��װ��������Ӳ�Ô�㡣���ڶ���װ�������У�������������趨Ϊ(0,0)���������ǿ��Ըı䡣�˹�ʽ��ζ�����߼���(xWinOrg,yWinOrg)�ܱ�ӳ��Ϊװ�õ�(xViewOrg,yViewOrg)������Ӵ����Ӳ���Ô����Ԥ��ֵ(0,0)����ʽ��Ϊ��
��
�˹�ʽ��ʹ����������ָ������Χ����(xWinExt,yWinExt)���߼�������Ӵ���Χ��(xViewExt,yViewExt)��װ��������Ӵ���Χ���ڶ���ӳ�䷽ʽ�У���Χ��ӳ�䷽ʽ�������ģ����ܹ��ı䡣ÿ����Χ����û��ʲô���壬�����Ӳ���Χ���Ӵ���Χ�ı������߼���λת��Ϊװ�õ�λ�Ļ���������
���磬�����趨MM_LOENGLISHӳ�䷽ʽʱ��Windows��xViewExt�趨Ϊij��ͼ��������xWinExt�趨ΪxViewExtͼ��ռ�ݵ�һӢ�����м���ͼ�صij��ȡ���ֵ������һӢ�����м��ٸ�ͼ�ص���ֵ��Ϊ�����ת��Ч�ܣ�����������ʾΪ�����ȶ����Ǹ�������
��Χ����Ϊ����Ҳ����˵���߼�x���ϵ�ֵ��һ���ǵ�������ʱ���ӣ��߼�y���ϵ�ֵ��һ���ǵ�������ʱ���ӡ�
WindowsҲ�ܽ��Ӳ����豸������ת��Ϊ�Ӵ����߼������꣺
��
Windows�ṩ��������ʽ��������װ�õ�ת��Ϊ�߼����Լ����߼���ת��Ϊװ�õ㡣����ĺ�ʽ��װ�õ�ת��Ϊ�߼��㣺
DPtoLP (hdc, pPoints, iNumber) ;
���У�pPoints��һ��ָ��POINT�ṹ���е�ָ�꣬��iNumber��Ҫת���ĵ�ĸ��������ᷢ�������ʽ��춽�GetClientRect��������ʹ��װ�õ�λ��ȡ�õ���ʾ�����Сת��Ϊ�߼���������ã�
GetClientRect (hwnd, &rect) ; DPtoLP (hdc, (PPOINT) &rect, 2) ;
����ĺ�ʽ���߼���ת��Ϊװ�õ㣺
LPtoDP (hdc, pPoints, iNumber) ;
����MM_TEXT
��
���MM_TEXTӳ�䷽ʽ���ڶ���Ô��ͷ�Χ������ʾ��
�Ӵ�Ô�㣺 (0, 0) ���Ըı�
�Ӳ�Ô�㣺 (0, 0) ���Ըı�
�Ӵ���Χ�� (1, 1) ���ɸı�
�Ӳ���Χ�� (1, 1) ���ɸı�
�Ӳ���Χ���Ӵ���Χ�ı���Ϊ1�����Բ������߼�������װ������֮��������š������������Ĺ�ʽ���Լ�Ϊ��
��
����ӳ�䷽ʽ��Ϊ�����֡�ӳ�䷽ʽ��������Ϊ������������ʺϣ����������ķ������Ƕ������Ǵ������ң��������µģ���MM_TEXT��ͬ���ķ���������ֵ����������
��
Windows�ṩ�˺�ʽSetViewportOrgEx��SetWindowOrgEx�������ı��Ӳ����Ӵ���Ô�㣬��Щ��ʽ�����иı����Ч��������(0,0)����ָ���Ͻǡ�һ����˵������ʹ��SetViewportOrgEx��SetWindowOrgEx֮һ��������ͬʱʹ�ö��ߡ�
��������һ����Щ��ʽ�к�Ч����������Ӳ�Ô��ı�Ϊ(xViewOrg,yViewOrg)�����߼���(0.0)�ͻ�ӳ��Ϊװ�õ�(xViewOrg,yViewOrg)��������Ӵ�Ô��ı�Ϊ(xWinOrg,yWinOrg)�����߼���(xWinOrg,yWinOrg)����ӳ��Ϊװ�õ�(0,0)�������Ͻǡ����ܶ��Ӵ����Ӳ�Ô����ʲô�ı䣬װ�õ�(0,0)ʼ������ʾ��������Ͻǡ�
���磬������ʾ����ΪcxClient��ͼ�ؿ���cyClient��ͼ�ظߡ�����뽫�߼���(0��0)����Ϊ��ʾ��������ģ��ɽ������º��У�
SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;
SetViewportOrgEx�IJ�������ʹ��װ�õ�λ�����ڣ��߼���(0,0)��ӳ��Ϊװ�õ�(cxClient/2,cyClient/2)������ʾ���������ϵ���������״��
��
�߼�x��ķ�Χ��-cxClient/2��+cxClient/2���߼�y��ķ�Χ��-cyClient/2��+cyClient/2����ʾ��������½�Ϊ�߼��� (cxClient/2,cyClient/2)������������ʾ��������Ͻǿ�ʼ��ʾ���֡�����Ҫʹ�ø����꣺
TextOut (hdc, -cxClient / 2, -cyClient / 2, "Hello", 5) ;
�������SetWindowOrgEx�������Ի��������ʹ��SetViewportOrgExͬ����Ч����
SetWindowOrgEx (hdc, -cxClient / 2, -cyClient / 2, NULL) ;
SetWindowOrgEx�IJ�������ʹ���߼���λ�����������֮�ᣬ�߼���(-cxClient / 2,-cyClient / 2)ӳ��Ϊװ�õ�(0,0)������ʾ��������Ͻǡ�
�����Ὣ��������ʽһ���ã�������֪����ô���Ľ����
SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ; SetWindowOrgEx (hdc, -cxClient / 2, -cyClient / 2, NULL) ;
����ζ���߼���(-cxClient/2,-cyClient/2)��ӳ��Ϊװ�õ�(cxClient/2, cyClient/2)�������������ʾ������ϵ��
��
������ʹ������������ʽȡ��Ŀǰ�Ӳ����Ӵ���Ô�㣺
GetViewportOrgEx (hdc, &pt) ; GetWindowOrgEx (hdc, &pt) ;
����pt��POINT�ṹ����GetViewportOrgEx���ص�ֵ��װ�����꣬����GetWindowOrgEx���ص�ֵ���߼����ꡣ
��������ı��Ӳ������Ӵ���Ô�㣬�Ըı��Ӵ���ʾ�����ڵ���ʾ��������磬��Ӧʹ�����ھ������ڵ����롣���ǣ��ı��Ӳ����Ӵ�Ô�㲢���������ı���ʾ������������ڸı�Ô��֮�������������磬�ڵ����µ�SYSMETS2��ʽ�У�����ʹ����iVscrollPosֵ����ֱ�����е�Ŀǰλ�ã���������ʾ�����y���꣺
case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; for (i = 0 ; i < NUMLINES ; i++) { y = cyChar * (i - iVscrollPos) ; // ��ʾ���� } EndPaint (hwnd, &ps) ; return 0 ;
���ǿ���ʹ��SetWindowOrgEx���ͬ����Ч����
case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; SetWindowOrgEx (hdc, 0, cyChar * iVscrollPos) ; for (i = 0 ; i < NUMLINES ; i++) { y = cyChar * i ; // ��ʾ���� } EndPaint (hwnd, &ps) ; return 0 ;
���ڣ�TextOut��ʽ��y����ļ��㲻��ҪiVscrollPos��ֵ������ζ�������Խ����������ʽ�ŵ�һ����ʽ�У����ý�iVscrollPosֵ�����ó�ʽ����Ϊ������ͨ���ı��Ӵ�Ô��������������ʾ�ġ�
�������ʹ��ֱ������ϵ�����ѿ�������ϵ���ľ��飬��ô���߼��㣨0,0���Ƶ���ʾ��������루������������˵����������ȷֵ�ÿ��ǡ����ǣ����MM_TEXTӳ�䷽ʽ��˵����������һ��СС�����⣺�ѿ�������ϵ�У�yֵ���������ƶ����ӵģ���MM_TEXT����Ϊ����ʱyֵ���ӡ�����һ��������MM_TEXT�е�Ź֣�������������ӳ�䷽ʽ��ʹ��ͨ������ֵ������
��������ӳ�䷽ʽ
��
Windows����������ʵ�ʳߴ�����ʾ�߼������ӳ�䷽ʽ�����x���y����߼�����ӳ��Ϊ��ͬ��ʵ�ʵ�λ����Щӳ�䷽ʽ��ʹ�����������ε�Բ�;��Ρ�
�����֡�������ӳ�䷽ʽ�ڱ�5-6���г������մӵ;��ȵ��߾��ȵ�˳�����С��ұߵ����зֱ��������Ӣ��ͺ���Ϊ��λʱ�߼���λ�Ĵ�С���Ա�Ƚϡ�
��5-6 |
ӳ�䷽ʽ | �߼���λ | Ӣ�� | ���� |
---|---|---|---|
MM_LOENGLISH | 0.01 in. | 0.01 | 0.254 |
MM_LOMETRIC | 0.1 mm. | 0.00394 | 0.1 |
MM_HIENGLISH | 0.001 in. | 0.001 | 0.0254 |
MM_TWIPS | 1/1400 in. | 0.000694 | 0.0176 |
MM_HIMETRIC | 0.01 mm. | 0.000394 | 0.01 |
�ڶ��Ӵ����Ӳ���Ô��ͷ�Χ������ʾ��
�Ӵ�Ô�㣺 (0, 0) ���Ըı�
�Ӳ�Ô�㣺 (0, 0) ���Ըı�
�Ӵ���Χ�� (1, 1) ���ɸı�
�Ӳ���Χ�� (1, 1) ���ɸı�
�ʺű�ʾ�Ӵ����Ӳ��ķ�Χ�����ӳ�䷽ʽ���豸�Ľ����ȡ�ǰ���Ѿ��ᵽ������Щ��Χ����������Ҫ�����DZ�ʾ����ʱ�ͱ���֪�����������Ӵ����굽�Ӳ������ת����ʽ��
��
���磬���MM_LOENGLISH��Windows����ķ�Χ���£�
��
Windowsʹ����Щ����GetDeviceCaps��������Ѷ�趨��Χ��ֻ����Windows 98��Windows NT֮����һ����
���ȣ�������Windows 98��������ģ�������ʹ�á�����̨���ġ���ʾ����ʽѡ����96 dpi��ϵͳ���塣GetDeviceCaps���LOGPIXELSX��LOGPIXELSY������������ֵ96��WindowsΪ�Ӳ���Χʹ����Щֵ���Ա�5-7�ķ�ʽ�趨�Ӳ����Ӵ��ķ�Χ��
��5-7 |
ӳ�䷽ʽ | �Ӳ���Χ (x,y) | �Ӵ���Χ (x,y) |
---|---|---|
MM_LOMETRIC | (96, 96) | (254, -254) |
MM_HIMETRIC | (96, 96) | (2540, -2540) |
MM_LOENGLISH | (96, 96) | (100, -100) |
MM_HIENGLISH | (96, 96) | (1000, -1000) |
MM_TWIPS | (96, 96) | (1440, -1440) |
��������MM_LOENGLISH��˵��96����100�ı�ֵ��0.01Ӣ���е�ͼ��������MM_LOMETRIC��˵��96����254�ı�ֵ��0.1�����е�ͼ������
Windows NTʹ�ò�ͬ�ķ����趨�Ӳ����Ӵ��ķ�Χ��������16λԪ�汾��Windowsһ�µķ��������Ӳ���Χ����өĻ��ͼ�سߴ硣����ʹ��HORZRES��VERTRES������GetDeviceCapsȡ��������Ѷ���Ӵ���Χ���ݼٶ�����ʾ��С��������ʹ��HORZSIZE��VERTSIZE����ʱ��GetDeviceCaps���صġ�����ǰ���ᵽ������Щֵһ����320��240���ס����������ʾ����ͼ�سߴ��趨Ϊ1024��768�����5-8����Windows NT������Ӳ����Ӵ���Χ��ֵ��
��5-8 |
ӳ�䷽ʽ | �Ӳ���Χ (x,y) | �Ӵ���Χ (x,y) |
---|---|---|
MM_LOMETRIC | (1024, -768) | (3,200, 2,400) |
MM_HIMETRIC | (1024, -768) | (32,000, 24,000) |
MM_LOENGLISH | (1024, -768) | (1,260, 945) |
MM_HIENGLISH | (1024, -768) | (12,598, 9,449) |
MM_TWIPS | (1024, -768) | (18,142, 13,606) |
��Щ�Ӵ���Χ��ʾ������ʾ��ȫ�����Ⱥ͸߶ȵ��߼���λԪ��ֵ��320���׿���өĻҲΪ1260 MM_LOENGLISH��λ��12.6Ӣ�磨320����25.4����/Ӣ�磩��
��Χ�У�yǰ��ĸ��ű�ʾ�ı�����ķ��ò¡£¶ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ó³ï¿½ä·½Ê½ï¿½ï¿½yֵ�����������ӣ�Ȼ��ע���ڶ����Ӵ����Ӳ�Ô���Ϊ(0,0)�������ʵ��һ����Ȥ�Ľ������һ��ʼ�ı�Ϊ����ӳ�䷽ʽ֮һʱ������ϵ���£�
��
Ҫ������ʾ������ʾ�κζ���������ʹ�ø���yֵ����������ij�ʽ�룺
SetMapMode (hdc, MM_LOENGLISH) ; TextOut (hdc, 100, -100, "Hello", 5) ;
����������ʾ�ھ�����ʾ������ߺ��ϱ߸�һӢ��ĵط���
Ϊ��ʹ�Լ�����ͷ�����ѣ��������������������һ�ֽ���취�ǽ��߼���(0,0)����Ϊ��ʾ��������½ǣ�������ͨ������SetViewportOrgEx����ɣ�����cyClient����ͼ��Ϊ��λ����ʾ����ĸ߶ȣ���
SetViewportOrgEx (hdc, 0, cyClient, NULL) ;
��ʱ������ϵ���£�
��
����ֱ������ϵ���������ޡ�
��һ�ַ����ǽ��߼�(0,0)����Ϊ��ʾ��������ģ�
SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;
��ʱ������ϵ������ʾ��
��
���ڣ���������һ��������4���޵ѿ�������ϵ����x���y��������ȵİ�Ӣ�硢���׻�twip������߼���λ��
��������ʹ��SetWindowOrgEx��ʽ���ı��߼�(0,0)�㣬��������΢����һЩ����ΪSetWindowOrgEx�IJ�������ʹ���߼���λ����Ҫ��(cxClient,cyClient)��DPtoLP��ʽת��Ϊ�߼����ꡣ�������pt����̬ΪPOINT�Ľṹ������Ĵ��뽫�߼�(0,0)��ı䵽��ʾ��������룺
pt.x = cxClient ; pt.y = cyClient ; DptoLP (hdc, &pt, 1) ; SetWindowOrgEx (hdc, -pt.x / 2, -pt.y / 2, NULL) ;
�����о�������ӳ�䷽ʽ
��
ʣ�µ�����ӳ�䷽ʽΪMM_ISOTROPIC��MM_ANISOTROPIC��ֻ��������ӳ�䷽ʽ���������ı��Ӳ����Ӵ���Χ��Ҳ����˵���Ըı�Windows����ת���߼���װ������Ļ�����������isotropic������˼�ǡ�ͬ�����ԡ�����anisotropic������˼�ǡ��췽���ԡ��������������۵Ķ���ӳ�䷽ʽ���ƣ�MM_ISOTROPICʹ����ͬ���ᣬx���ϵ��߼���λ��y���ϵ��߼���λ��ʵ�ʳߴ���ȡ�����������ݺ������ʾ���޹ص�ͼ�����а����ġ�
MM_ISOTROPIC�����ӳ�䷽ʽ֮��������ǣ�ʹ��MM_ISOTROPIC�������Կ����߼���λ��ʵ�ʳߴ硣���Ը�⣬�����Ը�����ʾ����Ĵ�С�������߼���λ��ʵ�ʳߴ磬�Ӷ�ʹ������ͼ�����ǰ�������ʾ�����ڣ�����Ӧ�طŴ����С�����磬�ڰ��µ�����ʱ�ӳ�ʽ���Ƿ���ͬ�Ե����ӡ������ı��Ӵ���Сʱ��ʱ��Ҳ��Ӧ�ص�����
Windows��ʽ��ȫ����ͨ�������Ӵ����Ӳ���Χ������ͼ���С�ı仯����ˣ������Ӵ��ߴ������䣬��ʽ�������ڻ�ͼ��ʽ��ʹ����ͬ���߼���λ��
��ʱ��MM_TEXT�Ͷ���ӳ�䷽ʽ��Ϊ����ȫ�����ԡ�ӳ�䷽ʽ�������˵�������ܸı��Ӵ����Ӳ��ķ�Χ�Լ�Windows���߼����껻��Ϊװ������ķ�����MM_ISOTROPIC��һ�֡�������ԡ���ӳ�䷽ʽ��Windows�������ı��Ӵ����Ӳ���Χ����ֻ�ǵ������ǣ��Ա�x��y�߼���λ����ͬ����ʵ�ʳߴ硣MM_ANISOTROPICӳ�䷽ʽ�ǡ��Ǿ����ԡ��ģ������Ըı��Ӵ����Ӳ���Χ������Windows��������Щֵ��
MM_ISOTROPICӳ�䷽ʽ
��
�����Ҫ��ʹ���������ʱ����֤�������ϵ��߼���λ��ͬ����MM_ISOTROPICӳ�䷽ʽ���������ӳ�䷽ʽ����ʱ��������ͬ�߼����Ⱥ͸߶ȵľ�����ʾΪ�����Σ�������ͬ�߼����Ⱥ͸߶ȵ���Բ��ʾΪԲ��
�����տ�ʼ��ӳ�䷽ʽ�趨ΪMM_ISOTROPICʱ��Windowsʹ����MM_LOMETRICͬ�����Ӵ����Ӳ���Χ�����ǣ���Ҫ�Դ�������������������춣������ڿ��Ժ���SetWindowExtEx��SetViewportExtEx�������Լ���ƫ�øı䷶Χ�ˣ�Ȼ�ᣬWindows��������Χ��ֵ���Ա��������ϵ��߼���λ����ͬ��ʵ�ʾ��롣
һ��˵���������������������߼��Ӵ����߼��ߴ���ΪSetWindowExtEx�IJ���������ʾ�����ʵ�ʿ��͸���ΪSetViewportExtEx�IJ�����Windows�ڵ�����Щ��Χʱ���������߼��Ӵ���Ӧʵ���Ӵ�������п��ܵ�����ʾ�����һ���䵽���߼��Ӵ������档�����ں���SetViewportExtEx֮ǰ����SetWindowExtEx���Ա�����Ч��ʹ����ʾ�����еĿռ䡣
���磬��������Ҫһ������ͳ�ġ���������������ϵ������(0,0)����ʾ��������½ǣ����Ⱥ͸߶ȵķ�Χ���Ǵ�0��32,767������ϣ��x��y��ĵ�λ����ͬ����ʵ�ʳߴ硣���¾�������ij�ʽ��
SetMapMode (hdc, MM_ISOTROPIC) ; SetWindowExtEx (hdc, 32767, 32767, NULL) ; SetViewportExtEx (hdc, cxClient, -cyClient, NULL) ; SetViewportOrgEx (hdc, 0, cyClient, NULL) ;
���������GetWindowExtEx��GetViewportExtEx��ʽ������Ӵ����Ӳ��ķ�Χ�����Է��֣����Dz�������ǰָ����ֵ��Windows��������ʾ�豸���ݺ����������Χ���Ա��������ϵ��߼���λ��ʾ��ͬ��ʵ�ʳߴ硣
�����ʾ����Ŀ��ȴ�춸߶ȣ���ʵ�ʳߴ�Ϊ׼����Windows������x�ķ�Χ���Ա��߼��Ӵ�����ʾ�����Ӳ�Õ���������߼��Ӵ�����������ʾ�������ߣ�
��
Windows 98����������ʾ������ұ߳�Խx��ķ�Χ֮����ʾ�κζ�������Ϊ����Ҫһ�����16λԪ���ܱ�ʾ�����ꡣWindows NTʹ��ȫ32λԪ���꣬�������ڳ����ұ���ʾһЩ������
�����ʾ����ĸ߶ȴ�춿��ȣ���ʵ�ʳߴ�Ϊ׼������ôWindows������y�ķ�Χ���������߼��Ӵ�����������ʾ������±ߣ�
��
Windows 98����������ʾ����Ķ�����ʾ�κζ�����
�����ϣ���߼��Ӵ����Ƿ�����ʾ��������ϲ�����ô��ǰ������ij�ʽ���Ϊ��
SetMapMode (MM_ISOTROPIC) ; SetWindowExtEx (hdc, 32767, 32767, NULL) ; SetViewportExtEx (hdc, cxClient, -cyClient, NULL) ; SetWindowOrgEx (hdc, 0, 32767, NULL) ;
�ں���SetWindowOrgEx�У�����Ҫ���߼���(0, 32767)ӳ��Ϊװ�õ�(0,0)�����ڣ������ʾ����ĸߴ�춿���������ϵ������Ϊ��
���ʱ�ӳ�ʽ����Ҳ����Ҫʹ��һ�������޵ĵѿ�������ϵ���ĸ����������߶ȿ�������ָ����(0,0) ��������ʾ��������롣�������Ҫÿ����ķ�Χ��0��1000�������ʹ�����³�ʽ�룺
SetMapMode (hdc, MM_ISOTROPIC) ; SetWindowExtEx (hdc, 1000, 1000, NULL) ; SetViewportExtEx (hdc, cxClient / 2, -cyClient / 2, NULL) ; SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;
�����ʾ����Ŀ��ȴ�춸߶ȣ����߼�����ϵ���磺
��
�����ʾ����ĸ߶ȴ�춿��ȣ���ô�߼�����Ҳ����У�
��
��ס���Ӵ������Ӳ���Χ������ζ��Ҫ���м��á��ں���GDI��ʽʱ������Ȼ��������ʹ��С�-1000�ʹ��1000��x��yֵ��������ʾ��������Σ���Щ����ܿ��ü���Ҳ���ܿ�������
��MM_ISOTROPICӳ�䷽ʽ�£�����ʹ�߼���λ���ͼ�ء����磬��������Ҫһ��ӳ�䷽ʽ��ʹ��(0,0)��ʾ��өĻ�����Ͻǣ�y��ֵ������������MM_TEXT���ƣ��������߼����굥λΪ1/16Ӣ�硣������һ�ַ�����
SetMapMode (hdc, MM_ISOTROPIC) ; SetWindowExtEx (hdc, 16, 16, NULL) ; SetViewportExtEx (hdc, GetDeviceCaps (hdc, LOGPIXELSX), GetDeviceCaps (hdc, LOGPIXELSY), NULL) ;
SetWindowExtEx��ʽ�IJ���ָ����ÿһӢ�����߼���λ����SetViewportExtEx��ʽ�IJ���ָ����ÿһӢ����ʵ�ʵ�λ����ͼ�أ���
Ȼ�������ַ�����Windows NT�еĶ���ӳ�䷽ʽ��һ�¡���Щӳ�䷽ʽʹ����ʾ����ͼ�ش�С�͹��ƴ�С��Ҫ�����ӳ�䷽ʽ����һ�£�������������
SetMapMode (hdc, MM_ISOTROPIC) ; SetWindowExtEx (hdc, 160 * GetDeviceCaps (hdc, HORZSIZE) / 254, 160 * GetDeviceCaps (hdc, VERTSIZE) / 254, NULL) ; SetViewportExtEx (hdc, GetDeviceCaps (hdc, HORZRES), GetDeviceCaps (hdc, VERTRES), NULL) ;
�������ʽ���У��Ӳ���Χ�趨Ϊ��ͼ�ؼ��������өĻ�Ĵ�С���Ӵ���Χ������趨Ϊ��1/16Ӣ��Ϊ��λ������өĻ�Ĵ�С��GetDeviceCaps��HORZRES��VERTRESΪ�����������Ժ���Ϊ��λ��װ�óߴ硣�������ʹ�ø����������Ѻ���������25.4��ת��ΪӢ�磬Ȼ�ᣬ�ٳ���16��ת��Ϊl/16Ӣ�硣���ǣ��������ʹ�õ��������������ȳ���160���ٳ���254��
��Ȼ����������ϵ��ʹ�߼���λ���ʵ�ʵ�λ�����豸����������ж�������ӳ��Ϊ��1/16Ӣ������������ֵ����Ȼ�������Ͳ��ܻ��������l/32Ӣ���ˮƽֱ�ߣ���Ϊ��������ҪС���߼����ꡣ
MM_ANISOTROPIC��������Ҫ����ͼ��
��
��MM_ISOTROPICӳ�䷽ʽ���趨�Ӵ����Ӳ���Χʱ��Windows�������Χ���Ա��������ϵ��߼���λ������ͬ��ʵ�ʳ߶ȡ���MM_ANISOTROPICӳ�䷽ʽ�£�Windows���������趨��ֵ���е����������˵��MM_ANISOTROPIC����Ҫά����ȷ���ݺ�ȡ�
ʹ��MM_ANISOTROPIC��һ�ַ����Ƕ���ʾ����ʹ���������꣬�������Ƕ�MM_ISOTROPIC������һ��������ij�ʽ�뽫��(0,0)�趨Ϊ��ʾ��������½ǣ�x���y�ᶼ��0��32,767��
SetMapMode (hdc, MM_ANISOTROPIC) ; SetWindowExtEx (hdc, 32767, 32767, NULL) ; SetViewportExtEx (hdc, cxClient, -cyClient, NULL) ; SetViewportOrgEx (hdc, 0, cyClient, NULL) ;
��MM_ISOTROPIC��ʽ�£����Ƶij�ʽ�뵼����ʾ�����һ��������ķ�Χ֮�⡣���Ƕ��MM_ANISOTROPIC��������߶ȶ����ʾ��������Ͻ�����(32767, 32767)�������ʾ�����������εģ����߼�x��y�ĵ�λ���в�ͬ��ʵ�ʳ߶ȡ�
ǰһ����MM_ISOTROPICӳ�䷽ʽ�£���������������ʾ�����л�һ������ʱ�ӵ�ͼ��x��y��ķ�Χ���Ǵ�-1000��+1000�����MM_ANISOTROPIC��Ҳ����д�����Ƶij�ʽ��
SetMapMode (hdc, MM_ANISOTROPIC) ; SetWindowExtEx (hdc, 1000, 1000, NULL) ; SetViewportExtEx (hdc, cxClient / 2, -cyClient / 2, NULL) ; SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;
��MM_ANISOTROPIC��ʽ��ͬ���ǣ����ʱ��һ������Բ�εģ�������Բ�εġ�
��һ��ʹ��MM_ANISOTROPIC�ķ����ǽ�x��y��ĵ�λ�̶�������ֵ����ȡ����磬�����һ��ֻ��ʾ���ֵij�ʽ������������ݵ�����Ԫ�ĸ߶ȺͿ����趨һ�̶ִֿȵ����꣺
SetMapMode (hdc, MM_ANISOTROPIC) ; SetWindowExtEx (hdc, 1, 1, NULL) ; SetViewportExtEx (hdc, cxChar, cyChar, NULL) ;
��Ȼ���������cxChar��cyChar�ֱ��������������Ԫ���Ⱥ͸߶ȡ����ڣ������԰���Ԫ�к���ָ�����ꡣ����������ھ�����ʾ�������������Ԫ���ϱ߶�����Ԫ����ʾ���֣�
TextOut (hdc, 3, 2, TEXT ("Hello"), 5) ;
�����ʹ�ù̶���С������ʱ����ӷ��㣬���������WHATSIZE��ʽ��ʾ��������
������һ���趨MM_ANISOTROPICӳ�䷽ʽʱ�������Ǽ̳�ǰ�����趨��ӳ�䷽ʽ�ķ�Χ�����ܷ��㡣������ΪMM_ANISOTROPIC������������Χ��Ҳ����˵��������������ı��Ӵ���Χ�����磬����������MM_LOENGLISHӳ�䷽ʽ����Ϊϣ���߼���λΪ0.01Ӣ�磬������ϣ��y���ֵ�������ӣ�ϲ����MM_TEXT�����ķ��򣬼�y���ֵ�������ӣ�����ʹ�����µĴ��룺
SIZE size ;
�����г�ʽ
SetMapMode (hdc, MM_LOENGLISH) ; SetMapMode (hdc, MM_ANISOTROPIC) ; GetViewportExtEx (hdc, &size) ; SetViewportExtEx (hdc, size.cx, -size.cy, NULL) ;
�������Ƚ�ӳ�䷽ʽ�趨ΪMM_LOENGLISH��Ȼ�ᣬͨ����ӳ�䷽ʽ�趨ΪMM_ANISOTROPIC�÷�Χ�������ɸı䡣GetViewportExtExȡ���Ӳ���Χ���ŵ�һ��SIZE�ṹ�У�Ȼ�ᣬ����ʹ�÷�Χ������SetViewportExtEx��ֻ��Ҫ��y��Χȡ����
WHATSIZE��ʽ
��
Windows��С��ʷ����һƪ���д��Windows��ʽ�Ľ������³����ڡ�Microsoft Systems Journal��1986��12�º��ϡ�����ƪ�����У�������ʽ����WSZ����what size��ʲô�ߴ硹��������ͼ�ء�Ӣ��ͺ���Ϊ��λ��ʾ����ʾ����Ĵ�С���Ǹ���ʽ�ĸ����װ汾��WHATSIZE�����ʽ5-6��ʾ����ʽ��ʾ�������ֶ���ӳ�䷽ʽ��ʾ���Ӵ���ʾ����Ĵ�С��
��ʽ5-6 WHATSIZE WHATSIZE.C /*------------------------------------------------------------ WHATSIZE.C -- What Size is the Window? (c) Charles Petzold, 1998 ----------------------------------------------------------*/ #include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("WhatSize") ; 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 ("What Size is the Window?"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } void Show (HWND hwnd, HDC hdc, int xText, int yText, int iMapMode, TCHAR * szMapMode) { TCHAR szBuffer [60] ; RECT rect ; SaveDC (hdc) ; SetMapMode (hdc, iMapMode) ; GetClientRect (hwnd, &rect) ; DPtoLP (hdc, (PPOINT) &rect, 2) ; RestoreDC (hdc, -1) ; TextOut ( hdc, xText, yText, szBuffer, wsprintf (szBuffer, TEXT ("%-20s %7d %7d %7d %7d"), szMapMode, rect.left, rect.right, rect.top, rect.bottom)) ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static TCHAR szHeading [] = TEXT ("Mapping Mode Left Right Top Bottom") ; static TCHAR szUndLine [] = TEXT ("------------ ---- ----- --- ------") ; static int cxChar, cyChar ; HDC hdc ; PAINTSTRUCT ps ; TEXTMETRIC tm ; switch (message) { case WM_CREATE: hdc = GetDC (hwnd) ; SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ; GetTextMetrics (hdc, &tm) ; cxChar = tm.tmAveCharWidth ; cyChar = tm.tmHeight + tm.tmExternalLeading ; ReleaseDC (hwnd, hdc) ; return 0 ; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ; SetMapMode (hdc, MM_ANISOTROPIC) ; SetWindowExtEx (hdc, 1, 1, NULL) ; SetViewportExtEx (hdc, cxChar, cyChar, NULL) ; TextOut (hdc, 1, 1, szHeading, lstrlen (szHeading)) ; TextOut (hdc, 1, 2, szUndLine, lstrlen (szUndLine)) ; Show (hwnd, hdc, 1, 3, MM_TEXT, TEXT ("TEXT (pixels)")) ; Show (hwnd, hdc, 1, 4, MM_LOMETRIC, TEXT ("LOMETRIC (.1 mm)")) ; Show (hwnd, hdc, 1, 5, MM_HIMETRIC, TEXT ("HIMETRIC (.01 mm)")) ; Show (hwnd, hdc, 1, 6, MM_LOENGLISH, TEXT ("LOENGLISH (.01 in)")) ; Show (hwnd, hdc, 1, 7, MM_HIENGLISH,TEXT ("HIENGLISH (.001 in)")) ; Show (hwnd, hdc, 1, 8, MM_TWIPS, EXT ("TWIPS (1/1440 in)")) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
Ϊ�˱����TextOut��ʽ��ʾ��Ѷ��WHATSIZEʹ����һ�̶ֹ��������塣����һ���򵥵������Ϳ����л�Ϊ�̶��������壨��Windows 3.0����������ʹ�õģ���
SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
������ͬ���ĺ�ʽ���ѡȡ���ʺͻ�ˢ����ǰ���ᵽ�ģ�WHATSIZEҲʹ��MM_ANISTROPICӳ�䷽ʽ���߼���λ�趨Ϊ��Ԫ��С��
��WHATSIZE��Ҫȡ������ӳ�䷽ʽ֮һ����ʾ����Ĵ�Сʱ��������Ŀǰ��װ�����ݣ��趨һ���µ�ӳ�䷽ʽ��ȡ����ʾ�������꣬������ת��Ϊ�߼����꣬Ȼ������ʾ��Ѷ֮ǰ���ָ�Ôӳ�䷽ʽ��������Щ��ʽ����WHATSIZE��Show��ʽ�
SaveDC (hdc) ; SetMapMode (hdc, iMapMode) ; GetClientRect (hwnd, &rect) ; DptoLP (hdc, (PPOINT) &rect, 2) ; RestoreDC (hdc, -1) ;
ͼ5-19��ʾ��WHATSIZE�ĵ��������
��
ͼ5-19 ���͵�WHATSIZE��ʾ |
���Ρ�����ͼ���
��
Windows�����˼���ʹ��RECT�����Σ��ṹ�͡����򡹵Ļ�ͼ��ʽ���������өĻ�ϵ�һ��ط������Ǿ��Ρ�����κ���Բ����ϡ�
���κ�ʽ
��
����������ͼ��ʽ��Ҫһ��ָ����νṹ��ָ�꣺
FillRect (hdc, &rect, hBrush) ; FrameRect (hdc, &rect, hBrush) ; InvertRect (hdc, &rect) ;
����Щ��ʽ�У�rect������һ��RECT��̬�Ľṹ����������4����λ��left��top��right��bottom������ṹ�е����걻�����߼����ꡣ
FillRect��ָ����ˢ��������Σ�ֱ����������right��bottom���꣩���ú�ʽ����Ҫ�Ƚ���ˢѡ��װ�����ݡ�
FrameRectʹ�û�ˢ�����ο򣬵��Dz�������Ρ�ʹ�û�ˢ�����ο������е���֣���Ϊ������������ܹ��ĺ�ʽ����Rectangle��������߶�����Ŀǰ���ʻ��Ƶġ�FrameRect����ʹ���߻�һ����һ��Ϊ��ɫ�ľ��ο򡣸ñ߽��Ϊһ���߼���λԪ��������߼���λ���װ�õ�λ����߽�򽫻�Ϊ2��ͼ�ؿ����߸�����
InvertRect������������ͼ�ط�ת��1ת����0��0ת��Ϊ1���ú�ʽ����ɫ����ת��ɺ�ɫ����ɫ����ת��Ϊ��ɫ����ɫ����ת������ɫ��
Windows���ṩ��9����ʽ��ʹ�����Ը����ס�������ز���RECT�ṹ�����磬Ҫ��RECT�ṹ���ĸ���λ�趨Ϊ�ض�ֵ��ͨ��ʹ�����µij�ʽ�Σ�
rect.left = xLeft ; rect.top = xTop ; rect.right = xRight ; rect.bottom = xBottom ;
���ǣ�ͨ������SetRect��ʽ��ֻ��Ҫһ�������Ϳ��Եõ�ͬ���Ľ����
SetRect (&rect, xLeft, yTop, xRight, yBottom) ;
������Ҫ����������֮һʱ�����Ժܷ����ѡ������8����ʽ��
OffsetRect (&rect, x, y) ;
InflateRect (&rect, x, y) ;
SetRectEmpty (&rect) ;
CopyRect (&DestRect, &SrcRect) ;
IntersectRect (&DestRect, &SrcRect1, &SrcRect2) ;
UnionRect (&DestRect, &SrcRect1, &SrcRect2) ;
bEmpty = IsRectEmpty (&rect) ;
bInRect = PtInRect (&rect, point) ;
���������£�����Щ��ʽ��ͬ���õij�ʽ��ܼ򵥡����磬���������������������CopyRect��ʽ���У�
DestRect = SrcRect ;
�������
��
��ͼ��ϵͳ�У�����ôһ������Զ������ִ�е���Ȥ��ʽ�����򵥵�ʹ������Ĵ�С��ɫ�ʻ���һϵ�о��Ρ���������Windows�н���һ�������ij�ʽ��������������է�������������ױ�д����ϣ��������ʶ���������ܼ򵥵���WM_PAINTѶϢ��ʹ��һ��while(TRUE)��Ȧ����Ȼ�����ܹ�ִ�У����dz�ʽ��ֹͣ������ѶϢ�Ĵ�����ͬʱ�������ʽ������ֹ������С����
һ�ֿ��Խ��ܵķ������趨һ��Windows��ʱ�������Ӵ�������WM_TIMERѶϢ���ҽ��ڵڰ��������ۼ�ʱ���������ÿ��WM_TIMERѶϢ����ʹ��GetDCȡ��һ��װ�����ݣ���һ������ľ��Σ�Ȼ����ReleaseDC�ͷ�װ�����ݡ����������ֽ����˳�ʽ��Ȥ���ԣ���Ϊ��ʽ���ܾ����ܿ�ػ�������Σ�������ȴ�WM_TIMERѶϢ�������������ϵͳʱ�ӵĽ����ȡ�
��Windows��һ���кܶࡸ����ʱ�䡹�������ʱ���ڣ�����ѶϢ����Ϊ�գ�Windowsֻͣ��һ��С��Ȧ�еȴ����̻��߻������롣�����ܷ�������ʱ���ڻ�ÿ��ƣ����ƾ��Σ�����ֻ����ѶϢ�����ʽ��ѶϢ����֮����ͷſ����أ������PeekMessage��ʽ��Ŀ��֮һ��������PeekMessage���е�һ�����ӣ�
PeekMessage (&msg, NULL, 0, 0, PM_REMOVE) ;
ǰ����ĸ�������һ��ָ��MSG�ṹ��ָ�ꡢһ���Ӵ����š�����ֵָʾѶϢ��Χ����GetMessage�IJ�����ͬ�����ڶ��������ĸ������趨ΪNULL��0ʱ��������������PeekMessage���س�ʽ�������Ӵ�������ѶϢ�����Ҫ��ѶϢ��ѶϢ������ɾ������PeekMessage������һ�������趨ΪPM_REMOVE���������ϣ��ɾ��ѶϢ����ô�����Խ���������趨ΪPM_NOREMOVE�������ΪʲôPeek_Message�ǡ�͵���������ǡ�ȡ�á���Ô����ʹ�ó�ʽ���Լ���ʽ�������е���һ��ѶϢ������ʵ��ɾ������
GetMessage�������ƴ��ظ���ʽ��ֱ���ӳ�ʽ��ѶϢ������ȡ��ѶϢ������PeekMessage�������̴��أ�������һ��ѶϢ�Ƿ���֡���ѶϢ��������һ��ѶϢʱ��PeekMessage�Ĵ���ֵΪTRUE����0�������ҽ���ͨ����ʽ����ѶϢ����������û��ѶϢʱ��PeekMessage����FALSE��0����
��ʹ�����ǿ��Ը�д��ͨ��ѶϢ��Ȧ�����ǿ��Խ�������ʾ�Ļ�Ȧ��
while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ;
�滻Ϊ����Ļ�Ȧ��
while (TRUE) { if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) break ; TranslateMessage (&msg) ; DispatchMessage (&msg) ; } else { // ���ijЩ�����������г�ʽ } } return msg.wParam ;
ע�⣬WM_QUITѶϢ��������������顣����ͨ��ѶϢ��Ȧ����������ô������Ϊ���GetMessage���յ�һ��WM_QUITѶϢ����������0������PeekMessage�����Ĵ���ֵ��ָʾ�Ƿ�õ�һ��ѶϢ��������Ҫ��WM_QUIT���м�顣
���PeekMessage�Ĵ���ֵΪTRUE����ѶϢ��ͨ����ʽ���д������������ֵΪFALSE�����ڽ����ƴ��ظ�Windows֮ǰ����������һ�㹤��������ʾ��һ��������Σ���
������Windows�ļ���˵����������PeekMessage��ѶϢ������ɾ��WM_PAINTѶϢ�������Ⲣ����ʲô���˵����⡣�Ͼ���GetMessage������ѶϢ������ɾ��WM_PAINTѶϢ����������ɾ��WM_PAINTѶϢ��Ψһ���������Ӵ���ʾ�����ʧЧ��������Ч���������ValidateRect��ValidateRgn����BeginPaint��EndPaint������ɡ��������ʹ��PeekMessage��������ȡ��WM_PAINTѶϢ�ᣬͬƽ��һ������������ô�Ͳ����������ˡ�������������ʹ��������ʾ�ij�ʽ�������ѶϢ�����е�����ѶϢ��
while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) ;
����������ѶϢ������ɾ��WM_PAINT֮�������ѶϢ�������������һ��WM_PAINTѶϢ����ʽ�ͻ���Զ������while��Ȧ�С���
PeekMessage��Windows�����ڰ汾�б���Windows 98��Ҫ��Ҫ�öࡣ������ΪWindows��16λԪ�汾ʹ�õ��Ƿ�����Ȩʽ�Ķ๤���ҽ��ڵڶ�ʮ����������һ�㣩��Windows��Terminal��ʽ�ڴ�ͨѶ�����������ᣬʹ��һ��PeekMessage��Ȧ����ӡ��������ʽʹ�����������������ӡ��������Windows��ӡӦ�ó�ʽͨ������ʹ��һ��PeekMessage��Ȧ����Windows 98����Ȩʽ�Ķ๤�����£���ʽ���Խ������ִ���������ǽ��ڶ�ʮ�¿�����һ�㡣
��������������PeekMessage��ʽ�����ǾͿ��Ա�дһ����ͣ����ʾ������εij�ʽ�����RANDRECT���ʽ5-7����ʾ��
��ʽ5-7 RANDRECT RANDRECT.C /*---------------------------------------------------------------------- RANDRECT.C -- Displays Random Rectangles (c) Charles Petzold, 1998 -----------------------------------------------------------------------*/ #include <windows.h> #include <stdlib.h> // for the rand function LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; void DrawRectangle (HWND) ; int cxClient, cyClient ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("RandRect") ; 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 ("Random Rectangles"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (TRUE) { if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) break ; TranslateMessage (&msg) ; DispatchMessage (&msg) ; } else DrawRectangle (hwnd) ; } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { switch (iMsg) { case WM_SIZE: cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; return 0 ; case WM_DESTROY: PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; } void DrawRectangle (HWND hwnd) { HBRUSH hBrush ; HDC hdc ; RECT rect ; if (cxClient == 0 || cyClient == 0) return ; SetRect (&rect, rand () % cxClient, rand () % cyClient, rand () % cxClient, rand () % cyClient) ; hBrush = CreateSolidBrush ( RGB (rand () % 256, rand () % 256, rand () % 256)) ; hdc = GetDC (hwnd) ; FillRect (hdc, &rect, hBrush) ; ReleaseDC (hwnd, hdc) ; DeleteObject (hBrush) ; }
�����ʽ�����ڵĵ�����ִ�е÷dz��죬��������������һϵ����������ˡ���ʽʹ�������������۹���SetRect��FillRect��ʽ��������C��rand��ʽ�õ��������������������ʵ�Ļ�ˢ��ɫ�ʡ��ҽ��ڵڶ�ʮ�����ṩ�����ʽ�Ķ�ִ�����汾��
�����ͻ��Ƽ�������
��
���������Ƕ���ʾ����һ����Χ�������������Χ�Ǿ��Ρ�����κ���Բ����ϡ��������������춻��ƺͼ��ã�ͨ������������ѡ��װ�����ݣ��Ϳ����ü������������м��ã�����˵�������Ի�ͼ�ķ�Χ����Ϊ��ʾ�����һ���֣����ë»ï¿½Ê¡ï¿½ï¿½ï¿½Ë¢ï¿½Íµï¿½ï¿½ï¿½Í¼Ò»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½GDI�������Ӧ�ú���DeleteObject��ɾ�����������ļ�������
��������һ����������ʱ��Windows����һ���ü�������Ĵ��ţ���̬ΪHRGN����򵥵ļ��������Ǿ��Σ������ֽ������εķ�����
hRgn = CreateRectRgn (xLeft, yTop, xRight, yBottom) ;
����
hRgn = CreateRectRgnIndirect (&rect) ;
��Ҳ���Խ�����Բ��������
hRgn = CreateEllipticRgn (xLeft, yTop, xRight, yBottom) ;
����
hRgn = CreateEllipticRgnIndirect (&rect) ;
CreateRoundRectRgn����Բ�ǵľ��μ�������
��������μ�������ĺ�ʽ�����Polygon��ʽ��
hRgn = CreatePolygonRgn (&point, iCount, iPolyFillMode) ;
point������һ��POINT��̬�Ľṹ���У�iCount�ǵ����Ŀ��iPolyFillMode��ALTERNATE����WINDING������������CreatePolyPolygonRgn�������������μ�������
��ô�������ʣ��������򾿾���ʲô�ر�֮�������������ʽ��������ʾ���˼�����������ã�
iRgnType = CombineRgn (hDestRgn, hSrcRgn1, hSrcRgn2, iCombine) ;
��һ��ʽ��������������hSrcRgn1��hSrcRgn2�������������hDestRgnָ����ϳɵļ�����������������������Ŷ���������Ч�ģ�����hDestRgnÔ����ָ��ļ��������ƻ����ˣ�����ʹ�������ʽʱ��������Ҫ��hDestRgn�ڳ�ʼʱָ��һ��С�ľ��μ������ò£©¡ï¿½
iCombine����˵��hSrcRgn1��hSrcRgn2�����ϣ�����5-9��
��5-9 |
iCombineֵ | �¼������� |
---|---|
RGN_AND | ������������������� |
RGN_OR | �������������ȫ�� |
RGN_XOR | �������������ȫ����ȥ�������� |
RGN_DIFF | hSrcRgn1����hSrcRgn2�еIJ��� |
RGN_COPY | hSrcRgn1��ȫ��������hSrcRgn2�� |
��CombineRgn���ص�iRgnTypeֵ������֮һ��NULLREGION����ʾ�õ�һ���ռ�������SIMPLEREGION����ʾ�õ�һ���򵥵ľ��Ρ���Բ���߶���Σ�COMPLEXREGION����ʾ������Ρ���Բ�����ε���ϣ�ERROR����ʾ�����ˡ�
��������Ĵ��ſ�������ĸ���ͼ��ʽ��
FillRgn (hdc, hRgn, hBrush) ; FrameRgn (hdc, hRgn, hBrush, xFrame, yFrame) ; InvertRgn (hdc, hRgn) ; PaintRgn (hdc, hRgn) ;
FillRgn��FrameRgn��InvertRgn�����FillRect��FrameRect��InvertRect��FrameRgn��xFrame��yFrame�����ǻ���������Χ�ı߿�Ŀ��Ⱥ͸߶ȡ�PaintRgn��ʽ��װ��������Ŀǰ��ˢ������ָ��������������Щ��ʽ���ٶ����������߼����궨��ġ�
��������һ�������ᣬ������ɾ������GDI�������ɾ������
DeleteObject (hRgn) ;
����������ļ���
��
����Ҳ�ڼ����а�����һ����ɫ��InvalidateRect��ʽʹ��ʾ��һ����������ʧЧ��������һ��WM_PAINTѶϢ�����磬������ʹ��InvalidateRect��ʽ�������ʾ���򲢲���һ��WM_PAINTѶϢ��
InvalidateRect (hwnd, NULL, TRUE) ;
������ͨ������GetUpdateRect��ȡ��ʧЧ���ε����꣬���ҿ���ʹ��ValidateRect��ʽʹ��ʾ����ľ�����Ч���������յ�һ��WM_PAINTѶϢʱ����Ч���ε�������Դ�PAINTSTRUCT�ṹ�еõ����ýṹ����BeginPaint��ʽ����ġ������Ч���λ�������һ�����������򡹣��������ڼ����������ͼ��
Windows����������춼�����������Ǿ��εĺ�ʽ�����������InvalidateRect��ValidateRect��
InvalidateRgn (hwnd, hRgn, bErase) ;
��
ValidateRgn (hwnd, hRgn) ;
�������յ�һ������Ч���������WM_PAINTѶϢʱ����������һ���Ǿ��Ρ�
������ʹ������������ʽ֮һ��
SelectObject (hdc, hRgn) ;
��
SelectClipRgn (hdc, hRgn) ;
ͨ����һ����������ѡ��װ�������������Լ��ļ������������������ʹ��װ�����ꡣ
GDIΪ����������һ�ݸ����������ڽ���ѡ��װ������֮�ᣬʹ���߿���ɾ������Windows���ṩ�˼����Լ���������в����ĺ�ʽ����ExcludeClipRect��춽�һ�����δӼ����������ų�����IntersectClipRect��춽���һ���µļ�����������ǰһ������������һ�����εĽ���OffsetClipRgn��춽����������ƶ�����ʾ�������һ���֡�
CLOVER��ʽ
��
CLOVER��ʽ���ĸ���Բ���һ���������ò£¬½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ñ¡ï¿½ï¿½×°ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ð£ï¿½È»ï¿½á»ï¿½ï¿½ï¿½ï¿½ï¿½Ó´ï¿½ï¿½ï¿½Ê¾ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ä³ï¿½ï¿½ï¿½ï¿½ï¿½Ò»Ïµï¿½ï¿½Ö±ï¿½ß£ï¿½ï¿½ï¿½Ð©Ö±ï¿½ï¿½Ö»ï¿½ï¿½ï¿½ï¿½ï¿½Ú¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Þ¶ï¿½ï¿½Ä·ï¿½Î§ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê¾ï¿½ï¿½Í¼5-20��ʾ��
��
ͼ5-20 CLOVER���ø��ӵļ������ò»³ï¿½ï¿½ï¿½Í¼ï¿½ï¿½ |
Ҫ�ó���ķ����������ͼ�Σ��ͱ��������Բ�ı��߹�ʽ�����ÿ��ֱ�ߵĶ˵㡣���ø��ӵļ������򣬿���ֱ�ӻ�����Щ����������Windowsȷ����˵㡣CLOVER���ʽ5-8��ʾ��
��ʽ5-8 CLOVER CLOVER.C /*-------------------------------------------------------------------------- CLOVER.C -- Clover Drawing Program Using Regions (c) Charles Petzold, 1998 ----------------------------------------------------------------------*/ #include <windows.h> #include <math.h> #define TWO_PI (2.0 * 3.14159) LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static TCHAR szAppName[] = TEXT ("Clover") ; 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 ("Draw a Clover"), 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 iMsg, WPARAM wParam, LPARAM lParam) { static HRGN hRgnClip ; static int cxClient, cyClient ; double fAngle, fRadius ; HCURSOR hCursor ; HDC hdc ; HRGN hRgnTemp[6] ; int i ; PAINTSTRUCT ps ; switch (iMsg) { case WM_SIZE: cxClient = LOWORD (lParam) ; cyClient = HIWORD (lParam) ; hCursor = SetCursor (LoadCursor (NULL, IDC_WAIT)) ; ShowCursor (TRUE) ; if (hRgnClip) DeleteObject (hRgnClip) ; hRgnTemp[0] = CreateEllipticRgn (0, cyClient / 3, cxClient / 2, 2 * cyClient / 3) ; hRgnTemp[1] = CreateEllipticRgn (cxClient / 2, cyClient / 3, cxClient, 2 * cyClient / 3) ; hRgnTemp[2] = CreateEllipticRgn (cxClient / 3, 0, 2 * cxClient / 3, cyClient / 2) ; hRgnTemp[3] = CreateEllipticRgn (cxClient / 3, cyClient / 2, 2 * cxClient / 3, cyClient) ; hRgnTemp[4] = CreateRectRgn (0, 0, 1, 1) ; hRgnTemp[5] = CreateRectRgn (0, 0, 1, 1) ; hRgnClip = CreateRectRgn (0, 0, 1, 1) ; CombineRgn (hRgnTemp[4], hRgnTemp[0], hRgnTemp[1], RGN_OR) ; CombineRgn (hRgnTemp[5], hRgnTemp[2], hRgnTemp[3], RGN_OR) ; CombineRgn (hRgnClip, hRgnTemp[4], hRgnTemp[5], RGN_XOR) ; for (i = 0 ; i < 6 ; i++) DeleteObject (hRgnTemp[i]) ; SetCursor (hCursor) ; ShowCursor (FALSE) ; return 0 ; case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ; SelectClipRgn (hdc, hRgnClip) ; fRadius = _hypot (cxClient / 2.0, cyClient / 2.0) ; for (fAngle = 0.0 ; fAngle < TWO_PI ; fAngle += TWO_PI / 360) { MoveToEx (hdc, 0, 0, NULL) ; LineTo (hdc, (int) ( fRadius * cos (fAngle) + 0.5), (int) (-fRadius * sin (fAngle) + 0.5)) ; } EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY: DeleteObject (hRgnClip) ; PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }
��
��춼�����������ʹ��װ�����꣬CLOVER��ʽ������ÿ�ν��յ�WM_SIZEѶϢʱ���½����������򡣼���ǰ���������Ҫ�����ӡ����ڵĿ��ٻ�����һ˲��Ϳ��Ի�������
CLOVER�ӽ����ĸ���Բ��������ʼ�����ĸ���Բ�����hRgnTemp���е�ͷ�ĸ�Ԫ���У�Ȼ�Ὠ���������ա���������
hRgnTemp [4] = CreateRectRgn (0, 0, 1, 1) ; hRgnTemp [5] = CreateRectRgn (0, 0, 1, 1) ; hRgnClip = CreateRectRgn (0, 0, 1, 1) ;
��ʾ�������ҵ�������Բ�������������
CombineRgn (hRgnTemp [4], hRgnTemp [0], hRgnTemp [1], RGN_OR) ;
ͬ������ʾ��������������Բ�������������
CombineRgn (hRgnTemp [5], hRgnTemp [2], hRgnTemp [3], RGN_OR) ;
���ᣬ������������������ϵ�hRgnClip�У�
CombineRgn (hRgnClip, hRgnTemp [4], hRgnTemp [5], RGN_XOR) ;
RGN_XORʶ������춴ӽ���������ų��ص����֡����ᣬɾ��6����ʱ����
for (i = 0 ; i < 6 ; i++) DeleteObject (hRgnTemp [i]) ;
�ë»ï¿½ï¿½ï¿½ï¿½Í¼ï¿½Î±ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½WM_PAINT�Ĵ����ܼòµ¥¡ï¿½ï¿½Ó²ï¿½Ô���趨Ϊ��ʾ��������ģ�ʹ��ֱ�߸�����һЩ������WM_SIZEѶϢ�����ڼ佨��������ѡ��Ϊװ�����ݵļ�������
SetViewportOrg (hdc, xClient / 2, yClient / 2) ; SelectClipRgn (hdc, hRgnClip) ;
���ڣ�ʣ�µľ��ǻ�ֱ���ˣ���360����ÿ��һ�Ȼ�һ����ÿ���ߵij���Ϊ����fRadius�����Ǵ����ĵ���ʾ����Ľ���ľ��룺
fRadius = hypot (xClient / 2.0, yClient / 2.0) ; for (fAngle = 0.0 ; fAngle < TWO_PI ; fAngle += TWO_PI / 360) { MoveToEx (hdc, 0, 0, NULL) ; LineTo (hdc, (int) ( fRadius * cos (fAngle) + 0.5), (int) (-fRadius * sin (fAngle) + 0.5)) ; }
�ڴ���WM_DESTROYѶϢʱ��ɾ���ü�������
DeleteObject (hRgnClip) ;
�ⲻ�DZ�����ͼ�γ�ʽ��Ƶ��������ݵ�ʮ����������ӡ����ʮ���º�ʮ�������۵���ͼ,��ʮ�����������ֺ����壬��ʮ��������metafile��