MFC课程设计实验报告讲稿Word下载.docx

上传人:wj 文档编号:5990171 上传时间:2023-05-05 格式:DOCX 页数:53 大小:491.47KB
下载 相关 举报
MFC课程设计实验报告讲稿Word下载.docx_第1页
第1页 / 共53页
MFC课程设计实验报告讲稿Word下载.docx_第2页
第2页 / 共53页
MFC课程设计实验报告讲稿Word下载.docx_第3页
第3页 / 共53页
MFC课程设计实验报告讲稿Word下载.docx_第4页
第4页 / 共53页
MFC课程设计实验报告讲稿Word下载.docx_第5页
第5页 / 共53页
MFC课程设计实验报告讲稿Word下载.docx_第6页
第6页 / 共53页
MFC课程设计实验报告讲稿Word下载.docx_第7页
第7页 / 共53页
MFC课程设计实验报告讲稿Word下载.docx_第8页
第8页 / 共53页
MFC课程设计实验报告讲稿Word下载.docx_第9页
第9页 / 共53页
MFC课程设计实验报告讲稿Word下载.docx_第10页
第10页 / 共53页
MFC课程设计实验报告讲稿Word下载.docx_第11页
第11页 / 共53页
MFC课程设计实验报告讲稿Word下载.docx_第12页
第12页 / 共53页
MFC课程设计实验报告讲稿Word下载.docx_第13页
第13页 / 共53页
MFC课程设计实验报告讲稿Word下载.docx_第14页
第14页 / 共53页
MFC课程设计实验报告讲稿Word下载.docx_第15页
第15页 / 共53页
MFC课程设计实验报告讲稿Word下载.docx_第16页
第16页 / 共53页
MFC课程设计实验报告讲稿Word下载.docx_第17页
第17页 / 共53页
MFC课程设计实验报告讲稿Word下载.docx_第18页
第18页 / 共53页
MFC课程设计实验报告讲稿Word下载.docx_第19页
第19页 / 共53页
MFC课程设计实验报告讲稿Word下载.docx_第20页
第20页 / 共53页
亲,该文档总共53页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

MFC课程设计实验报告讲稿Word下载.docx

《MFC课程设计实验报告讲稿Word下载.docx》由会员分享,可在线阅读,更多相关《MFC课程设计实验报告讲稿Word下载.docx(53页珍藏版)》请在冰点文库上搜索。

MFC课程设计实验报告讲稿Word下载.docx

一、课程设计的目的

1.参加本课程设计的同学已经学习了《C语言程序设计》和《面向对象可视化编程》两门课程,现在需要通过一个相对实际性的开发过程来巩固与鉴定一下学习成效,可以查看离实际需要还有哪些部分没有完全掌握,需要加强检测;

2.本课程设计可以提供一个稍微具有规模的程序开发的例子,让同学们可以体会到程序的构思、编码以及调试的完整过程,最后并总结课程设计的过程;

3.通过本次课程设计,可以对自身做一个评估,看看在哪方面不足从而加强学习;

二、课程设计的内容与设计思路

1.课设内容

要求:

采用单文档方式,文档中存储图形画面的各个图元数据,视图负责图形的绘制。

文档支持图形的序列化(连载),提供新建、打开、保存等操作。

视图除了绘制图形,还提供图形交互,能够按住Ctrl键再鼠标左键单击来创建图元,鼠标左键双击编辑修改图元属性,鼠标右键双击删除图元。

图元创建与修改时的参数由参数对话框来编辑。

创建时以鼠标左击时光标的所在位置作为基点来创建图元。

Square



Rectangle

Triangle

h

w w

w

a

r

Circle Ellipse

Text

2.设计思路

我们的最终目的是显示一个单文档窗口,且可利用从对话框中输入的数据绘制图形。

所以,首先建立一个单文档程序,再添加对话框,用来创建与修改图形参数,之后给对话框中的各复选框,编辑框,按钮添加消息响应函数,进行控件关联,并利用枚举型使参数传递。

定义一个动态数组以存储从对话框中获取的数据,之后添加Shape类,用来绘图,由Shape类定义一个指针指向动态数组,便可从中读出之前存储的数据进行绘图,从而达到目的,思路图参考如图1,2:

