加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

VC6.0读取数据文件绘制二维图

(2012-02-12 00:05:43)
标签:

vc

6.0

绘图

二维

分类: VC

VC6.0读取数据文件绘制二维图

目录

一、         界面图... 2

二、程序说明... 3

1、按钮“读取数据文件”对应函数... 3

2、按钮“绘图”对应的函数... 5

3、按钮“清除绘图”对应函数... 7

4、头文件... 7

5、变量添加... 7

  

一、界面图

初始时

http://s16/bmiddle/67d069a9xb8b26d3b86af&690

 

打开数据文件

类型xxx.csv文件

内容

http://s16/middle/67d069a9xb8b26ea7716f&690

  

界面显示

http://s16/middle/67d069a9xb8b2704f9eff&690

二、程序说明

 

界面中显示图形表控件为静态文本框IDC_STATIC_DRAW

 

1、按钮“读取数据文件”对应函数

void CDraw2Dlg::OnBtnReadfile()

{

// TODO: Add your control notification handler code here

//打开数据文件

CFileDialog   m_MyOpenDialog(TRUE, "exe ",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "CSV文件(*.csv)| *.csv|XLS文件(*.xls)|*.xls|All Files(*.*) |*.*|",NULL);

//CFileDialog dlg(TRUE);///TRUEOPEN对话框,FALSESAVE AS对话框

if(m_MyOpenDialog.DoModal() == IDOK)

   {

           //编辑框中显示数据文件路径名(已包含文件名)

           SetDlgItemText(IDC_EDIT_READFILE,m_MyOpenDialog.GetPathName());

 

}

else

{

           return;

}

 

ifstream infile(m_MyOpenDialog.GetPathName(),ios::in);

if(!infile)

{

  cout<<"can not open file"<<endl;

  return;

}

int i=0;

char sig=',';

int rowk=0;

while(!infile.eof()) 

           { 

                    //读取其中的一行 

                    string rowstr;

                    getline(infile,rowstr);      

                    //空白行,跳过

          

                    if(rowstr.empty())

                             continue;

                    //rowstr中的数字取出来

                    char rowchar[200]; //用来存放数据文件一行的内容

                    char subrowchar[20]; //用来存放一行内容中的对应的一个数据的字符串

                    memset(rowchar,0,sizeof(char)*200);

                    memset(subrowchar,0,sizeof(char)*20);

                    const char *p1=rowstr.c_str(); //string传给char数组

                    strcpy(rowchar,p1);

             int i=0;          //i表示getline(infile,rowstr);rowstr中的第几个字符

             int colk=0;             //colk表示能从getline中的rowstr中的第几个数字

             while(rowchar[i]!='\0')

             {

                    int j=0;      //getline中的rowstr中的数字提取出来所用

                    while(rowchar[i]!=sig && rowchar[i]!='\0')

                    {

                             subrowchar[j]=rowchar[i];

                             i++;

                             j++;

                    }

                    subrowchar[j]='\0';

                    datafile[rowk][colk]=atol(subrowchar); //将每行中的数保存在long数组中

                    i++;

                    colk++;               //对应下一个数

                    memset(subrowchar,0,sizeof(char)*20);

 

             }

 

                    rowk++;  //对应下一行数

}

 

}

2、按钮“绘图”对应的函数

void CDraw2Dlg::OnBtnDraw()

{

// TODO: Add your control notification handler code here

//得到IDC_STATIC的句柄  

CStatic*   pWnd   =   (CStatic*)GetDlgItem(IDC_STATIC_DRAW); 

//根据句柄得到dc  

CDC*   pDC   =   pWnd->GetDC();  

   

//得到dc的客户区域,并创建画刷填充这个区域  

CRect   rc;  

pWnd->GetClientRect(&rc);  

CBrush   brush;  

brush.CreateSolidBrush(RGB(255,255,255));  

pDC->FillRect(&rc,&brush);  

   

//设置dc的裁减区域为客户区域,因为STATIC并不具有真正的dc  

//而是其父窗口的dc,所以用裁减来避免画到客户区域外面去

CRgn   rgn;  

rgn.CreateRectRgn(rc.left,rc.top,rc.right,rc.bottom);  

pDC->SelectClipRgn(&rgn);

   

//创建画笔并选中到pDC  

CPen   pen,*pOldPen;  

pen.CreatePen(PS_SOLID,1,RGB(255,0,0));//1个像素,红色  

pOldPen   =pDC->SelectObject(&pen); 

 

 

//绘制y=sinx 0<=x<=10;

//pDC->MoveTo(0,0+(rc.bottom-rc.top)/2);

double y;

int x=0;

int dc=40;//左右上下留出的间隙

//绘制x

pDC->MoveTo(rc.left,rc.bottom-dc);

pDC->LineTo(rc.right,rc.bottom-dc);

 

//绘制y

pDC->MoveTo(rc.left+dc,rc.bottom);

pDC->LineTo(rc.left+dc,rc.top);

 

//标记刻度值

pDC->TextOut(rc.left,rc.bottom-13,"0");

pDC->TextOut(rc.right-10,rc.bottom-13,"x");

pDC->TextOut(rc.left,rc.top,"y");

int nx=15;

int ny=15;

//x轴方向上单位刻度间距

int dx=(rc.right-rc.left-dc)/nx;

for(int i=1;i<nx;i++)

{

           pDC->MoveTo(dc+rc.left+dx*i,rc.bottom-dc);

           pDC->LineTo(dc+rc.left+dx*i,rc.bottom-1.2*dc);

           CString s;

           s.Format("%d",i);

           pDC->TextOut(rc.left+dc+dx*i-5,rc.bottom-2*dc/3,s);

}

           //y轴方向上单位刻度间距

int temp=0;

for(i=1;i<8;i++)

{

           if(temp<datafile[i][1])

                    temp=datafile[i][1];

}

//y轴方向上单位刻度间距

int dy=(rc.bottom-rc.top-dc)/ny;

           for(i=1;i<ny;i++)

{

           pDC->MoveTo(rc.left+dc,rc.bottom-dy*i-dc);

           pDC->LineTo(rc.left+dc*1.2,rc.bottom-dy*i-dc);

           CString s;

           s.Format("%d",i*temp/ny);

           pDC->TextOut(rc.left,rc.bottom-dy*i-dc-dc/6,s);

}

 

pDC->MoveTo(datafile[0][0]*dx+dc,rc.bottom-dc-datafile[0][1]);

for(i=1;i<8;i++)

{

           x=datafile[i][0];

           y=datafile[i][1];

           if(temp<datafile[i][1])

                    temp=datafile[i][1];

           pDC->LineTo(x*dx+dc,rc.bottom-dc-y*ny*dy/temp);

}

          

           //安全清理  

           pDC->SelectObject(pOldPen);  

           pWnd->ReleaseDC(pDC);

}

 

3、按钮“清除绘图”对应函数

 

void CDraw2Dlg::OnBtnCleardraw()

{

// TODO: Add your control notification handler code here

//清除绘图

Invalidate();

}

 

4、头文件

xxx.cpp中头文件

#include <cmath>

#include <fstream>

#include <string>

using namespace std;

#include <iostream>

5、变量添加

xxx.h中添加

public:

long datafile[5000][20];

 好啦,到此结束,编译后就可运行。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有