效果:
- Gdiplus::Bitmap * CSlaveView::GetPumpImage( float fMin,float fMax,float fValue,CString strUnit )
- {
- const float PI=3.141592653;
- if(fMin>fValue)
- {
- fMin=fValue;
- }
- if(fValue>fMax)
- {
- fMax=fValue;
- }
- int nWidth,nHeight;
- nWidth=nHeight=200;
- Gdiplus::Rect rect(0,0,nWidth,nHeight);
- int nTable=5; // 大格
- int nScale=5; // 每小段里面的小格
- // 每段颜色
- Gdiplus::Color TableColor[]=
- {
- Gdiplus::Color::Green,
- Gdiplus::Color::Blue,
- Gdiplus::Color::Cyan,
- Gdiplus::Color::Yellow,
- Gdiplus::Color::Red
- };
- // 张开的弧度
- float fRadian=60;
- // 同心圆半径
- int nRadius[]=
- {
- 200,
- 160,
- 90
- };
- // 圆心
- Gdiplus::Point ptCenter(nWidth/2,nHeight+20);
- // 刻度线长度
- int nLongScal=15;
- int nShortScal=10;
- // 背景色
- Gdiplus::Color bkColor=Gdiplus::Color::SkyBlue;
- // 刻度字体,大小,颜色
- Gdiplus::Color ScaleColor=Gdiplus::Color::Blue;
- Gdiplus::REAL ScaleSize=10;
- CString ScaleFont=_T("Times New Roman");
- Gdiplus::Bitmap *pImage=new Gdiplus::Bitmap(nWidth,nHeight);
- Graphics *pGraph=Graphics::FromImage(pImage);
- Gdiplus::StringFormat format;
- // 消除锯齿
- format.SetAlignment( StringAlignmentCenter);
- format.SetLineAlignment(StringAlignmentCenter);
- pGraph->SetTextRenderingHint(TextRenderingHintAntiAlias);
- pGraph->Clear(Gdiplus::Color::Transparent);
- Gdiplus::Color LineColor=Gdiplus::Color::Chocolate;
- Gdiplus::Pen LinePen(LineColor,1);
- // 画三段弧
- rect=Gdiplus::Rect(ptCenter.X-nRadius[0],ptCenter.Y-nRadius[0],2*nRadius[0],2*nRadius[0]);
- pGraph->DrawArc(&LinePen,rect,180+(90-fRadian/2),fRadian);
- rect=Gdiplus::Rect(ptCenter.X-nRadius[1],ptCenter.Y-nRadius[1],2*nRadius[1],2*nRadius[1]);
- pGraph->DrawArc(&LinePen,rect,180+(90-fRadian/2),fRadian);
- rect=Gdiplus::Rect(ptCenter.X-nRadius[2],ptCenter.Y-nRadius[2],2*nRadius[2],2*nRadius[2]);
- pGraph->DrawArc(&LinePen,rect,180+(90-fRadian/2),fRadian);
- // 标刻度
- // 分段
- for(int i=0;iDrawString(
- str,
- -1,
- &Gdiplus::Font(ScaleFont,ScaleSize),
- textrc,
- &format,
- &Gdiplus::SolidBrush(ScaleColor)
- );
- Gdiplus::Point p2,p3;
- int nGap=5;
- p3.X=ptCenter.X+(nRadius[0]+0)*cos(f0);
- p3.Y=ptCenter.Y-(nRadius[0]+0)*sin(f0);
- p2.X=ptCenter.X+(nRadius[0]-nGap)*cos(f0);
- p2.Y=ptCenter.Y-(nRadius[0]-nGap)*sin(f0);
- pGraph->DrawLine(&LinePen,p2,p3);
- }
- }
- else
- {
- p0.X=ptCenter.X+(nRadius[1]+nShortScal)*cos(f0);
- p0.Y=ptCenter.Y-(nRadius[1]+nShortScal)*sin(f0);
- }
- pGraph->DrawLine(&LinePen,p0,p1);
- }
- CString strDataFont=_T("Times New Roman");
- int DataSize=15;
- Gdiplus::Color DataColor=Gdiplus::Color::Red;
- // 单位
- Gdiplus::RectF UnitRc;
- CSize size=CGraphCurveView::GetOutPutTextSize(pGraph,strUnit,strDataFont,DataSize);
- UnitRc.X=ptCenter.X-size.cx/2;
- UnitRc.Y=ptCenter.Y-(nRadius[0]-nRadius[1]+nRadius[2]+size.cy/2);
- UnitRc.Width=size.cx;
- UnitRc.Height=size.cy;
- pGraph->DrawString(
- strUnit,
- -1,
- &Gdiplus::Font(strDataFont,DataSize),
- UnitRc,
- &format,
- &Gdiplus::SolidBrush(DataColor)
- );
- // 数据
- CString strData;
- strData.Format(_T("%.0f"),fValue);
- size=CGraphCurveView::GetOutPutTextSize(pGraph,strData,strDataFont,DataSize);
- Gdiplus::RectF DataRc;
- DataRc.X=ptCenter.X-size.cx/2;
- DataRc.Y=ptCenter.Y-(nRadius[2]-nLongScal);
- DataRc.Width=size.cx;
- DataRc.Height=size.cy;
- pGraph->DrawString(
- strData,
- -1,
- &Gdiplus::Font(strDataFont,DataSize),
- DataRc,
- &format,
- &Gdiplus::SolidBrush(DataColor)
- );
- // 画指针
- Gdiplus::Pen PointPen(Gdiplus::Color::Green,2);
- Gdiplus::Point p0,p1;
- double f0=((180-fRadian)/2+fRadian/(fMax-fMin)*(-fValue+fMax))/180*PI;
- p0.X=ptCenter.X+(nRadius[2]*cos(f0));
- p0.Y=ptCenter.Y-(nRadius[2]*sin(f0));
- p1.X=ptCenter.X+((nRadius[1]+nShortScal/2)*cos(f0));
- p1.Y=ptCenter.Y-((nRadius[1]+nShortScal/2)*sin(f0));
- pGraph->DrawLine(&PointPen,p0,p1);
- delete pGraph;
- return pImage;
- }
![]()
使用GDI+画仪表表盘
关注
打赏