VC6.0中画曲线的函数

合集下载

polyline的使用方法

polyline的使用方法

polyline的使用方法
搞自动化会经常遇到一个问题就是记录实时的曲线,通常做法是首先将数据保存在一个记事本中,或数据库。

使用VB或DELPHI可以直接调用现成的控件画图,只是控制起来不方便。

所以使用VC就需要程序来控制。

在网上搜了好多就是没有一个完整的例子。

下面就是使用VC6.0实现画任意曲线的方法之一。

void CLineView::OnLine()
{
// TODO: Add your command handler code here
POINT pts[5];
long a[5]={20,50,60,10,180};
long b[5]={10,20,30,40,50};
for(int i=0;i<5;i++)
{
pts[i].x=b[i];
pts[i].y=a[i];
}
//selectobject(hDC,InVisiblepen);
//const POINT* ppts=pts;
HDC hdc;
hdc=::GetDC(m_hWnd);
::Polyline(hdc,pts,5);
::ReleaseDC(m_hWnd,hdc);
}
首先做一个消息响应函数,在此基础上编写上述代码就可以实现画线功能。

可以把记事本的数据放入a中,令b为时间即可。

VC中使用TeeChart绘制实时曲线

VC中使用TeeChart绘制实时曲线

VC中使用TeeChart绘制实时曲线上网找了一个teechart8的Activex版本,在VC6下使用正常,感觉功能挺强大的,于是决定认真用一用,我是完全完全的新手,请高手们直接忽略我,或者给我提些好的建议。

我得到的是一个teechart8.ocx文件,这是Activex的文件,使用之前先注册一下,将该文件放入系统目录下,然后打开命令提示符,或者直接在运行窗口输入:regsvr32 T eeChart8.ocx,然后会有一个注册成功的提示框,说明我们的ActiveX控件注册成功,在VC6下就可以使用了。

如果不想使用了,可以使用regsvr32 -u TeeChart8.ocx 解除对teechart8的注册。

我的第一个任务是熟悉teechart控件。

首先新建一个基于MFC的exe工程,选择对话框,其他默认。

进入工程以后可以看到类视图中只有系统生成的默认的几个类,我先在类视图中在工程名上点右键新建两个文件夹,一个叫src,一个叫tee,然后把默认生成的几个类(dlg,app,about三个类)拖放到src文件夹中。

做这一步实际上没有什么实质的意义,只是为了看起开比较方便,因为一会儿添加了teechart8以后会有很多的类添加进来,看起来非常困难,所以先提前把他们分开。

闲话不多说,进入资源视图,点击主对话框后,删除todo那个静态文本。

下一步我们要在这个对话框上放置一个teechart图表,但是工具栏中没有,所以需要先添加一下。

依次点击工程-》增加到工程-》components and controls,进入对话框后选择register ed ActiveX controls,找到TeeChart Pro Activex control v8后点击insert,会弹出添加类的对话框,左边的列表里面是可以选择添加的类,现在我还不太了解具体类的作用,所以只好一并添加了,点击确定以后回到资源视图会发现工具栏下面多累一个圆形的小图标,这就是我们的teechart8控件了。

一个c++实现的实时曲线显示类

一个c++实现的实时曲线显示类

一个c++实现的实时曲线显示类目录1.简介 (2)2.功能描述 (2)3.编译和链接 (2)4.运行环境 (2)5.兼容性和可移植性 (2)6.接口和使用 (2)6.1. 接口 (2)6.2. 使用方法 (3)7.范例 (3)1.简介一个c++实现的实时曲线显示类。

2.功能描述本封装模块的功能就是实现在MFC程序中画曲线,可以添加多条曲线,设置曲线取值范围。

3.编译和链接C++开发环境(vc6.0,vs2008)。

4.运行环境Windows5.兼容性和可移植性标准C++实现6.接口和使用6.1. 接口/*** @brief 添加一条曲线** @param color曲线颜色* @param Upper最大值* @param Lower最小值* @return TRUE 成功 FALSE 失败*/BOOL CLineChartCtrl::Add(COLORREF color, int Upper, int Lower)/*** @brief 设置曲线Y轴值** @param nIndex 曲线索引* @param nPos 曲线Y轴值* @return 上一个点的Y轴值*/int CLineChartCtrl::SetPos(int nIndex, int nPos)/*** @brief 绘制曲线** @param 无* @return 无*/void CLineChartCtrl::Go()6.2. 使用方法拷贝LineChartCtrl.h和LineChartCtrl.cpp文件到工程中,包含LineChartCtrl.h 头文件即可使用7.范例参见例子代码。