图1.Shape的六个派生类

图2.工程思路图解

三、程序实现过程与细节

1.涉及的主要函数列表

附表1

函数定义与功能一览表

函数名

函数定义

定义所在文

件名

函数功能

1

OnInitDialog()

BOOLCType:

:

Type.cpp

对对话框

进行初始化处理

2

OnOk()

voidCType:

OnOK()

按确定按

钮时调用

3

OnFillColorButton()

按下按钮弹出颜色选择对话

4

OnLinelColorButton()

OnLineColorButton()

5

OnDraw()

voidCLwhView:

OnDraw(CDC*pDC)

LwhView.cpp

应用程序窗口的客

户区进行

绘图

6

OnLButtonDown()

OnLButtonDown(UINTnFlags,CPointpoint)

按下鼠标

左键,执行该函数

7

OnRButtonDblClk()

OnRButtonDblClk(UINTnFlags,CPointpoint)

双击鼠标右键时,执行该函

8

OnSelchangeComBoxTuYuanType()

OnSelchangeComBoxTuYuanType()

选择图元属性组合框时,显示或隐藏某个编辑

9

Serialize()

voidCSquare:

Serialize(CArchive&

ar)voidCRectangle:

ar)

voidCTriangle:

voidCCircle:

ar)voidCEllipse:

voidCText:

Shape.cpp

将表单内容序列化

10

CSquare()

CSquare:

缺省构造函数,初

始化

11

CSquare()CRectangle()CCircle()CEllipse()CTriangle()Ctext()

CSquare()CRectangle:

CRectangle()CCircle:

CCircle()CEllipse:

CEllipse()CTriangle:

CTriangle()CText:

CText()

接受由对话框传递过来的参数

12

Draw(CDC*pDC)

Draw(CDC*pDC)voidCRectangle:

Draw(CDC*pDC)voidCCircle:

Draw(CDC*pDC)voidCEllipse:

Draw(CDC*pDC)voidCTriangle:

Draw(CDC*pDC)voidCText:

绘制函数

13

IsMatched(CPointpnt)

boolCSquare:

IsMatched(CPointpnt)boolCRectangle:

boolCCircle:

IsMatched(CPointpnt)boolCEllipse:

boolCTriangle:

图元匹配函数

boolCText:

图3.主要函数OnLButtonDown()

2.工程的新建

打开MicrosoftVisualC++6.0—>

点击File—>

New在Projects中选择MFCAppWizard(exe);

在Projectname中输入工程的名字Lwh,在Location中选择工程存放的路径。

填完后点击OK按钮。

填完后点击OK按钮,在弹出来的对话框中我们选择Singledocument,再点击Finish,完成工程的创建。

之后编译运行,结果参见图3。

图4.新建工程结果示意图

3.建立图元属性对话框

点击ResouceView,右击Dialog—>

插入Dialog,这时会弹出来一个对话框,双击“确定”按钮,选择“Create a new class”,点击OK,设置类名为CType—>

OK,之后设置对话框属性为IDD_TYType,参见图4,绘制对话框,参见附表2.属性表给各复选框、编辑框、按钮修改属性。

附表2

属性表

名称

ID

角度

IDC_Angle

图元类型

IDC_m_ComBox_TuYuanT

ype

线型

IDC_m_ComBoxLineType

线色按钮

IDC_LineColorButton

线色

(R/G/B)

IDC_LineColor(R/G/B)

填充色按钮

IDC_FillColorButton

填充色

IDC_FillColor(R/G/B)

高度

IDC_High

原点X

IDC_OrgX

宽度

IDC_Width

原点Y

IDC_OrgY

线宽

IDC_LineWidth

填充风格

IDC_m_ComBoxFillType

图5.构造对话框结果示意图

4.控件的关联

要实现这个步骤,首先要明白在MFC中变量的声明定义,对于控件关联型的数值变量,value类型(double,int,CString等等),在生成时向导帮你做了3件事:

1)在.h文件中进行声明;

2)在.cpp中的构造函数中,进行了初始化;

