19,469
社区成员
发帖
与我相关
我的任务
分享
#define X0 100.0 //绘图起点X
#define Y0 400.0 //绘图起点Y
#define B PointF( X0,Y0 ) //绘图起点
void DrawMap(CDC *pDC)
{
//-------定义绘图宏------------------
//可以改动下面的宏定义来改变图形的各个属性
#define Xm REAL( 1.0 ) //两个像素间隔为1秒
#define Ym REAL( 0.5 ) //一个像素间隔为1“单位”?
#define X0 100.0 //绘图起点X
#define Y0 400.0 //绘图起点Y
#define B PointF( X0,Y0 ) //绘图起点
#define MX 10 //点个数 根据情况可动态设置
#define Vl 25
//-----------------------------------
pDC->SetMapMode( MM_ANISOTROPIC );
pDC->SetBkMode( TRANSPARENT );
Graphics graphics( pDC->m_hDC ); //GDI+绘图句柄
//--------------绘制X/Y轴上的短线以及标注的文字--------------------------
CFont ttFnt;
ttFnt.CreateFont( 12,0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH&FF_SWISS,"新宋体");
CFont* pOldFnt = pDC->SelectObject(&ttFnt);
Pen dPen( Color( 255, 0, 0, 0 ), 1 );
for( int ix = 0; ix < 400*Xm/Vl; ix ++ )
{
graphics.DrawLine( &dPen, PointF( B.X + ix*Vl, B.Y - 3 ),PointF( B.X + ix*Vl, B.Y ) );
CString xStr;
xStr.Format("%d",int( ix*Vl/Xm ) );
pDC->TextOut( B.X + ix*Vl - 8, B.Y,xStr);
}
for( int iy = 0; iy < 700*Ym/Vl; iy ++ )
{
graphics.DrawLine( &dPen, PointF( B.X + 3, B.Y - iy*Vl ),PointF( B.X, B.Y - iy*Vl ) );
if( iy != 0)
{
CString yStr;
yStr.Format("%d",int( iy*Vl/Ym ) );
pDC->TextOut( B.X - 20, B.Y - iy*Vl - 5,yStr);
}
}
pDC->SelectObject(&pOldFnt);
//---------------------绘制X/Y坐标轴--------在这里可以绘制网格-----------
Pen xPen( Color(255, 0, 0, 0), 1 );
xPen.SetLineCap(LineCapFlat, LineCapArrowAnchor, DashCapFlat);
graphics.DrawLine( &xPen, B, PointF( B.X, B.Y-700*Ym ) );
graphics.DrawLine( &xPen, B, PointF( B.X+400*Xm, B.Y ) );
//-------------------------------------------------------------------
Pen grPen( Color(255, 0, 255, 0), 2 ); //绿色曲线画笔
Pen rdPen( Color(255, 255, 0, 0), 2 ); //红色点画笔
Pen dtPen( Color( 32, 0, 0, 0), 1 ); //虚线画笔
REAL dashValues[4] = {5, 3, 5, 3};
dtPen.SetDashPattern(dashValues, 4);
//-------------------------------------------------------------------
PointF points[] = {
PointF(210,550), PointF(215,542), PointF(230,532), PointF(243,526), PointF(252,514),
PointF(260,507), PointF(273,493), PointF(284,482), PointF(296,471), PointF(300,462)
};
PointF* dwP = new PointF[ MX ];
for( int i = 0; i< MX; i++ ) //原始数据坐标转换到绘图坐标
{
dwP[ i ].X = B.X + points[i].X* Xm;
dwP[ i ].Y = B.Y - points[i].Y* Ym;
}
//--------------------------------------------------------------------
GraphicsPath path; path.AddCurve( dwP, MX );
graphics.DrawPath(&grPen, &path); //绘制平滑曲线 不平滑使用DrawLines
//--------------------------------------------------------------------
if( TRUE ) //是否绘制数据点以及虚线开关
for( int k = 0; k< MX; k++ )
{
graphics.DrawEllipse( &rdPen, dwP[ k ].X-1, dwP[ k ].Y-1,REAL( 2), REAL( 2 ) ); //绘制红色数据点
graphics.DrawLine( &dtPen,dwP[ k ], PointF( dwP[ k ].X, B.Y) ); //绘制坐标指示虚线
graphics.DrawLine( &dtPen,dwP[ k ], PointF( B.X, dwP[ k ].Y) );
}
//---------------------------------------------------------------------
pOldFnt->DeleteObject();
delete [] dwP;
}