demo.rar。

第二章Visual C++6.0 绘图基础1

第二章Visual C++6.0  绘图基础1

OnPaint() 屏蔽了OnDraw()函数,不绘制椭 圆。如果删除此函数,则绘制结果为椭圆。
CWindowDC类:
整个屏幕区域的显示器设备上下文类 。包括客户区
(工具栏、状态栏和视图窗口的客户区)和非客户区 (标题栏和菜单栏)。 •CWindowDC允许在整个屏幕区域内进行绘图,其构造函 数 自 动 调 用 GetWindowDC() , 析 构 函 数 自 动 调 用 ReleaseDC()函数。 •CWindowDC 中 点 ( 0 , 0 ) 在 屏 幕 的 左 上 角 , 而 CClientDC 和CPaintDC中点(0,0)是屏幕客户区的左 上角。 •如果在 CTestView 类中使用 CWindowDC 类对象进行绘图, 只有在使用 GetParent() 函数获得CWnd指针后,才能在
2.3.3 使用GDI对象
创建画笔: 调用函数创建画笔:BOOL CreatePen(int nPenStyle,int nWidth,COLORREF crColor) 使用构造函数直接定义画笔: CPen(int nPenStyle,int nWidth,COLORREF crColor)

2.3.3 使用GDI对象
ቤተ መጻሕፍቲ ባይዱ
是编写在OnDraw()中。
•请注意,如果使用OnPaint()函数响应了WM_PAINT消息, 则OnDraw()函数将会被自动屏蔽。
void CTestView::OnDraw(CDC* pDC)//绘制椭圆 { CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here pDC->Ellipse(100,70,900,570); }

动态绘制bezier曲线

动态绘制bezier曲线

在VC6.0坏境下,用mfc编写的绘制3次Bezier曲线的完整代码,其功能为:单击左键绘制控制多边形和坐标点,单击右键绘制曲线。

具体操作步骤如下:(1)新建mfc,工程名为Bezier。

(2)编辑菜单资源并添加消息处理函数OnBezier。

(3)在工程主文件中编写代码如下(红色字体为要添加代码)。

