�������� Linux Tags

5. ͼ�λ���

ͼ��װ�ý��棨GDI��Graphics Device Interface����Windows����ϵͳ������������Ѷ��ʾ����ӡ��������ʾͼ�Ρ�����������Ϊ��������GDI��Windows�dz���Ҫ�IJ��֡���ֻ��ΪWindows��д��Ӧ��ϵͳ����ʾ�Ӿ���Ѷʱʹ��GDI������Windows����Ҳʹ��GDI����ʾʹ���߽�����������繦�ܱ��������С�ͼʾ�ͻ����αꡣ

���ҵ��ǣ����Ҫ��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�ļ��ٸ���ʽ���п��Է�Ϊ�����ࣺ

  •  È¡ï¿½Ã£ï¿½ï¿½ï¿½ï¿½ß½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Í·Å£ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½×°ï¿½ï¿½ï¿½ï¿½ï¿½ÝµÄºï¿½Ê½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç°ï¿½ï¿½ï¿½ï¿½Â½ï¿½ï¿½ï¿½ï¿½Ñ¾ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ú»ï¿½Í¼Ê±ï¿½ï¿½Òª×°ï¿½ï¿½ï¿½ï¿½ï¿½Ý´ï¿½ï¿½Å¡ï¿½GetDC��RealseDC��ʽ�����ڷ�WM_PAINT��ѶϢ�����ڼ���������һ�㣬��BeginPaint��EndPaint��ʽ����Ȼ�ڼ�����������USERģ�������GDIģ���һ���֣��ڽ��л�ͼ��WM_PAINTѶϢ�����ڼ�ʹ�á��������ϻ�������й�װ�����ݵ�����һЩ��ʽ��
    ��
  •  È¡ï¿½ï¿½ï¿½Ð¹ï¿½×°ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ñ¶ï¿½Äºï¿½Ê½ ï¿½ï¿½ï¿½Ôµï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½SYSMETS��ʽΪ��������ʹ��GetTextMetrics��ʽ��ȡ���й�װ��������Ŀǰ��ѡ����ijߴ���Ѷ���ڱ������棬���ǽ�����һ��ȡ�÷dz��㷺��װ��������Ѷ��>DEVCAPS1��ʽ��
    ��
  •  ï¿½ï¿½Í¼ï¿½ï¿½Ê½ ï¿½ï¿½È»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç°ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ö®ï¿½á£¬ï¿½ï¿½Ð©ï¿½ï¿½Ê½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Òªï¿½Ä²ï¿½ï¿½Ö¡ï¿½ï¿½ï¿½ï¿½ï¿½Ò»ï¿½ï¿½ï¿½Ð£ï¿½ï¿½ï¿½ï¿½ï¿½Ê¹ï¿½ï¿½TextOut��ʽ���Ӵ�����ʾ������ʾһЩ���֡����ǽ�����������GDI��ʽ�������������ߡ����������ڵ�ʮ���º͵�ʮ���»��ῴ����ν�������ͼͼ��
    ��
  •  ï¿½è¶¨ï¿½ï¿½È¡ï¿½ï¿½×°ï¿½ï¿½ï¿½ï¿½ï¿½Ý²ï¿½ï¿½ï¿½ï¿½Äºï¿½Ê½ ×°ï¿½ï¿½ï¿½ï¿½ï¿½ÝµÄ¡ï¿½ï¿½ï¿½ï¿½Ô¡ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ð¹Ø»ï¿½Í¼ï¿½ï¿½Ê½ï¿½ï¿½Î¹ï¿½ï¿½ï¿½ï¿½ï¿½Ï¸ï¿½Ú¡ï¿½ï¿½ï¿½ï¿½ç£¬ï¿½ï¿½SetTextColor��ָ��TextOut�������������������ʽ�������Ƶ�����ɫ�ʡ��ڵ�������SYSMETS��ʽ�У�����ʹ��SetTextAlign������GDI��TextOut��ʽ�е��ִ��Ŀ�ʼλ��Ӧ�����ִ����ұ߶������ڶ�����ߡ�װ�����ݵ��������Զ���Ԥ��ֵ��ȡ��װ������ʱ��ЩԤ��ֵ���趨���ˡ�������е�Set��ʽ��������Ӧ��Get��ʽ����������ȡ��Ŀǰװ���������ԡ�
    ��
  •  Ê¹ï¿½ï¿½GDI����ĺ�ʽ GDI���������е���ҡ����Ⱦ�һ�����ӣ��ڶ�ʱʹ��GDI���Ƶ�����ֱ�߶���ʵ�߲�����һ����׼�Ŀ��ȡ�������ϣ�����Ƹ�ϸ��ֱ�ߣ���������һϵ�еĵ��̻�����ɵ�ֱ�ߡ������ߵĿ��Ⱥ������ߵĻ�����ʽ����װ�����ݵ����ԣ�����һ�����߼����ʡ������硣������ͨ����CreatePen�� CreatePenIndirect��ExtCreatePen��ʽ��ָ����Щ����������һ���߼����ʣ���Щ��ʽ����һ���߼����ʵĴ��ţ���Ȼ��Щ��ʽ����Ϊ��GDI��һ���֣����Ǻʹ����GDI��ʽ���в�һ�������Dz�Ҫ��װ�����ݵĴ��ţ���Ҫʹ��������ʣ���Ҫ�����ʴ���ѡ��װ�����ݡ�������Ϊ��װ��������Ŀǰѡ�еĻ��ʾ���װ�����ݵ�һ�����ԡ������������κ��߶�ʹ��������ʣ�Ȼ�ᣬ������ȡ��װ�������еĻ���ѡ�ñ£¬²ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç±ï¿½Òªï¿½Ä£ï¿½ï¿½ï¿½Îªï¿½ï¿½ï¿½Ê¶ï¿½ï¿½ï¿½Õ¼ï¿½ï¿½ï¿½Ë·ï¿½ï¿½ï¿½Ä¼ï¿½ï¿½ï¿½ï¿½ï¿½Õ¼ä¡£ï¿½ï¿½ï¿½Ë»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½â£¬GDI�������춽�������������Ļ�ˢ�����塢����ͼ�Լ�GDI������һЩ���档
    ��

GDI����ͼ��
��

����өĻ��ӡ��������ʾ��ͼ����̬�������Ա���Ϊ���࣬ͨ������Ϊ������ͼ�Ρ��������ǣ�

  •  Ö±ï¿½ßºï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Í¼ï¿½Î»ï¿½ï¿½ï¿½ÏµÍ³ï¿½Ä»ï¿½ï¿½ï¿½ï¿½ï¿½GDI֧Ԯֱ�ߡ����Ρ���Բ��������Բ���Ӽ���Ҳ����������˵�ġ�Բ��������ԲԲ���ϵIJ������߼���ν�ġ������Լ����������ߣ�Bezier spline�������ǽ��ڱ����зֱ�����ǽ��н��ܡ����и����ӵ����߿������ߣ�polyline�����棬����ͨ��һ��dz��̵�ֱ��������һ�����ߡ�������װ��������ѡ�е�Ŀǰ���ʻ��ơ�
    ��
  •  ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Ò»Ïµï¿½ï¿½Ö±ï¿½ß»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ß·ï¿½ï¿½ï¿½ï¿½Ò»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê±ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê¹ï¿½ï¿½Ä¿Ç°GDI��ˢ���������ͼ�������ˢ������ʵ��ɫ�ʡ�ͼ����������һϵ�е�ˮƽ����ֱ���߶ԽDZ�ǣ��������������ڴ�ֱ����ˮƽ�ظ��ĵ���ͼͼ��
    ��
  •  ï¿½ï¿½ï¿½ï¿½Í¼ ï¿½ï¿½ï¿½ï¿½Í¼ï¿½ï¿½Î»Ôªï¿½Ä¾ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ð£ï¿½ï¿½ï¿½Ð©Î»Ôªï¿½ï¿½Ó¦ï¿½ï¿½ï¿½Ê¾ï¿½è±¸ï¿½Ïµï¿½Í¼ï¿½Ø£ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Î»ÔªÓ³ï¿½ï¿½Í¼ï¿½ÎµÄ»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ß¡ï¿½ï¿½ï¿½ï¿½ï¿½Í¼Í¨ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ñ¶ï¿½ï¿½Ê¾ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ó¡ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê¾ï¿½ï¿½ï¿½Ó£ï¿½Ò»ï¿½ã¶¼ï¿½ï¿½ï¿½ï¿½Êµï¿½Ä£ï¿½Í¼ï¿½ñ¡£µï¿½ï¿½ï¿½Í¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê¾ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ù»ï¿½ï¿½Æµï¿½Ð¡Í¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Í¼Ê¾ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Î±ï¿½ï¿½Ô¼ï¿½ï¿½ï¿½Ó¦ï¿½Ã¹ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ð³ï¿½ï¿½ÖµÄ°ï¿½Å¥ï¿½È£ï¿½ï¿½ï¿½GDI֧Ԯ������̬�ĵ���ͼ����ʽ�ģ���Ȼ���dz����ã���װ����ء�����ͼ����GDI��������µģ���Windows 3.0�ģ���װ���޹ء�����ͼ������DIB�������Դ����ڴ�Ƭ�����С���ʮ���º͵�ʮ�������۵���ͼ��
    ��
  •  ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½ï¿½Öµï¿½ï¿½ï¿½Ñ§Î¶ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Í¼ï¿½Îµï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Å¨ï¿½ï¿½ï¿½ï¿½ï¿½ÖºÍ¼ï¿½ï¿½ï¿½ï¿½ï¿½Ä´ï¿½Í³Ó¡Ë¢ï¿½ï¿½ï¿½Ð¹Ø£ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ó¡Ë¢ï¿½ï¿½ï¿½Ë¿ï¿½ï¿½ï¿½ÎªÒ»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ë£ï¿½ï¿½ï¿½ï¿½ï¿½Í¨ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ÐµÄµï¿½ï¿½ï¿½Í¼ï¿½ï¿½ÏµÍ³ï¿½ï¿½ï¿½î¸´ï¿½ÓµÄ²ï¿½ï¿½Ö£ï¿½ï¿½ï¿½ï¿½Ò£ï¿½ï¿½ï¿½ï¿½Ê¶ï¿½Ö»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Òªï¿½ï¿½Ä»ï¿½ï¿½ï¿½Ò²ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Òªï¿½Ä²ï¿½ï¿½Ö¡ï¿½ï¿½ï¿½ì¶¶ï¿½ï¿½ï¿½GDI���������ȡ��������Ѷ�����Ͻṹ��Windows�����Ӵ�IJ���֮һ����Windows 3.1��ʼ��GDI��ʼ֧ԮTrueType���壬�������������������߻����Ͻ����ģ����������������߿�������GDI��ʽ���������������Ժʹ����С�Ŀ��ǣ�Windows 98����֧Ԯ��ʽ�ĵ������塣�һ��ڵ�ʮ�����������塣
    ��

��������
��

GDI�����������޷���ô���׵ط��࣬�����ǣ�

  •  Ó³ï¿½ï¿½Ä£Ê½ï¿½Í±ä»» ï¿½ï¿½È»ï¿½Ú¶ï¿½ï¿½ï¿½Í¼ï¿½ï¿½Îªï¿½ï¿½Î»ï¿½ï¿½ï¿½Ð»ï¿½Í¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç¾ï¿½ï¿½ï¿½ì¶´Ë¡ï¿½GDIӳ��ģʽ��������Ӣ�磨���������Լ���֮һӢ�磩�����׻����κ�����ʹ�õĵ�λ����ͼ��Windows NT��֧Ԯ��ͳ���������������ʾ�ġ�����任���� ��������б����תͼ����������ҵ��ǣ���Windows 98�в�֧Ԯ����任����
    ��
  •  Metafile Metafile���Զ���λ��ʽ�����GDI����ϡ�Metafile��Ҫ���ͨ�������崫������ͼ��,��ʮ���»�����metafile��
    ��
  •  ï¿½ï¿½Í¼ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Í¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½×´ï¿½ï¿½ï¿½ï¿½Ä¸ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Í¨ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Îªï¿½Ï¼òµ¥µÄ»ï¿½Í¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ï¡ï¿½ï¿½ï¿½GDI�ڲ�����ͼ������˴���Ϊ������������ͼ���������������⣬����һϵ��ɨ���ߵ���ʽ���档�����Խ���ͼ������춻�������������ͼ�κͼ��á�
    ��
  •  Â·ï¿½ï¿½ Â·ï¿½ï¿½ï¿½ï¿½GDI�ڲ������ֱ�ߺ����ߵļ��ϡ�·��������춻�ͼ������ͼ�κͼ��ã�������ת��Ϊ��ͼ����
    ��
  •  ï¿½ï¿½ï¿½ï¿½ ï¿½ï¿½Í¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê¾ï¿½ï¿½ï¿½ï¿½ï¿½Ä³Ò»ï¿½ï¿½ï¿½ï¿½ï¿½Ð£ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Î½ï¿½Ä¼ï¿½ï¿½Ã¡ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ç²ï¿½ï¿½Ç¾ï¿½ï¿½Î¶ï¿½ï¿½ï¿½ï¿½Ô£ï¿½ï¿½ï¿½ï¿½ï¿½Í¨ï¿½ï¿½ï¿½ï¿½Í¨ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Â·ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ä¡ï¿½
    ��
  •  ï¿½ï¿½É«ï¿½ï¿½ ï¿½Ô¶ï¿½ï¿½ï¿½É«ï¿½ï¿½Í¨ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê¾256ɫ����ʾ����Windows��������Щɫ��֮�е�20���Թ�ϵͳʹ�ã������Ըı�����236��ɫ�ʣ���׼ȷ��ʾ������ͼ��ʽ�������ʵͼ�ñ¡£µï¿½Ê®ï¿½ï¿½ï¿½Â»ï¿½ï¿½ï¿½ï¿½Ûµï¿½É«ï¿½Ì¡ï¿½
    ��
  •  ï¿½ï¿½Ó¡ ï¿½ï¿½È»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ñ¶ï¿½ï¿½Ê¾ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ú±ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ñ§ï¿½ï¿½ï¿½ï¿½È«ï¿½ï¿½ÖªÊ¶ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ó¡ï¿½ï¿½ï¿½ï¿½Ê®ï¿½ï¿½ï¿½Â»ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ó¡ï¿½ï¿½
    ��

װ������
��

�ڿ�ʼ��ͼ֮ǰ�������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) ;

���Ӵ�֮��д�뻭��һ���Dz�ǡ���ģ������һЩ��ͬѰ����Ӧ�ó�ʽ��˵���������ܷ��㣨������ͨ���ں���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��ʹ���ߺ�����ȷ����Ѷ��ʾ����ͼ�ش�С���ڡ�����̨����ִ�С���ʾ��������ѡ���趨��ҳ���ǩ���ڱ��С��������򡹵���λ�У����Կ�����Щͼ�سߴ�֮һ��

  • 640��480ͼ��
    ��
  • 800��600ͼ��
    ��
  • 1024��768ͼ��
    ��
  • 1280��1024ͼ��
    ��
  • 1600��1200ͼ��
    ��

������Щ����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�����ߺ�ʽ�ǣ�

  • LineTo ��ֱ�ߡ�
    ��
  • Polyline��PolylineTo ��һϵ��������ֱ�ߡ�
    ��
  • PolyPolyline �������������ߡ�
    ��
  • Arc ����Բ�ߡ�
    ��
  • PolyBezier��PolyBezierTo �����������ߡ�
    ��

    ���⣬Windows NT��֧Ԯ3�ֻ��ߺ�ʽ��

  • ArcTo��AngleArc ����Բ�ߡ�
    ��
  • PolyDraw ��һϵ�����������Լ����������ߡ�
    ��

    ��������ʽWindows 98��֧Ԯ��

    �ڱ��µ������ҽ�����һЩ�Ȼ���Ҳ��������ͼ�εķ������ĺ�ʽ����Щ��ʽ�ǣ�

  • Rectangle ������
    ��
  • Ellipse ����Բ��
    ��
  • RoundRect ����Բ�ǵľ��Ρ�
    ��
  • Pie ����Բ��һ���֣�ʹ�俴������һ�����Ρ�
    ��
  • Chord ����Բ��һ���֣��Գʹ��Ρ�
    ��

װ�����ݵ��������Ӱ��������Щ��ʽ�����ߵ���ۣ�Ŀǰ���ʵ�λ�ã������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��ʽ�ϸ���˵���ǻ��ߺ�ʽ��û������Щ��ʽ���ڻ��ߣ�������ͬʱ�����뻭ˢ����һ��������������ˢ�ڶ�Ϊ��ɫ����˵�����һ��ʹ����Щ��ʽʱ�������ܲ���ע�⵽���Dz�ֻ�ǻ��ߡ��ϸ��˵����Щ��ʽ������桸�������򡹵�С�ڣ��������һ����������������ǡ�

�����ᵽ�ĺ�ʽ��һ����ͬ���ԣ������Ƕ�������һ�����α߽������ͼ�ġ�������һ������������Ŀ򣬼����߽��(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���ʱ��Ӧ������������������

  • ����Ҫɾ���Լ�����������GDI�����
    ��
  • ��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����ʽ��

  • ��������x���y���ƶ�������Ԫ��
    ��

    OffsetRect (&rect, x, y) ;

  • �������εijߴ磺
    ��

    InflateRect (&rect, x, y) ;

  • ���θ���λ�趨Ϊ0��
    ��

    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��ʽ���ĸ���Բ���һ���������򣬽������������ѡ��װ�������У�Ȼ�ử�����Ӵ���ʾ��������ij�����һϵ��ֱ�ߣ���Щֱ��ֻ�����ڼ����������޶��ķ�Χ�������ʾ��ͼ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��