C++实训报告
Visual C++与面向对象的程序设计
专业:自动化2013级 姓名: 学号:
[键入文字] [键入文字]
目录
一、 序言
二、 windows编程
三、 文档/视图结构
四、 图形设备接口和资源 五、 对话框
六、 实训感想
[键入文字] 键入文字] [
一、 序言
为期两星期的C++实训已经基本结束,但是给我的影响是相当大的。通过这次实训,使我明白C++这门课程光仅仅是听课是远远不够的,上机训练也不容忽视。通过上机训练,才能够明白自己知识的不足,才能够有的放矢,更加深刻的理解C++中的知识点。 通过实训,我找到了许多知识漏点,学到了很多以前不懂的知识,以前认为自己已经懂了的知识点也理解更加深刻了。尤其是遇到了自己当时不知道如何编写的C++题目如何编写,通过自己的学习和同同学的交流后,试编和改错,最后能够顺利的编写出来,带来的也有成就感。并增加了我们对C++的兴趣和学好C++的信心。与同学们交流的过程中,了解了程序的多种解决方法,知道了不同编写方法有不同的特点。总结C++实训的几个重要作用。
1.加深对课堂讲授内容的理解
课堂上要讲授许多关于C++的语法规则,听起来十分枯燥无味,也不容易记住,死记硬背是不可取的。然而要使用C++这个工具解决实际问题,又必须掌握它。在理解的基础上就会自然而然地掌握C++的语法规定。对于一些内容自己认为在课堂上听懂了,但上机实践中会发现原来理解的偏差。
学习C++不能停留在学习它的语法规则,而是利用学到的知识编写C++程序,解决实际问题。即把C++作为工具,描述解决实际问题的步骤,由计算机帮助我们解题。只有通过上机才能检验自己是否掌握C++、自己编写的程序是否能够正确地解题。 自己编好程序上机调试运行时,可能有很多你想不到的情况发生,通过解决这些问题,可以逐步提高自己对C++的理解和程序开发能力。
2.熟悉程序开发环境、学习计算机系统的操作方法
一个C++程序从编辑、编译、连接到运行,都要在一定的外部操作环境下才能进行。所谓"环境"就是所用的计算机系统硬件、软件条件,只有学会使用这些环境,才能进行程序开发工作。通过上机实验,熟练地掌握C++开发环境,为以后真正编写计算机程序解决实际问题打下基础。同时,在今后遇到其它开发环境时就会触类旁通,很快掌握新系统的使用。
3.学习上机调试程序
完成程序的编写,决不意味着万事大吉。你认为万无一失的程序,实际上机运行时可能不断出现麻烦。如编译程序检测出一大堆错误。有时程序本身不存在语法错误,也能够顺利运行,但是运行结果显然是错误的。开发环境所提供的编译系统无法发现这种程序逻辑错误,只能靠自己的上机经验分析判断错误所在。 通过这次为数不多的几天计算机实践学习,我们更好的了解了一些关于C++的知识,理解巩固了我们C++的理论知识。 C++这门课程对于我们应用电子专业的同学也相当重要,我们会再将来继续学习并熟悉这门课程。通过这次实训,也使我们发现了许多问题。
在实训中,我们认识到自己还有很多的知识没学好,基础知识没理清,而且许多东西还要去翻书,去上网搜索。而且遇到一些小错误运行不出来,就会烦躁不安,觉得有些自暴自弃或者抱怨项目的变态,以后要克服,尽量保持一颗良好的心态,学好C++,也学好用C++编写一个按要求的系统。还有就是对于未来,近程就是下学期,我觉得我还有许多方面需要提高。首先我要继续学习好C++的基础知识,然后能在电脑上熟练的运用。然后每天都能写一些程序,上网时候多看一些优秀的教程和优秀的代码。遇到问题时多和同学讨论,并且多弄出几套方
[键入文字] [键入文字]
案,多锻炼自己结局问题的能力和与同学合作的能力。
二、 初步认识和理解windows编程
Microsoft Windows是广泛应用于计算机操作系统,具有图形用户和
多任务、多窗口特点。
Windows编程使用事件驱动的程序设计思想。在事件驱动的程序结构
中,程序的控制流不在由事件的预定发生顺序来决定。而是由实际运行时各种事件的实际发生来触发。使用事件驱动原理的程序如下图所示。
鼠标消息其他消息 1. 输入消息:包括键盘和鼠标的输入。这类消息首先放在系统消息队列中,然
后由Windows将他们送入应用程序消息队列中,由应用程序来处理消息。
2. 控制消息:用来与Windows的控制对象(列表框、按钮、检查框等)进行双
向通信。
3. 系统消息:对程序化的事件或系统时钟中断做出反应。
4. 用户消息:程序员自己定义并在应用程序中主动发出的,由应用程序内部处
理。
MFC编程是Windows编程的一种。而MFC编程中类可以分为两种:CObject类的派生类以及非CObject派生类。
典型的windows应用程序结构有以下4种:
1. 控制台应用程序:该类应用程序简单,可以不使用 MFCl类库。
2. 基于框架窗口的应用程序:在此类应用程序中。主程序为框架窗口。
CFrameWnd派生类附属于应用程序的CWinApp派生类对象的m_pMainWnd成员。
3. 基于对话框的应用程序:基于对话框的应用程序与基于框架窗口的应用程序
差别不大,只是用CDialog派生类对象代替了CFrameWnd派生类对象作为应用程序的主窗口。
4. 基于文档/视图结构的应用程序:文档/视图应用程序有较为复杂的结构。
通过程序10-2来认识MFC编程。
一、程序作用:在客户区显示一个简单的折线图。
二、程序主体:
1:在OnDraw()函数中加入
void CMy10_2View::OnDraw(CDC* pDC)
{
CMy10_2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
const int xOrg = 50;
[键入文字] [键入文字]
const int yOrg = 350;
const int xMax = 700;
const int yMin = 20;
pDC->MoveTo(xOrg,yOrg); pDC->LineTo(xMax,yOrg); pDC->MoveTo(xOrg,yOrg);
pDC->LineTo(xOrg,yMin);//画折线 pDC->MoveTo(101,320); pDC->LineTo(168,280); pDC->LineTo(182,100); pDC->LineTo(200,200); pDC->LineTo(320,330); pDC->LineTo(500,210); pDC->LineTo(520,180); pDC->LineTo(550,143); pDC->LineTo(586,88);
pDC->LineTo(612,45);//轴标题 int x = (xMax-xOrg)/2;
int y = yOrg +10;
pDC->TextOut (x,y,"Force"); x= xOrg-20;
y=(yOrg-yMin)/2;
pDC->TextOut (x,y,"D"); y+=15;
pDC->TextOut(x,y,"i");
y+=15;
pDC->TextOut(x,y,"p"); }
三、程序流程:
[键入文字]
键入文字] [
四:运行结果:
通过程序10-4进一步体会MFC编程。 一、 程序作用:利用折线,近似的画出sin(x)的曲线 二、 程序主体 1:在CMyView.cpp的头部添加代码,以便在程序中使用sin(x)函数
// 10_4View.cpp : implementation of the CMy10_4View class
//
#include "stdafx.h"
#include "10_4.h"
#include "10_4Doc.h"
#include "10_4View.h"
#include "Math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
2:在OnDraw()函数中加入如下代码
void CMy10_4View::OnDraw(CDC* pDC)
{
CMy10_4Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//划线
const double PI= 3.141xxxxxxxx;
const double dbYMax = 1.0;
const double dbYMin = -1.0;
const double dbXMin = 0.0;
const double dbXMax = 2 *PI;
[键入文字] [键入文字]
const int iPt = 200; const int xOrg = 50; const int yOrg = 350; const int xMax = 700;
}
三、
[键入文字]
const int yMin = 20; //换算数据 double dbXRatio = (xMax - xOrg)/(dbXMax - dbXMin); double dbYRatio = (yOrg - yMin)/(dbYMax - dbYMin); int x = xOrg; int y = yOrg; pDC->MoveTo(x,y); for(int i =0; i<=iPt; i++) { x=(int)(dbXRatio *(dbXMax/iPt*i - dbXMin) +xOrg); y = (int)(yOrg - dbYRatio*(sin(dbXMax/iPt*i) - dbYMin)); pDC->LineTo(x,y); } //画轴 pDC->MoveTo(xOrg,yOrg); pDC->LineTo(xMax,yOrg); pDC->MoveTo(xOrg,yOrg); pDC->LineTo(xOrg,yMin); //轴标题 x = (xMax - xOrg)/2; y = yOrg +10; pDC-> TextOut(x,y,"X"); x = xOrg -20; y = (yOrg - yMin)/2; pDC->TextOut(x,y,"Y"); 程序流程: 键入文字] [
四、 程序运行结果:
通过利用画线MoveTo()和LineTO()成员函数来画轴和画折线,其中MoveTo()只需用一次来确定起点。
Sin()曲线只需在折线的基础上加以改造便可得。
Windows编程中很重要的就是编制消息处理函数,编制消息处理函数有时又被称作消息映射或捕获消息。有的消息实际上可以放在SDI的4个类中的任何一个类中,此时,消息在SDI各类中的传递过程为:视图类—>文档类—>框架类—>应用程序类。如果前一个类中定义了消息处理函数则消息将不会再传递到后面的类中,具体应在哪个类中定义处理函数,有程序员根据需要而定
使用MFC应用程序框架进行编程最简单就是单文档界面SDI。提供一个可运行的“空”程序,仅实现一些通用基本功能,其他功能由程序员去实现就是MFC的基本工作原理。理解应用程序框架的程序结构,尤其是能加入代码的地方并加入适当的代码,就是使用应用程序框架编程的第一步。
[键入文字] [键入文字]
三、 文档/视图结构
一、文档/视图的概念
MFC对“文档”的设计思想是:一个类中的所有成员变量,都应该能够保存到一个文件中去,反之,也应该能从一个文件中读出来,加载到该类相应的成员变量中去。MFC对此的实现机制就是文档/视图的串行化(Serialize)。 在MFC中,文档类负责管理数据,提供保存和加载数据的功能。视图类负责数据的显
示,以及给用户提供对数据的编辑和修改功能。
MFC给我们提供Document/View结构,将一个应用程序所需要的“数据处理与显示”
的函数空壳都设计好了,这些函数都是虚函数,我们可以在派生类中重写这些函数。有关文件读写的操作在CDocument的Serialize函数中进行,有关数据和图形显示的操作在CView的OnDraw函数中进行。我们在其派生类中,只需要去关注Serialize和OnDraw函数就可以了,其它的细节我们不需要去理会,程序就可以良好地运行。
当我们按下“打开文件”菜单项时,Application Framework会激活文件打开对话框,让
你指定文件名,然后自动调用CGraphicDoc::Serialize读取文件。
Application Framework还会调用CGraphicView::OnDraw,传递一个显示DC,让你重新绘制窗口内容。
当我们按下“保存文件”菜单项时,Application Framework会激活文件保存对话框,让你指定文件名,然后自动调用CGraphicDoc::Serialize保存文件。 MFC给我们提供Document/View结构,是希望我们将精力放在数据结构的设计和数据
显示的操作上,而不要把时间和精力花费在对象与对象之间、模块与模块之间的通信上。 一个文档对象可以和多个视图类对象相关联,而一个视图类对象只能和一个文档对象相
关联。
程序一:将数据存放于文档类,将数据转化为坐标后画出折线
一、程序主体
1: 在CMyDoc.h中找到CMyDoc类的定义,添加数据成员: class CMy11_1Doc : public CDocument
{
protected: // create from serialization only
CMy11_1Doc();
DECLARE_DYNCREATE(CMy11_1Doc)
// Attributes
public:
enum {iPt=10};
double m_dbXdata[iPt];
double m_dbYdata[iPt];
[键入文字] [键入文字]
// Operations
public:
2.在CMyDoc类的成员函数OnNewDocument()中初始化新添加的成员变量: BOOL CMy11_1Doc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
m_dbXdata[0]=1;
m_dbXdata[1]=1.5;
m_dbXdata[2]=2;
m_dbXdata[3]=3;
m_dbXdata[4]=4;
m_dbXdata[5]=5;
m_dbXdata[6]=6;
m_dbXdata[7]=7;
m_dbXdata[8]=8;
m_dbXdata[9]=9;
m_dbYdata[0]=22.5;
m_dbYdata[1]=22.9;
m_dbYdata[2]=31.4;
m_dbYdata[3]=32.0;
m_dbYdata[4]=32.5;
m_dbYdata[5]=33;
m_dbYdata[6]=33.6;
m_dbYdata[7]=34.7;
m_dbYdata[8]=34.9;
m_dbYdata[9]=36;
return TRUE;
}
3.在OnDraw()函数中编写显示函数:
BOOL CMy11_1View::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
// CMy11_1View drawing
[键入文字] 键入文字] [
void CMy11_1View::OnDraw(CDC* pDC)
{
CMy11_1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
const int xOrg=50;
const int yOrg = 350;
const int xMax = 700;
const int yMin = 20;
//
double dbXMin =pDoc ->m_dbXdata[0];
double dbXMax = pDoc ->m_dbXdata[0];
double dbYMin = pDoc ->m_dbYdata[0];
double dbYMax = pDoc ->m_dbYdata[0];
for (int i =1 ; i< pDoc ->iPt; i++)
{
pDoc -> m_dbXdata[i]<dbXMin ? dbXMin = pDoc-> m_dbXdata[i]:
pDoc -> m_dbXdata[i]>dbXMax ? dbXMax = pDoc -> m_dbXdata[i]:dbXMax; pDoc -> m_dbYdata[i]<dbYMin ? dbYMin = pDoc -> m_dbYdata[i]:
pDoc -> m_dbYdata[i]>dbYMax ? dbYMax = pDoc -> m_dbYdata[i]:dbYMax ; }
//
dbXMax = dbXMax +(dbXMax - dbXMin)/pDoc ->iPt;
dbXMin = dbXMin - (dbXMax - dbXMin)/pDoc ->iPt;
dbYMax = dbYMax +(dbYMax - dbYMin)/pDoc ->iPt;
dbYMin = dbYMin -(dbYMax - dbYMin)/pDoc ->iPt;
//
double dbXRatio = (xMax - xOrg)/(dbXMax - dbXMin);
double dbYRatio = (yOrg - yMin )/(dbYMax - dbYMin);
int x = (int)(dbXRatio *(pDoc ->m_dbXdata[0]- dbXMin ) + xOrg); int y = (int)(yOrg - dbYRatio *(pDoc ->m_dbYdata[0]-dbYMin)); pDC->MoveTo(x,y);
for (i=1;i<pDoc->iPt;i++)
{ x=(int)(dbXRatio*(pDoc->m_dbXdata[i]-dbXMin)+xOrg);
y=(int)(yOrg - dbYRatio*(pDoc->m_dbYdata[i] - dbYMin));
pDC->LineTo(x,y);
}
pDC->MoveTo(xOrg,yOrg);
pDC->LineTo(xMax,yOrg);
pDC->MoveTo(xOrg,yOrg);
pDC->LineTo(xOrg,yMin);
x= (xMax - xOrg)/2;
y= yOrg + 10 ;
[键入文字] [键入文字]
}
pDC->TextOut(x,y,"Forece"); x = xOrg -20; y = (yOrg - yMin)/2; pDC->TextOut(x,y,"D"); y+=15; pDC->TextOut(x,y,"i"); y+=15; pDC->TextOut(x,y,"p");
二:程序流程
三、运行结果
[键入文字] [键入文字]
程序二:用键盘移动窗口客户区中的一个气球(椭圆)
一、程序主体
1:在CMyDoc类的定义中添加CRect类型变量记录椭圆的位置。
class CMy11_4Doc : public CDocument
{
protected: // create from serialization only
CMy11_4Doc();
DECLARE_DYNCREATE(CMy11_4Doc)
// Attributes
public:
CRect m_rectBody;
// Operations
public:
2:修改文档类的OnNewDocument()函数,对m_rectBody进行初始化:
BOOL CMy11_4Doc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
m_rectBody =CRect(100,100,150,180);
return TRUE;
}
3:修改视图类中OnDraw()函数,加入显示位置代码:
void CMy11_4View::OnDraw(CDC* pDC)
{
[键入文字] [键入文字]
CMy11_4Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
pDC->Ellipse(pDoc->m_rectBody);
}
4:用ClassWizard建立键盘的消息处理函数OnKeyDown(),并加入代码:
void CMy11_4View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
[键入文字] CMy11_4Doc*pDoc = GetDocument(); ASSERT_VALID(pDoc); CRect rectClient; GetClientRect(&rectClient); InvalidateRect(pDoc->m_rectBody,TRUE); switch(nChar) { case VK_UP: if(pDoc->m_rectBody.top>rectClient.top) { pDoc ->m_rectBody.top -=5; pDoc ->m_rectBody.bottom -=5; } break; case VK_DOWN: if(pDoc->m_rectBody.bottom<rectClient.bottom ) { pDoc->m_rectBody.top+=5; pDoc->m_rectBody.bottom +=5; } break; case VK_LEFT: if(pDoc->m_rectBody.left>rectClient.left ) { pDoc->m_rectBody.left -=5; pDoc->m_rectBody.right -=5; } break; case VK_RIGHT: if(pDoc ->m_rectBody.right<rectClient.right) { pDoc ->m_rectBody.left+=5; pDoc ->m_rectBody.right+=5; } break; 键入文字] [
}
}
InvalidateRect(pDoc->m_rectBody,FALSE); CView::OnKeyDown(nChar, nRepCnt, nFlags);
二、程序流程
三、程序运行结果
[键入文字]
[键入文字]
在客户区显示了一个气球,用上下左右方向键可以改变其位置。 一般来说,在窗口客户区 移动一个物体的步骤为:
1.在文档类中设置存放物体的位置的数据成员并初始化。
2.在改变物体位置的函数内(如OnKeyDown() )做如下工作:
(1)通知OnDraw()函数更新物体原来位置的内容(擦除)。
(2)修改物体的位置参数。
(3)通知OnDraw()函数更新物体新位置的内容。
3.OnDraw()中按正常方式处理按文档类中的位置数据画出物体
四、 图形设备接口和资源
在Windows程序中,应用程序(包括Windows本身)的输出并不直接面对物理设备,如显示屏打印机,而是针对一个称为设备环境的逻辑设备进行操作。设备环境包括了关于当前选定用于一种设备的画笔、画刷、字体和位图等信息,设备环境与实际设备之间的信息传递由Windows直接管理。MFC提供了可用于若干不同类型设备环境的类,应用程序在将任何东西画到设备中之前,必须明确索取一个设备环境,甚至简单地将文本写到显示器上去,也必须索取设备环境。
在Windows的GDI中,包含一些预定义的图形对象,无需用户创建就可以使用。这些对象称作库存对象。库存对象包括画笔、画刷、和字体等。创建库存对象可使用CGdiObject类的成员函数CreatStockObject(),其原型为:BOOL CreatStockObject(int nIndex);其中参数nIndex指定要创建的图形对象。
创建库存对象成功,该函数返回非0值,否则返还0。实际上,该函数并不真正创建对象,而只是取得库存对象的句柄,并将该句柄连到调用该函数的GDI对象上。
使用库存对象不必存储和恢复原来的图形对象。
程序一:在窗口中显示一个椭圆,并用鼠标切换该椭圆的圆形参数。
一、程序主体:
1:修改文档类的定义(头文件),加入两个变量。
[键入文字] [键入文字]
class CMy121Doc : public CDocument
{
protected: // create from serialization only
CMy121Doc();
DECLARE_DYNCREATE(CMy121Doc)
// Attributes
public:
int m_nColor;
CRect m_rectEllipse;
// Operations
public:
……
}
2:修改文档类的OnNewDocument()函数,对变量进行初始化:BOOL CMy121Doc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
m_rectEllipse=CRect(100,100,300,250);
m_nColor=0;
return TRUE;
}
3:修改视图类的OnDraw()函数,加入显示椭圆代码: void CMy121View::OnDraw(CDC* pDC)
{
CMy121Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
switch(pDoc->m_nColor)
{
case 0:
pDC->SelectStockObject(GRAY_BRUSH);
break;
case 1:
pDC->SelectStockObject(LTGRAY_BRUSH);
break;
case 2:
pDC->SelectStockObject(BLACK_BRUSH);
break;
}
[键入文字] 键入文字] [
pDC->Ellipse(pDoc->m_rectEllipse);
}
4:用ClassWizard建立鼠标左键的消息处理函数,并加入代码:
void CMy121View::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CMy121Doc*pDoc=GetDocument(); ASSERT_VALID(pDoc); if(pDoc->m_rectEllipse.PtInRect(point)) { pDoc->m_nColor=(pDoc->m_nColor+1)%3; InvalidateRect(pDoc->m_rectEllipse); } CView::OnLButtonDown(nFlags, point); }
二、程序流程
[键入文字]
[键入文字]
三、程序运行结果
在窗口客户区显示了一个椭圆,用鼠标左键点击可以改变它的颜色等设置。 该程序用了两个数据成员,一个是椭圆的包含矩形,一个是颜色参数,在OnDraw()函数中,根据变量m_nColor的值取库存对象设置画刷,然后画出椭圆。
又如:飞舞的彩泡泡程序。用户在窗口客户区单机鼠标左/右键即可产生红/蓝色泡泡并向上升起。
五、 对话框 对话框实际上也是一个窗口。在MFC中,对话框的功能被封装在CDialog类中,CDialog类是CWnd类的派生类。
对话框分为模态对话框和非模态对话框两种。
模态对话框垄断了用户的输入,当一个模态对话框打开时,用户只能与该对话框进行交互,其他用户界面对象均收不到用户的输入信息。平时我们所遇到的大部分对话框都是模态对话框,非模态对话框类似普通的窗口,不垄断用户的输入。在非模式对话框打开时,用户随时可以用鼠标点击等手段激活其他窗口对象,操作完毕后再回到本对话框,非模态对话框的典型例子是Microsoft Word中的搜索对话框,打开搜索对话框后,用户仍可与其他窗口对象进行交互,可以一边搜索,以便修改文章,非常方便。
程序一:通过对话框输入数据,画出折线图
一、程序主体:
1 在CMyDoc类的定义中添加变量
[键入文字] [键入文字]
// Implementation
public:
enum {iPt=10};
double m_dbXdata[iPt];
double m_dbYdata[iPt];
BOOL m_boolNew;
virtual ~CMy13_4Doc();
#ifdef _DEBUG
2 在CMyDoc的成员函数OnNewDocument()中初始化数据 BOOL CMy13_4Doc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
for(int i=0;i<iPt;++i)
{
m_dbXdata[i]=0;
m_dbYdata[i]=0;
}
m_boolNew=true;
return TRUE;
}
3在视图文件的开始处将对话框的声明包括进来并为“输入数据”菜单的消息处理函数添加代码
#include "stdafx.h"
#include "13_4.h"
#include "13_4Doc.h"
#include "13_4View.h"
#include "MyDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//
void CMy13_4View::OnInput()
{
// TODO: Add your command handler code here
CMy13_4Doc* pDoc=GetDocument();
ASSERT_VALID(pDoc);
CMyDlg dlgInput;
int nRet=dlgInput.DoModal();
if(nRet==IDOK)
[键入文字] [键入文字]
{
pDoc->m_dbXdata[0]=dlgInput.m_dbX1; pDoc->m_dbXdata[1]=dlgInput.m_dbX2; pDoc->m_dbXdata[2]=dlgInput.m_dbX3; pDoc->m_dbXdata[3]=dlgInput.m_dbX4; pDoc->m_dbXdata[4]=dlgInput.m_dbX5; pDoc->m_dbXdata[5]=dlgInput.m_dbX6; pDoc->m_dbXdata[6]=dlgInput.m_dbX7; pDoc->m_dbXdata[7]=dlgInput.m_dbX8; pDoc->m_dbXdata[8]=dlgInput.m_dbX9; pDoc->m_dbXdata[9]=dlgInput.m_dbX10; pDoc->m_dbYdata[0]=dlgInput.m_dbY1; pDoc->m_dbYdata[1]=dlgInput.m_dbY2; pDoc->m_dbYdata[2]=dlgInput.m_dbY3; pDoc->m_dbYdata[3]=dlgInput.m_dbY4; pDoc->m_dbYdata[4]=dlgInput.m_dbY5; pDoc->m_dbYdata[5]=dlgInput.m_dbY6; pDoc->m_dbYdata[6]=dlgInput.m_dbY7; pDoc->m_dbYdata[7]=dlgInput.m_dbY8; pDoc->m_dbYdata[8]=dlgInput.m_dbY9; pDoc->m_dbYdata[9]=dlgInput.m_dbY10; pDoc->m_boolNew=false;
Invalidate();
}
}
编辑OnDraw()函数显示折线
void CMy13_4View::OnDraw(CDC* pDC) {
CMy13_4Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc);
// TODO: add draw code for native data here const int xOrg=100;
const int yOrg=350;
const int xMax=700;
const int yMin=20;
const int xMin=xOrg;
const int yMax=yOrg;
//
if(!pDoc->m_boolNew)
{
double dbXMin=pDoc->m_dbXdata[0];
double dbXMax=pDoc->m_dbXdata[0];
double dbYMin=pDoc->m_dbYdata[0];
double dbYMax=pDoc->m_dbYdata[0];
[键入文字] 键入文字] [
for(int i=1;i<pDoc->iPt;i++)
{
pDoc->m_dbXdata[i]<dbXMin?dbXMin=pDoc->m_dbXdata[i]:
pDoc->m_dbXdata[i]>dbXMax?dbXMax=pDoc->m_dbXdata[i]:dbXMax; pDoc->m_dbYdata[i]<dbYMin?dbYMin=pDoc->m_dbYdata[i]:
pDoc->m_dbYdata[i]>dbYMax?dbYMax=pDoc->m_dbYdata[i]:dbYMax; }
//
dbXMax=dbXMax+(dbXMax-dbXMin)/pDoc->iPt;
dbXMin=dbXMin-(dbXMax-dbXMin)/pDoc->iPt;
dbYMax=dbYMax+(dbYMax-dbYMin)/pDoc->iPt;
dbYMin=dbYMin-(dbYMax-dbYMin)/pDoc->iPt;
//
double dbXRatio=(dbXMax-dbXMin)<10e-15?10e-15:(xMax-xOrg)/(dbXMax-dbXMin); double dbYRatio=(dbYMax-dbYMin)<10e-15?10e-15:(yOrg-yMin)/(dbYMax-dbYMin); //
int x=(int)(dbXRatio*(pDoc->m_dbXdata[0]-dbXMin)+xOrg);
int y=(int)(yOrg-dbYRatio*(pDoc->m_dbYdata[0]-dbYMin));
pDC->MoveTo(x,y);
CBrush brushNewBrush(RGB(0,0,0));
CBrush *pbrushOldBrush=pDC->SelectObject(&brushNewBrush);
CRect rectSymbol(x-3,y-3,x+3,y+3);
pDC->Ellipse(rectSymbol);
for(i=1;i<pDoc->iPt;i++)
{x=(int)(dbXRatio*(pDoc->m_dbXdata[i]-dbXMin)+xOrg);
y=(int)(yOrg-dbYRatio*(pDoc->m_dbYdata[i]-dbYMin));
rectSymbol.left=x-3;
rectSymbol.top=y-3;
rectSymbol.right=x+3;
rectSymbol.bottom=y+3;
pDC->Ellipse(rectSymbol);
pDC->LineTo(x,y);
}
//
pDC->SelectObject(pbrushOldBrush);
pDC->MoveTo(xOrg,yOrg);
pDC->LineTo(xMax,yOrg);
pDC->MoveTo(xOrg,yOrg);
pDC->LineTo(xOrg,yMin);
//
const iNumScal=8;
double dbXInc=(dbXMax-dbXMin)/iNumScal;
y=yOrg;
for(i=0;i<=iNumScal;++i)
[键入文字] 键入文字] [
{
x=(int)(dbXRatio*i*dbXInc+xOrg);
pDC->MoveTo(x,y);
pDC->LineTo(x,y+8);
CString strBufOut;
strBufOut.Format("%6.2f",(dbXMin+i*dbXInc)); pDC->TextOut(x-20,y+15,strBufOut);
}
double dbYInc=(dbYMax-dbYMin)/iNumScal; x=xOrg;
for(i=0;i<=iNumScal;++i)
{
y=(int)(yOrg-dbYRatio*dbYInc*i);
pDC->MoveTo(x,y);
pDC->LineTo(x-8,y);
CString strBufOut;
strBufOut.Format("%6.2f",(dbYMin+i*dbYInc)); pDC->TextOut(x-55,y-8,strBufOut);
}
x=(xMax-xOrg)/8*7;
y=yOrg+40;
pDC->TextOut(x,y,"X");
x=xOrg-80;
y=(yOrg-yMin)/8;
pDC->TextOut(x,y,"Y");
}
else
{
CRect rectClient;
GetClientRect(rectClient);
pDC->FillSolidRect(rectClient,RGB(255,255,255)); }
三、运行结果
[键入文字] [键入文字]
程序运行后,显示的是一个空白的视图。单击菜单上的“输入数据”,弹出“输入数据”对话框,输入数据后单击OK按钮,画出折线图如上图所示。
六、 实训感想
通过这次c++实训,让我认识到了自己的不足之处。在实训的过程中,我发现了自己对知识点掌握不牢固。对于有些知识点比较陌生,在编写程序的过程中,还是会犯一些语法错误。
这次实训让我对C++有了新的认识,感到它的功能很强大,知识结构博大精深。了解了以前没接触过的MFC类,感觉到它的方便及实用。最重要是,我对面向对象的编程又有了更深层的了解。
[键入文字] [键入文字]
通过本次实训我也明白了上机实践的重要性,C++的学习不只是在于课上的听讲,还在于课下的多练习。我们只有通过上机实践,才能知道自己是否掌握所学的知识点。
[键入文字] 键入文字] [
南昌工程学院《综合技能实战演习》实习(实训)报告题目课程名称综合技能实训系院外国语言文学系专业英语班级09英语(1)班学生姓名朱伟…
综合实训报告实训项目班级姓名学号日期无锡市广播电视大学数控加工操作实训报告一实习的基本情况1实习的目的毕业实习是我们在完成本专业基…
一、教学目标:1、项目技术报告技术标准和规格要求,2、掌握撰写技术报告的基本方法。职业素质:1、严谨的工作态度2、沟通及语言表达能…
南昌工程学院综合技能实战演习实习实训报告题目课程名称综合技能实训系院外国语言文学系专业英语班级09英语2班学生姓名邓小芳学号20x…
综合实训报告班级:09物流姓名:XXX指导老师:XXX物流业在我国已经成为发展最快的产业之一,但长期以来我国对物流的理论研究和应用…
一、教学目标:1、项目技术报告技术标准和规格要求,2、掌握撰写技术报告的基本方法。职业素质:1、严谨的工作态度2、沟通及语言表达能…
一、模拟实训目的:1、通过运用手工操作,对会计资料进行分岗位综合实训,增强对会计专业知识的理解和认识,提高会计业务综合处理能力,树…
前言为了更好地理解和掌握市场营销学知识,在社会实践中综合运用所学的营销的理论与技能,提高自己分析问题,解决问题的能力,所以我们进行…
南昌工程学院《综合技能实战演习》实习(实训)报告题目课程名称综合技能实训系院外国语言文学系专业英语班级09英语(1)班学生姓名朱伟…
成都东软学院信管系专业技能综合实训报告项目名称:财务综合实训专业:学号:学生名字:班级:指导老师:年月日目录1项目概述......…