// BezierView.cpp : implementation of the CBezierView class//#include "stdafx.h"#include "Bezier.h"#include "BezierDoc.h"#include "BezierView.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#define T 20#endif/////////////////////////////////////////////////////////////////////////////// CBezierViewIMPLEMENT_DYNCREATE(CBezierView, CView)BEGIN_MESSAGE_MAP(CBezierView, CView)//{{AFX_MSG_MAP(CBezierView)// NOTE - the ClassWizard will add and remove mapping macros here.// DO NOT EDIT what you see in these blocks of generated code!ON_WM_RBUTTONDOWN()ON_WM_LBUTTONDOWN()//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CBezierView construction/destructionCBezierView::CBezierView(){// TODO: add construction code here}CBezierView::~CBezierView(){}BOOL CBezierView::PreCreateWindow(CREATESTRUCT& cs){// TODO: Modify the Window class or styles here by modifying// the CREATESTRUCT csreturn CView::PreCreateWindow(cs);}/////////////////////////////////////////////////////////////////////////////// CBezierView drawingvoid CBezierView::OnDraw(CDC* pDC){CBezierDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);pDC->TextOut(30,20,"开始绘制3次Bezier曲线,单击左键绘制控制多边形,单击右键绘制曲线");// TODO: add draw code for native data here}/////////////////////////////////////////////////////////////////////////////// CBezierView printingBOOL CBezierView::OnPreparePrinting(CPrintInfo* pInfo){// default preparationreturn DoPreparePrinting(pInfo);}void CBezierView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add extra initialization before printing}void CBezierView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: add cleanup after printing}/////////////////////////////////////////////////////////////////////////////// CBezierView diagnostics#ifdef _DEBUGvoid CBezierView::AssertValid() const{CView::AssertValid();}void CBezierView::Dump(CDumpContext& dc) const{CView::Dump(dc);}CBezierDoc* CBezierView::GetDocument() // non-debug version is inline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBezierDoc)));return (CBezierDoc*)m_pDocument;}#endif //_DEBUG/////////////////////////////////////////////////////////////////////////////// CBezierView message handlersint k=0;float BEN[4][4]={-1,3,-3,1, 3,-6,3,0, -3,3,0,0, 1,0,0,0};float point[4][3] ={100,100,1,200,300,1,400,300,1,300,100,1};//给定控制点void bezier(CDC*pDC,int n, int t, float p[4][3]);void matx44(float a[4][4],float b[4][3],float c[4][3]);void matx14(float a[4],float b[4][3], float c[3]);void bezier (CDC*pDC,int n,int t, float point[4][3]) //绘制Bezier曲线{float cc[4][3];float pp[3];int i,xx,yy,a,b;float u[4];u[3]=1.0;a=point[0][0],b=point[0][1]; // 第一个控制点的横、纵坐标for(i=2;i<=T;i++){u[2]=(1.0/T)*i;u[1]=u[2]*u[2];u[0]=u[2]*u[2]*u[2];matx44(BEN,point,cc);matx14(u,cc,pp); xx=pp[0],yy=pp[1];pDC->MoveTo(a,b);pDC->LineTo(xx,yy);a=xx;b=yy;}}void matx44(float a[4][4],float b[4][3],float c[4][3]){int i,j,m;for(i=0;i<4;i++)for(j=0;j<3;j++) c[i][j]=0.0; //初始化中间矩阵for(m=0;m<4;m++)for(i=0;i<3;i++)for(j=0;j<4;j++)c[m][i]+=a[m][j]*b[j][i];return;}void matx14(float a[4],float b[4][3], float c[3]){int i,j;c[0]=c[1]=c[2]=0.0;// 曲线点for(i=0;i<3;i++)for(j=0;j<4;j++)c[i]+=a[j]*b[j][i];return;}void CBezierView::OnBezier(){CDC *pDC=GetDC();//pDC->TextOut(30,20,"开始绘制3次Bezier曲线,单击左键绘制控制多边形,单击右键绘制曲线");float xx,yy;for(int j=0;j<4;j++) // 绘制控制点{xx=point[j][0];yy=point[j][1];pDC->MoveTo(xx-3,yy-3);pDC->LineTo(xx+3,yy+3);pDC->MoveTo(xx-3,yy+3);pDC->LineTo(xx+3,yy-3);}bezier(pDC,4, T, point);ReleaseDC(pDC);}void CBezierView::OnRButtonDown(UINT nFlags, CPoint point)//调用绘制函数{// TODO: Add your message handler code here and/or call defaultOnBezier();//CBezierView::OnRButtonDown(nFlags, point);}void CBezierView::OnLButtonDown(UINT nFlags, CPoint point1)//获得屏幕控制点坐标{// TODO: Add your message handler code here and/or call default//CBezierView::OnLButtonDown(nFlags, point);CDC *pDC=GetDC();float xx,yy;if(k<4){point[k][0]=point1.x;point[k][1]=point1.y;xx=point[k][0];yy=point[k][1];pDC->MoveTo(xx-3,yy-3);pDC->LineTo(xx+3,yy+3);pDC->MoveTo(xx-3,yy+3);pDC->LineTo(xx+3,yy-3);if(k>=1){pDC->MoveTo(point[k-1][0],point[k-1][1]);pDC->LineTo(xx,yy);}k++;}}// BezierView.h : interface of the CBezierView class///////////////////////////////////////////////////////////////////////////////#if !defined(AFX_BEZIERVIEW_H__8885C30A_7A50_4D01_860B_812CED746C52__INCLUDED_) #define AFX_BEZIERVIEW_H__8885C30A_7A50_4D01_860B_812CED746C52__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000class CBezierView : public CView{protected: // create from serialization onlyCBezierView();DECLARE_DYNCREATE(CBezierView)// Attributespublic:CBezierDoc* GetDocument();// Operationspublic:// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CBezierView)public:virtual void OnDraw(CDC* pDC); // overridden to draw this viewvirtual BOOL PreCreateWindow(CREATESTRUCT& cs);protected:virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);//}}AFX_VIRTUAL// Implementationpublic:virtual ~CBezierView();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifprotected:// Generated message map functionsprotected://{{AFX_MSG(CBezierView)// NOTE - the ClassWizard will add and remove member functions here.// DO NOT EDIT what you see in these blocks of generated code !afx_msg void OnBezier();afx_msg void OnRButtonDown(UINT nFlags, CPoint point);afx_msg void OnLButtonDown(UINT nFlags, CPoint point);//}}AFX_MSGDECLARE_MESSAGE_MAP()};#ifndef _DEBUG // debug version in BezierView.cppinline CBezierDoc* CBezierView::GetDocument(){ return (CBezierDoc*)m_pDocument; }#endif///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif// !defined(AFX_BEZIERVIEW_H__8885C30A_7A50_4D01_860B_812CED746C52__INCLUDED_)(4)编译运行程序,查看运行结果,如下图单击左键绘制控制多边形,单击右键绘制曲线。