3)在.cpp文件中的DoDataExchange()中进行控件关联;

DDX_Text(pDX,IDOK,m_btnTest);

所以,要进行控件关联,要做的也是这三件事(可在ClassWizard中进行添加,

则系统自动生成。

下面介绍手动添加,以图元类型IDC_m_ComBox_TuYuanType

为例)

1)在Type.h中声明:

protected:

CComboBoxm_ComBox_TuYuanType;

2)在Type.cpp中进行初始化:

OnInitDialog()(在ClassWizard中添加)

{

CDialog:

OnInitDialog();

//TODO:

Addextrainitializationhere

m_ComBox_TuYuanType.AddString("

正方形"

);

矩形"

三角形"

圆"

椭圆"

文本"

m_ComBox_TuYuanType.SetCurSel(0);

}

3)在Type.cpp中进行控件关联(DoDataExchange()中):

DDX_Control(pDX,IDC_ComBox_TuYuanType,m_ComBox_TuYuanType);

5.枚举型

枚举类型定义的一般形式为:

enum枚举名{枚举值表}。

在枚举值表中应罗列出所有可用值。

这些值也称为枚举元素。

注意枚举值是常量,不是变量,不能再对它赋值。

枚举元素本身由系统定义了一个表示序号的数值,从0开始顺序定义为0,1,2……

1)定义(Type.h)

public:

EnumTuYuanTypm_TuYuanTyp;

2)枚举(Type.h)enum EnumTuYuanTyp

EnumTuYuanTyp_Square,//正方形

EnumTuYuanTyp_Rectangle,//矩形

EnumTuYuanTyp_Triangle,//三角形

EnumTuYuanTyp_Circle,//圆

EnumTuYuanTyp_Ellipse,// 椭圆

EnumTuYuanTyp_Text//文本

};

3)利用枚举型传参(Type.cpp)voidCType:

UpdateData();

Addextravalidationhere

intiSel=m_ComBox_TuYuanType.GetCurSel();

//得到当前选择的索引值switch(iSel)

case0:

m_TuYuanTyp=EnumTuYuanTyp_Square;

break;

case1:

m_TuYuanTyp=EnumTuYuanTyp_Rectangle;

case2:

m_TuYuanTyp=EnumTuYuanTyp_Triangle;

case3:

m_TuYuanTyp=EnumTuYuanTyp_Circle;

case4:

m_TuYuanTyp=EnumTuYuanTyp_Ellipse;

case5:

m_TuYuanTyp=EnumTuYuanTyp_Text;

default:

ASSERT(0);

OnOK();

6.定义动态数组

1)定义(LwhDoc.h)public:

CObArraym_Elements;

2)清除(LwhDoc.cpp)

//清除图元地址,释放空间CLwhDoc:

~CLwhDoc()

for(inti=0;

i<

m_Elements.GetSize();

i++)

deletem_Elements[i];

m_Elements[i]=NULL;

m_Elements.RemoveAll();

7.建立Shape类及其子类

一个类要支持支持序列化Serialize,必须从CObject派生,并且在类的声明(.h文件)中包含DECLARE_SERIAL申明,在类的实现(.cpp)中包含

IMPLEMENT_SERIAL申明。

所以,要建立支持序列化的Shape类,首先选择

ClassView,鼠标右键单击工程名,选择New Class,在类的类型中选择GenericClass,输入类名CShape,并在下方DerivedFrom中输入CObject,继承类型为public,点击确定,系统会生成相应的Shape.cpp文件和Shape.h文件。

在Shape.h中定义其成员变量和成员函数,注意OnDraw函数应定义为纯虚函数(参见附表1.函数定义与功能一览表)。

然后由Shape类派生其六个子类CSquare,CRectangle,CTriangle,CCircle,CEllipse,CText,继承方式均为public,在子类中也定义其成员函数及变量(以CSquare为例)

classCShape:

publicCObject

CShape();

virtual~CShape();

virtualvoidDraw(CDC*pDC)=0;

//绘制图元

virtualboolIsMatched(CPointpnt)=0;

//点是否落在图形内部

virtualvoidSerialize(CArchive&

ar)=0;

