¡¡¡¡GDI+ÌṩµÄMatrixÀà·â×°±íʾ¼¸ºÎ±äÐεÄ3¡Á3·ÂÉ侨Õó¡£Í¨¹ýÉèÖÃMatrix¶ÔÏ󣬿ÉÒÔÐýת¡¢Ëõ·Å¡¢´íÇлòÆ½ÒÆGraphicsPath¶ÔÏó¡£
¡¡¡¡±í2¡¡MatrixÀà³£ÓóÉÔ±º¯Êý
| ³£ÓóÉÔ±º¯Êý | ¹¦ÄÜÃèÊö |
| Rotate | Ïà¶ÔÓÚÔµã˳ʱÕëÐýתָ¶¨½Ç¶È |
| Scale | Ëõ·Å²Ù×÷ |
| Shear | ´íÇб任²Ù×÷ |
| Translate | Æ½ÒÆ²Ù×÷ |
| Reset | ÖØÖôËMatrix¶ÔÏó£¬Ê¹Æä³ÉΪµ¥Î»¾ØÕó |
¡¡¡¡ÒÔ¾ØÐÎΪÀý£¬Â·¾¶±äÐεÄʾÀý´úÂëÈçÏ£º
| Graphics g(hdc); GraphicsPath path; path.AddRectangle(Rect(40, 10, 200, 50)); g.DrawPath(&Pen(Color(255, 0, 0, 0),1), &path); // ÔÚÓ¦ÓñäÐξØÕó֮ǰ»æÖƾØÐÎ // ·¾¶±äÐÎ Matrix matrix; matrix.Rotate(30.0f); //Ðýת˳ʱÕë30¶È matrix.Scale(0.5f,0.5f);//ËõСһ°ë path.Transform(&matrix);//Ó¦ÓñäÐÎ g.DrawPath(&Pen(Color(255, 0, 0, 0),3), &path); // ÒÔ3ÏóËØ¿íµÄ´ÖÏß»æÖƱ任ºóµÄ¾ØÐÎ |
![]() ͼ4¡¡¾ØÐεÄÐýתÓëËõ·Å |
¡¡¡¡ÀàËÆµÄ£¬ÓÃGraphicsPathÀàµÄWarp·½·¨£¬¿ÉÒÔ¶Ô·¾¶Ó¦ÓÃÓÉÒ»¸ö¾ØÐκÍÒ»¸öƽÐÐËıßÐζ¨ÒåµÄŤÇú±äÐΡ£
¡¡¡¡5¡¢Â·¾¶µÄ´æ´¢Óë¶ÁÈ¡
¡¡¡¡GraphicsPath ¶ÔÏó´æ´¢Ò»ÏµÁÐÖ±Ïߺͱ´Èû¶ûÑùÌõ¡£¾¡¹Ü¿ÉÒÔ½«Èô¸ÉÖÖÀàÐ͵ÄÇúÏߣ¨ÍÖÔ²¡¢»¡ÐκͻùÊýÑùÌõ£©ÌíÖÁ·¾¶£¬µ«ÔÚ´æ´¢µ½Â·¾¶ÖÐ֮ǰ£¬¸÷ÖÖÇúÏß¶¼»á×Ô¶¯×ª»¯Îª±´Èû¶ûÑùÌõ¡£Ö±Ïß¿ÉÒÔÓÉÆðµãºÍÖÕµãÀ´¹¹³É£¬¶ø±´Èû¶ûÑùÌõÇúÏßÊÇÓÉÆðµã¡¢ÖÕµãºÍ¿ØÖƵ㶨Òå¡£ËùÒÔ£¬¶ÔÓÚÒ»¸ö·¾¶µÄÃèÊö£¬¿ÉÒÔͨ¹ý¶Ô·¾¶µãÐÅÏ¢µÄ´¦ÀíÀ´ÊµÏÖ¡£
¡¡¡¡1) ´æ´¢Â·¾¶
¡¡¡¡ÔÚGraphicsPath¶ÔÏóµÄ´æ´¢¹ý³ÌÖУ¬ÓÐÈý¸öº¯Êý·Ç³£ÖØÒª£¬ÄǾÍÊÇGetPointCount¡¢GetPathPointsºÍGetPathTypes£¬ÀûÓÃÕâ3¸öº¯Êý£¬¿ÉÒÔ»ñµÃ·¾¶Öз¾¶µãµÄÊýÄ¿¡¢×ø±êºÍÀàÐÍ¡£¾ßÌå´úÂëÈçÏ£º
| INT count = path.GetPointCount(); // »ñµÃ·¾¶µãÊýÄ¿ ar£¼£¼count; // ´æ´¢Â·¾¶µãÊýÄ¿ dataPoints = new Point[count]; path.GetPathPoints(dataPoints, count); // »ñµÃ·¾¶µã×ø±ê pTypes = new BYTE[count]; path.GetPathTypes(pTypes, count); // »ñµÃ·¾¶µãÀàÐÍ //¿ªÊ¼´æ´¢ for(INT i=0;i£¼count;i++){ ¡¡ar£¼£¼dataPoints[i].X£¼£¼dataPoints[i].Y; // ´æ´¢Â·¾¶µã×ø±ê ¡¡ar£¼£¼pTypes[i]; // ´æ´¢Â·¾¶µãÀàÐÍ } ¡¡¡¡¡¡¡¡ delete dataPoints; // »ØÊÕÄÚ´æ delete pTypes; |
¡¡¡¡2) ¶Áȡ·¾¶
¡¡¡¡ÓÉÓÚGraphicsPathÀàÖÐÖ»Óй¹Ô캯Êý²ÅÄÜÓÉ·¾¶µã´´½¨£¬¶Áȡ·¾¶µÄ·½·¨¾ÍÒª¸´ÔÓһЩÁË¡£¾ßÌå´úÂëÈçÏ£º
| path.Reset(); // ÖØÖ÷¾¶ INT count; ar£¾£¾count; // ¶Áȡ·¾¶µãÊýÄ¿ dataPoints = new Point[count]; // ¶¨Òå·¾¶µã×ø±ê pTypes = new BYTE[count]; // ¶¨Òå·¾¶µãÀàÐÍ //¿ªÊ¼¶ÁÈ¡ for(INT i=0;i£¼count;i++){ ¡¡ar£¾£¾dataPoints[i].X£¾£¾dataPoints[i].Y; // ¶Áȡ·¾¶µã×ø±ê ¡¡ar£¾£¾pTypes[i]; // ¶Áȡ·¾¶µãÀàÐÍ } GraphicsPath pa(dataPoints,pTypes,count); // ÓÉ·¾¶µã´´½¨ÁÙʱ·¾¶pa path.AddPath(&pa,false); // ½«ÁÙʱ·¾¶paÌí¼Óµ½Â·¾¶pathÖÐ ¡¡¡¡¡¡¡¡ delete dataPoints; // »ØÊÕÄÚ´æ delete pTypes; |
¡¡¡¡6¡¢Â·¾¶µÄÏ߶αƽü
¡¡¡¡µ÷ÓÃGraphicsPath¶ÔÏóµÄFlatten·½·¨£¬¿ÉÒÔ½«Â·¾¶ÖеÄÇúÏßÈ«²¿×ª»»³É¶à¶ÎÏàÁ¬µÄÖ±Ï߶Σ¬Èçͼ5Ëùʾ£¬ÕâÖÖ·½·¨Ò²±»³ÆÎª"Àƽ"»ò"չƽ"¡£Flatten·½·¨½ÓÊÕÀƽ²ÎÊý£¬¸Ã²ÎÊýÖ¸¶¨ÀƽµÄ·¾¶ºÍÔʼ·¾¶Ö®¼äµÄ×î´ó¾àÀë¡£
![]() ͼ5 ÔʼÇúÏß·¾¶ÓëÀƽºóµÄ·¾¶£¨ÕâÀïÀƽ²ÎÊýΪ8.0£© |
¡¡¡¡½«Â·¾¶Àƽºó£¬Ê¹ÓÃÖ±Ï߶㤶ÈÀۼӵķ½·¨£¬¿ÉÒÔÇáÒ׵ؼÆËã³ö·¾¶ÇúÏߵij¤¶ÈºÍÆäËûÐÅÏ¢£¬²¢¿ÉÒÔͨ¹ý½µµÍÀƽ²ÎÊýÖµµÄ·½·¨À´Ìá¸ß¼ÆËãµÄ¾«¶È¡£ÓÉÓÚ·¾¶µãµÄ×ø±êÊÇÒÔ¸¡µãÊýµÄÐÎʽ±£´æµÄ£¬Òò¶øÓÃÕâÖÖ·½Ê½µÃµ½µÄÇúÏß³¤¶ÈµÄ¾«¶È»¹ÊÇÏ൱¸ßµÄ¡£
¡¡¡¡½áÊøÓï
¡¡¡¡GraphicsPath»¹ÓкܶàÖÖÓ÷¨£¬±ÈÈç¿ÉÒÔʹÓÃIsVisible·½·¨ÅжÏ×ø±êµãÊÇ·ñÂäÔÚ·¾¶ÉÏ£¬Ê¹ÓÃIsOutlineVisible·½·¨Ö¸Ê¾µ±Ê¹ÓÃÖ¸¶¨µÄPen¶ÔÏó»æÖÆ´ËGraphicsPath ¶ÔÏóʱ£¬Ö¸¶¨µãÊÇ·ñ°üº¬ÔÚºóÕßµÄÂÖÀªÄÚ¡£
¡¡¡¡´Ó¿ª·¢µÄʵ¼ù¹ý³ÌÀ´¿´£¬Ê¹ÓÃGDI+½øÐÐͼÐαà³Ì£¬±ÈÔÏȵÄGDI±à³Ì¹ý³ÌÒªÈÝÒ׺ܶ࣬¶øÇÒ×îÖÕµÄͼÐι¦ÄÜÒ²¸üÇ¿´ó¡£



