使用GDI+绘制波形!!!(高分求解)

liuka 2009-01-12 05:49:03
如题
我想使用GDI+绘制一个像任务管理器中的那个波形显示控件
请问该怎么做 ??
谢谢
...全文
276 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xingtianxia_1 2009-01-16
  • 打赏
  • 举报
回复
你就晕吧 还到这里来定制功能代码 你也太有意思了吧
liuka 2009-01-14
  • 打赏
  • 举报
回复
谢谢各位
我要的就是这种效果
fjwyshan 2009-01-14
  • 打赏
  • 举报
回复
友情up
noenoughmemory 2009-01-14
  • 打赏
  • 举报
回复
友情up
ilovedrv 2009-01-14
  • 打赏
  • 举报
回复
直接用这个,可以实现类似任务管理器效果

http://www.codeproject.com/KB/miscctrl/histogramctrl.aspx
Tinary3v0 2009-01-13
  • 打赏
  • 举报
回复
你把给你的函数里面的宏定义
#define  X0 100.0           //绘图起点X
#define Y0 400.0 //绘图起点Y
#define B PointF( X0,Y0 ) //绘图起点

定义成成员变量
然后在Timer事件中 改变他们的值 绘图就动起来了。
DrawMap(CDC *pDC)在OnDraw里面调用 Timer里面改变值起点位置 使用Invalidate刷新视图即可
liuka 2009-01-13
  • 打赏
  • 举报
回复
谢谢大家
我希望绘制的效果是可以根据时间动态的变化的波形
就像windows任务管理器的那个 CPU使用记录 的波形图形
fjwyshan 2009-01-13
  • 打赏
  • 举报
回复
ding
noenoughmemory 2009-01-13
  • 打赏
  • 举报
回复
ding
Show_Mike 2009-01-13
  • 打赏
  • 举报
回复
采用3楼方法,问题已被解决.但是,大家不妨将思路不断扩展一下.例如,采用GDI也可以解决这个问题,只要用moveto, lineto等命令即可.
lanmaozi 2009-01-13
  • 打赏
  • 举报
回复
加个定时器重绘
fishion 2009-01-12
  • 打赏
  • 举报
回复
http://blog.csdn.net/kissyfish/archive/2008/11/09/3261111.aspx
闪破风浪 2009-01-12
  • 打赏
  • 举报
回复
楼上的方法不错~
Tinary3v0 2009-01-12
  • 打赏
  • 举报
回复
用GDI或这GDI+在OnPaint或者OnDraw里面绘制图形 给你一个GDI+的绘制曲线的代码,在OnPaint或者OnDraw中调用:
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;
}

效果如下:
flm007 2009-01-12
  • 打赏
  • 举报
回复
Pen pen(Color::Gray, 1);
Graphics graphics;
graphics.DrawLine(&pen, cx, cy);
菜牛 2009-01-12
  • 打赏
  • 举报
回复
设置好数据,用Graphics::DrawLine方法即可。

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