intOrgX;

intOrgY;

intwidth;

inthigh;

intlinewidth;

intR1,R2,G1,G2,B1,B2;

classCSquare:

publicCShape

CSquare();

CSquare(int x,int y,int w,int line,int r1,int g1,int b1,int

r2,intb2,intg2);

voidDraw(CDC*pDC);

//绘制

boolIsMatched(CPointpnt);

//重载点pnt是否落在图元内virtualvoidSerialize(CArchive&

ar);

//序列化正方形图元

private:

DECLARE_SERIAL(CSquare)//声明类CSquare支持序列化

在Shape.cpp中对Shape类极其子类进行序列化,并写入子类的成员函数,

完成绘图和进行图元匹配功能(以CSquare为例)IMPLEMENT_SERIAL(CSquare,CObject,1)//实现类CSquare的序列化,指定版本为1

if(ar.IsStoring())

ar<

<

OrgX<

OrgY;

//原点坐标ar<

width;

ar<

linewidth;

//线宽

else

ar>

>

OrgX>

OrgY;

//原点坐标ar>

CSquare()//缺省构造函数,初始化

OrgX=400;

//原点坐标

OrgY=400;

linewidth=1;

width=100;

CSquare(int x, int y, int w,int line,int r1,int g1,intb1,intr2,intb2,intg2)

OrgX=x;

OrgY=y;

linewidth=line;

width=w;

R1=r1;

R2=r2;

G1=g1;

G2=g2;

B1=b1;

B2=b2;

Draw(CDC*pDC)//绘制函数

CPenpen,*pOldPen;

pen.CreatePen(PS_SOLID,linewidth,RGB(R1,G1,B1));

pOldPen=(CPen*)pDC->

SelectObject(&

pen);

CBrushbrush,*pOldBrush;

brush.CreateHatchBrush(HS_DIAGCROSS,RGB(R2,G2,B2));

pOldBrush=(CBrush*)pDC->

brush);

pDC->

Rectangle(OrgX-width/2,OrgY-width/2,OrgX+width/

2,OrgY+width/2);

SelectObject(pOldPen);

SelectObject(pOldBrush);

IsMatched(CPointpnt)//图元匹配函数

if((OrgX-width/2<

=pnt.x&

&

pnt.x<

=OrgX+width/2)&

(OrgY-

width/2<

=pnt.y&

pnt.y<

=OrgY+width/2))returntrue;

returnfalse;

8.OnDraw()

由于Shape.cpp调用了Ondraw()函数,而OnDraw()函数的定义是在

LwhView.cpp中(参见附表1.函数定义与功能一览表),故应该在LwhView.cpp

中对Ondraw()进行调用声明,代码如下:

voidCLwhView:

CLwhDoc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

CShape*p=NULL;

if(pDoc->

m_Elements.GetSize()>

0)

for(inti=0;

i<

pDoc->

i++)

p=(CShape*)pDoc->

m_Elements[i];

p->

Draw(pDC);

adddrawcodefornativedatahere

9.鼠标左键消息响应函数

按下Ctrl+W组合键,在弹出的MFCClassWizard对话框中选择MessageMap,在Classname选择CLwhView类,在ObjectID中选择CLwhView,在右边的Messages中为其添加鼠标左键的消息响应函数OnLButtonDown,双击

OnLButtonDown函数(参见附表1.函数定义与功能一览表),出现OnLButtonDown()的定义模块,写入以下代码:

CTypedlg;

if((nFlags&

MK_CONTROL)==MK_CONTROL)//Ctrl键按下dlg.DoModal();

即可实现在单文档运行界面按下Ctrl+鼠标左键弹出对话框的操作,但是,要

实现当弹出对话框按下OK键就可以画出图形的操作,就得利用枚举型传过来的参数进行选择判断(switch语句),然后执行画图操作(以CSquare为例)

if(dlg.DoModal()==IDOK)

switch(dlg.m_TuYuanTyp)

caseEnumTuYuanTyp_Square:

p = newCSquare(dlg.X,dlg.Y,dlg.Width,dlg.LineWidth,

dlg.LineColorR,dlg.LineColorG,dlg

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2