VC—++绘制正弦曲线

VC—++绘制正弦曲线

本作业的重点是映射模式的设置以及绘图函数的循环算法,其中映射模式是一个比较难理解的话题,在以后的学习中要多应用以加深对其的理解和掌握。
(三)界面
运行结果:
(四)类设计
制作过程:
(1)首先建立一个基于单文档的工程,如下:
(2)在CsinView的void CSinView::OnDraw(CDC* pDC)中添加映射模式语句如下:
CRect rect;
GetClientRect(&rect);
rect.top += 10;
rect.left += 10;
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CRect rect;
GetClientRect(&rect);
rect.top += 10;
rect.left += 10;
rect.right -= 10;
rect.bottom -= 10;
pDC->TextOut(100,100,"y=sin(x)");
CPen pen(PS_SOLID,2,RGB(0,0,255));
CPen * pOld = pDC->SelectObject(&pen);
for (int i=0; i<=1800; i++)
{
double pi = 3.1415926535;
pDC->SetMapMode(MM_ANISOTROPIC);
//pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetViewportOrg(10,10);

VC6.0 项目 拟合曲线

VC6.0 项目 拟合曲线

/****/
using namespace std;
/****/
///////////////////////////////////////////////////////////////////////////////////
/****/ #define A_UNITX 32 #define A_UNITY 32 /****/ #define B_UNITX 250 #define B_UNITY 0.01 /****/ #define ZT_UNIT 1 /****/ #define POINT_SIZE 4 /****/ #define X_ONE_NUM 20 #define Y_ONE_NUM 20 /****/ /////////////////////////////////////////////////////////////////////////////////// /****/ HWND GetConsoleHwnd(void); /****/ void print_pot_1(int x,int y,HDC pdc); /****/ void print_pot(double point[size][2],int n,int zero[2],HDC pdc,
#include "get_hanshu.h"
/****/
///////////////////////////////////////////////////////////////////////////////////
/****/
#define DEBUG_PRINT
/****/
///////////////////////////////////////////////////////////////////////////////////

VC++6.0中MsChart的使用方法

VC++6.0中MsChart的使用方法

VC++6.0中MsChart的使用方法VC++6.0中MsChart的使用方法1.MSChart制图类1.1 添加MSChart控件MSChart是VC++6.0中自带的一个特殊控件类,用于绘制坐标曲线图。

如果要使用这个控件,则可以按下图的示意进行添加此控件。

1.2MSChart控件的使用方法首先在要使用的类的实现文件中包含如下头文件:#include "VcPlot.h"#include "VcAxis.h"#include "VcValueScale.h"#include "VcSeriesCollection.h"#include "VcSeries.h"#include "VcPen.h"#include "VcCategoryScale.h"#include "VcColor.h"#include "VcDataGrid.h"#include "VcBackdrop.h"#include "VcFill.h"#include "VcBrush.h"#include "VcDataPoints.h"#include "VcDataPoint.h"#include "VcDataPointLabel.h"#include "VcAxisTitle.h"#include "math.h"在要使用的类的头文件中包含:#include "mschart.h"本系统中按照如下函数调用来实现MSChart类绘制故障树重要度曲线的功能(CDrawImp是调用MSChart的类)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

py=630-(pointy[0]-pymin)*stepy;
dc.MoveTo(px,py);
for(j=1;j<i;j++) {
px=(pointx[j]-pxmin)*stepx+100;
py=630-(pointy[j]-pymin)*stepy;
dc.LineTo(px,py);}
}
金广林 2011 年 6 月 17 日星期五
VC6.0 中画曲线的函数 OnHqx() {
CClientDC dc(this); CPen pen; pen.CreatePen(PS_SOLID,1,0x000000ff); dc.SelectObject(&pen); CBrush brush; brush.CreateSolidBrush(0x000000ff); dc.SelectObject(&brush); int i,j; double pxmax,pxmin,pymax,pymin,stepx,
pointx[0]=0.1399;
pointy[0]=-84.20;
pointx[1]=0.4409;
pointy[1]=-99.80;
pointx[2]=0.6170;
pointy[9;
pointy[3]=-114.20;
pointx[4]=0.8388;
px,py,stepy,pointx[100],pointy[100]; i=10; //总点数,可修改 //图形的范围为 800*600
//点坐标清零 for(j=0;j<i;j++) {
pointx[j]=0; pointy[j]=0;} //x 轴和向右的箭头 dc.MoveTo(50,650); dc.LineTo(850,650); dc.MoveTo(850,650); dc.LineTo(800,655); dc.MoveTo(850,650); dc.LineTo(800,645); //y 轴和向上的箭头 dc.MoveTo(50,650); dc.LineTo(50,50); dc.MoveTo(50,50); dc.LineTo(45,100); dc.MoveTo(50,50); dc.LineTo(55,100);
pointy[3]=-45.35;
pointx[4]=0.8388;
pointy[4]=-48.13;
pxmax=pointx[0]; pxmin=pointx[0]; pymax=pointy[0]; pymin=pointy[0]; //找出最大值和最小值。 for(j=1;j<i;j++) {
//下面输入数据:
i=5; //总点数,可修改 //下面是浓度的对数值和 K 的电压值:
pointx[0]=0.1399;
pointy[0]=-15.56;
pointx[1]=0.4409;
pointy[1]=-29.12;
pointx[2]=0.6170;
pointy[2]=-38.20;
pointx[3]=0.7419;
//
改笔颜色可用下面的语句:
//
pen.DeleteObject();
//
pen.CreatePen(PS_SOLID,1,0x00ff0000);
//
dc.SelectObject(&pen);
dc.TextOut(400,50,"红色的是浓度的对数值和 k 的电压值的曲线。");
px=(pointx[0]-pxmin)*stepx+100;
if (pointx[j]>pxmax) pxmax=pointx[j];
if (pointx[j]<pxmin) pxmin=pointx[j];
if (pointy[j]>pymax) pymax=pointy[j];
if (pointy[j]<pymin) pymin=pointy[j];
} stepx=800/(pxmax-pxmin); stepy=600/(pymax-pymin);
if (pointx[j]<pxmin) pxmin=pointx[j];
if (pointy[j]>pymax) pymax=pointy[j];
if (pointy[j]<pymin) pymin=pointy[j];
} stepx=800/(pxmax-pxmin); stepy=600/(pymax-pymin);
pointy[4]=-115.89;
pxmax=pointx[0]; pxmin=pointx[0]; pymax=pointy[0]; pymin=pointy[0];
//找出最大值和最小值。 for(j=1;j<i;j++) {
if (pointx[j]>pxmax) pxmax=pointx[j];
py=630-(pointy[0]-pymin)*stepy;
dc.MoveTo(px,py);
for(j=1;j<i;j++) {
px=(pointx[j]-pxmin)*stepx+100;
py=630-(pointy[j]-pymin)*stepy;
dc.LineTo(px,py);}
//下面是浓度的对数值和 Na 的电压值:
//
改笔颜色可用下面的语句:
pen.DeleteObject();
pen.CreatePen(PS_SOLID,1,0x00ff0000);
dc.SelectObject(&pen);
dc.TextOut(400,80,"蓝色的是浓度的对数值和 Na 的电压值的曲线。");
px=(pointx[0]-pxmin)*stepx+100;
相关文档
最新文档