您当前的位置: 首页 > 

phymat.nico

暂无认证

  • 3浏览

    0关注

    1967博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

使用GDI+画仪表表盘

phymat.nico 发布时间:2015-01-23 13:40:33 ,浏览量:3


 
 
[cpp] view plain copy
  1. Gdiplus::Bitmap * CSlaveView::GetPumpImage( float fMin,float fMax,float fValue,CString strUnit )  
  2. {  
  3.     const float PI=3.141592653;  
  4.     if(fMin>fValue)  
  5.     {  
  6.         fMin=fValue;  
  7.     }  
  8.     if(fValue>fMax)  
  9.     {  
  10.         fMax=fValue;  
  11.     }  
  12.     int nWidth,nHeight;  
  13.     nWidth=nHeight=200;  
  14.     Gdiplus::Rect rect(0,0,nWidth,nHeight);  
  15.     int nTable=5;       //  大格  
  16.     int nScale=5;       //  每小段里面的小格  
  17.     //  每段颜色  
  18.     Gdiplus::Color TableColor[]=  
  19.     {  
  20.         Gdiplus::Color::Green,  
  21.         Gdiplus::Color::Blue,  
  22.         Gdiplus::Color::Cyan,  
  23.         Gdiplus::Color::Yellow,  
  24.         Gdiplus::Color::Red  
  25.     };  
  26.     //  张开的弧度  
  27.     float fRadian=60;  
  28.     //  同心圆半径  
  29.     int nRadius[]=  
  30.     {  
  31.         200,  
  32.         160,  
  33.         90  
  34.     };  
  35.     //  圆心  
  36.     Gdiplus::Point ptCenter(nWidth/2,nHeight+20);  
  37.     //  刻度线长度  
  38.     int nLongScal=15;  
  39.     int nShortScal=10;  
  40.     //  背景色  
  41.     Gdiplus::Color bkColor=Gdiplus::Color::SkyBlue;  
  42.     //  刻度字体,大小,颜色  
  43.     Gdiplus::Color ScaleColor=Gdiplus::Color::Blue;  
  44.     Gdiplus::REAL   ScaleSize=10;  
  45.     CString ScaleFont=_T("Times New Roman");  
  46.   
  47.     Gdiplus::Bitmap *pImage=new Gdiplus::Bitmap(nWidth,nHeight);  
  48.     Graphics *pGraph=Graphics::FromImage(pImage);  
  49.     Gdiplus::StringFormat format;  
  50.     //  消除锯齿  
  51.     format.SetAlignment( StringAlignmentCenter);  
  52.     format.SetLineAlignment(StringAlignmentCenter);  
  53.     pGraph->SetTextRenderingHint(TextRenderingHintAntiAlias);  
  54.     pGraph->Clear(Gdiplus::Color::Transparent);  
  55.     Gdiplus::Color LineColor=Gdiplus::Color::Chocolate;  
  56.     Gdiplus::Pen LinePen(LineColor,1);  
  57.     //  画三段弧  
  58.     rect=Gdiplus::Rect(ptCenter.X-nRadius[0],ptCenter.Y-nRadius[0],2*nRadius[0],2*nRadius[0]);  
  59.     pGraph->DrawArc(&LinePen,rect,180+(90-fRadian/2),fRadian);  
  60.     rect=Gdiplus::Rect(ptCenter.X-nRadius[1],ptCenter.Y-nRadius[1],2*nRadius[1],2*nRadius[1]);  
  61.     pGraph->DrawArc(&LinePen,rect,180+(90-fRadian/2),fRadian);  
  62.     rect=Gdiplus::Rect(ptCenter.X-nRadius[2],ptCenter.Y-nRadius[2],2*nRadius[2],2*nRadius[2]);  
  63.     pGraph->DrawArc(&LinePen,rect,180+(90-fRadian/2),fRadian);  
  64.       
  65.     //  标刻度  
  66.       
  67.     //  分段  
  68.     for(int i=0;iDrawString(  
  69.                     str,  
  70.                     -1,  
  71.                     &Gdiplus::Font(ScaleFont,ScaleSize),  
  72.                     textrc,  
  73.                     &format,  
  74.                     &Gdiplus::SolidBrush(ScaleColor)  
  75.                     );  
  76.                 Gdiplus::Point p2,p3;  
  77.                 int nGap=5;  
  78.                 p3.X=ptCenter.X+(nRadius[0]+0)*cos(f0);  
  79.                 p3.Y=ptCenter.Y-(nRadius[0]+0)*sin(f0);  
  80.                 p2.X=ptCenter.X+(nRadius[0]-nGap)*cos(f0);  
  81.                 p2.Y=ptCenter.Y-(nRadius[0]-nGap)*sin(f0);  
  82.                 pGraph->DrawLine(&LinePen,p2,p3);  
  83.             }  
  84.               
  85.         }  
  86.         else  
  87.         {  
  88.             p0.X=ptCenter.X+(nRadius[1]+nShortScal)*cos(f0);  
  89.             p0.Y=ptCenter.Y-(nRadius[1]+nShortScal)*sin(f0);  
  90.         }  
  91.   
  92.         pGraph->DrawLine(&LinePen,p0,p1);  
  93.     }  
  94.   
  95.     CString strDataFont=_T("Times New Roman");  
  96.     int DataSize=15;  
  97.     Gdiplus::Color DataColor=Gdiplus::Color::Red;  
  98.   
  99.     //  单位  
  100.     Gdiplus::RectF UnitRc;  
  101.     CSize size=CGraphCurveView::GetOutPutTextSize(pGraph,strUnit,strDataFont,DataSize);  
  102.     UnitRc.X=ptCenter.X-size.cx/2;  
  103.     UnitRc.Y=ptCenter.Y-(nRadius[0]-nRadius[1]+nRadius[2]+size.cy/2);  
  104.     UnitRc.Width=size.cx;  
  105.     UnitRc.Height=size.cy;  
  106.     pGraph->DrawString(  
  107.         strUnit,  
  108.         -1,  
  109.         &Gdiplus::Font(strDataFont,DataSize),  
  110.         UnitRc,  
  111.         &format,  
  112.         &Gdiplus::SolidBrush(DataColor)  
  113.         );  
  114.   
  115.     //  数据  
  116.     CString strData;  
  117.     strData.Format(_T("%.0f"),fValue);  
  118.     size=CGraphCurveView::GetOutPutTextSize(pGraph,strData,strDataFont,DataSize);  
  119.     Gdiplus::RectF DataRc;  
  120.     DataRc.X=ptCenter.X-size.cx/2;  
  121.     DataRc.Y=ptCenter.Y-(nRadius[2]-nLongScal);  
  122.     DataRc.Width=size.cx;  
  123.     DataRc.Height=size.cy;  
  124.     pGraph->DrawString(  
  125.         strData,  
  126.         -1,  
  127.         &Gdiplus::Font(strDataFont,DataSize),  
  128.         DataRc,  
  129.         &format,  
  130.         &Gdiplus::SolidBrush(DataColor)  
  131.         );  
  132.   
  133.     //  画指针  
  134.     Gdiplus::Pen PointPen(Gdiplus::Color::Green,2);  
  135.     Gdiplus::Point p0,p1;  
  136.     double f0=((180-fRadian)/2+fRadian/(fMax-fMin)*(-fValue+fMax))/180*PI;  
  137.     p0.X=ptCenter.X+(nRadius[2]*cos(f0));  
  138.     p0.Y=ptCenter.Y-(nRadius[2]*sin(f0));  
  139.     p1.X=ptCenter.X+((nRadius[1]+nShortScal/2)*cos(f0));  
  140.     p1.Y=ptCenter.Y-((nRadius[1]+nShortScal/2)*sin(f0));  
  141.     pGraph->DrawLine(&PointPen,p0,p1);  
  142.   
  143.     delete pGraph;  
  144.     return pImage;  
  145. }  
效果:
关注
打赏
1659628745
查看更多评论
立即登录/注册

微信扫码登录

0.0479s