VC++ 60 MFCWord下载.docx
- 文档编号:17981458
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:27
- 大小:398.73KB
VC++ 60 MFCWord下载.docx
《VC++ 60 MFCWord下载.docx》由会员分享,可在线阅读,更多相关《VC++ 60 MFCWord下载.docx(27页珍藏版)》请在冰豆网上搜索。
我们学了函数以后,会把一些局部功能模块化,即放在不同函数中,每个函数实现一些特定功能,会使程序的结构变得清晰。
当系统进一步复杂化以后,函数越来越多,有些函数功能相近,有些函数之间会相互调用,有些函数之间毫无任何关系,越来越多的函数会使程序结构变得凌乱,这时我们需要将这些函数进一步归类,和一些变量配合起来,将功能上联系比较紧密的函数封装在一起,形成一个类,这样系统的整体可读性就会大大增强,编写起来也会更加方便。
1.2写一个求和、平方和的类
打开VC,选择新建,有三个地方需要注意,如下图所示:
(1)要新建一个工程--“Projects”;
(2)工程类型选择控制台--“Win32ConsoleAppication”;
(3)要设定好工程名和工程所在的路径
{
returna+b;
intPFH()
voidmain()
inthe,pfh;
CSuanFasf1,sf2;
sf1.a=10;
sf1.b=20;
sf2.a=50;
sf2.b=60;
he=sf1.QiuHe();
sf1.a=30;
sf1.b=40;
pfh=sf1.PFH();
printf("
%d%d\n"
he,pfh);
}
这是一个最简单的类的定义与实现,该类的定义与实现和main函数一起都在同一个文件中,但一般建一个类不采用这种方法,而是采用下面的方法。
1.3VC中的类文件
一个VC的工程是由多个文件构成的,其中每个类都有两个文件,一个“.h”文件和一个“.cpp”文件,其中“.h”文件被称作该类的头文件。
类的定义放在头文件中,类的实现放在cpp文件中。
具体建一个类的方法如下:
(1)在工作空间的类视图(classview)中右击工程名,选择新建类,
(2)在“NewClass”对话框中,输入类名“CSuanFa”,一般类名以大写字母C打头,“SuanFa”用拼音,首字母大写。
如果类名以大写字母C打头,则类的文件名默认是将C去掉后剩下的部分,否则文件名和类名相同。
点击确定后系统生成如下两个文件SuanFa.h和SuanFa.cpp
(3)给该类添加成员函数可以右击类名,输入函数类型和名称即可。
点击确定,系统会自动在头文件中添加该函数的定义,在cpp文件中添加该函数的实现。
给该类添加成员变量可以通过右击类名的方法,也可以在类的头文件中直接添加。
下面是两个文件的具体内容。
SuanFa.h
classCSuanFa
intPFH();
intQiuHe();
CSuanFa();
virtual~CSuanFa();
inta;
intb;
};
SuanFa.cpp
#include"
SuanFa.h"
CSuanFa:
:
CSuanFa()
~CSuanFa()
intCSuanFa:
QiuHe()
{returna+b;
PFH()
{returna*a+b*b;
练习:
在该类当中添加求一个数组平方和的函数,在main函数中实现调用。
第二章MFC
MFC提供了三种类型的程序:
单文档、多文档、对话框,单文档类似与记事本程序,多文档类似于word程序,对话框程序最简单,程序界面全部由对话框构成。
我们首先要学习的是单文档程序的创建方法和设计思路。
2.1单文档程序构成
新建一个工程,选择MFC应用程序,输入工程名Aaa和路径,点击确定后弹出如下界面,
选择“SingleDocument(单文档)”,点击完成,VC会自动创建一个单文档程序,不需要写一行代码,编译运行,程序运行界面如下图所示
打开工作空间,如下图所示,在类视图中可以看到该工程现在有5个类构成,都是VC自动生成的,其中最重要的两个类是CMainFrame和CAaaView。
CMainFrame称作框架类,用来处理对程序框架的各种操作。
CAaaView称作视图类,用来处理对视图的各种操作。
我们首先通过一个画图的实例来学习视图类的用法。
2.2在OnDraw函数中画图
视图类中有一个OnDraw函数,我们需要把画图的代码放在该函中。
voidCAaaView:
OnDraw(CDC*pDC)
CAaaDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
pDC是画图用的画笔,利用pDC,可以调用很多画图函数,最简单是画直线,如下所示,(50,60)表示点的横坐标和纵坐标,坐标原点为视图的左上角,横坐标向右为正,纵坐标向下为正。
pDC->
MoveTo(50,60);
//表示将当前点移动到(50,60)
LineTo(300,400);
//表示从当前点到(300,400)画一条直线,当前点变为(300,400)
pDC->
LineTo(500,200);
这段程序画两段直线,如下图所示:
至此大家可以试着画一个五子棋的棋盘,纵横各19条线。
还可以画一条正弦曲线。
下面分步介绍如何给视图类添加两个成员函数DrawCircle和DrawSqure,一个用来画圆,一个用来画一个矩形:
(1)在工作空间中选择类视图,右击CAaaView类,添加成员函数DrawCircle,如下图所示:
点击确定添加代码如下
DrawCircle(CDC*pDC,intx,inty,intr)
Ellipse(x-r,y-r,x+r,y+r);
x、y、r表示圆的圆心坐标和半径。
Ellipse是画一个椭圆的意思,控制其形状的四个参数是其外接多边形的左上角的坐标和右下角的坐标。
用同样的方法可以添加一个画矩形的函数
DrawSqure(CDC*pDC,intx,inty,intw,inth)
MoveTo(x,y);
LineTo(x+w,y);
LineTo(x+w,y+h);
LineTo(x,y+h);
LineTo(x,y);
(2)在OnDraw函数中添加调用
DrawCircle(pDC,50,100,30);
DrawSqure(pDC,200,100,230,150);
编译运行,结果如下图所示:
2.4添加菜单控制所画的图形
下面通过添加画圆和画矩形的两个菜单来分步介绍如何用菜单控制所要画的图形:
(1)打开工作空间中的资源视图,点击菜单,打开IDR_MAINFRAME菜单,双击“帮助”右侧的空白方格
(2)双击“画图”下面的空白方格,添加画圆菜单,将其ID号设为ID_M_Circle,Caption设为“画圆”。
注意,每个菜单项都要有一个明确的ID号,每个菜单的ID号在该工程中都是唯一的,是该菜单在工程中的编号,系统通过ID号来对每个菜单进行一系列处理。
因此ID号的名称设置要简洁明了,一般菜单ID号用“ID_M_”打头,后面跟上菜单名称的英文单词或者汉语拼音,每个单词的首字母要大写。
用同样的方法添加画矩形的菜单。
(3)添加菜单消息响应函数。
右击“画圆”菜单,选择类向导(ClassWizard),打开下图所示界面:
首先类名(classname)选择CAaaView,然后ID号选择ID_M_Circle,然后双击Messages框中的“Command”,添加消息响应函数,系统给出的默认函数名为OnMCircle。
用同样的方法添加“画矩形”的消息响应函数
(4)在CAaaView类头文件中添加成员变量m_nPic,用来表示当前要画哪一个图形,我们这里采用一个简单方法,当m_nPic值为1时画圆,当m_nPic值为2时画矩形。
因此OnDraw函数中的代码修改如下:
if(m_nPic==1)
DrawCircle(pDC,50,100,30);
if(m_nPic==2)
DrawSqure(pDC,200,100,230,150);
下面一个问题就是m_nPic的值何时变为1或者2,按照问题描述应该是点画圆菜单时m_nPic的值变为1,点画矩形菜单时m_nPic的值变为2,所以代码修改如下
OnMCircle()
m_nPic=1;
Invalidate(true);
OnMSqure()
m_nPic=2;
代码中,Invalidate()函数的作用是,让系统重新调用OnDraw(),重新绘制视图。
如果参数为true,则重绘时先清空上一次绘制的内容,如果参数为false,则重绘时不清空上一次绘制的内容,在上次绘制内容上叠加。
至此本节要完成的工作已经基本完成。
2.5添加时钟函数生成动画
本节要完成的工作是再添加两个菜单,“动画”和“停止”,当点击“动画”时能让所画的图形动起来,当点击“停止”时能让所动画停止。
需要通过时钟控制函数SetTimer、OnTimer和KillTimer来实现,步骤如下:
(1)添加两个菜单,“动画”和“停止”,为两个菜单在CAaaView类中添加消息响应函数。
OnMDongHua()
SetTimer(1,100,NULL);
OnMStop()
KillTimer
(1);
SetTimer(1,100,NULL)的意思是设置编号为1的时钟,该时钟每隔100毫秒,触发调用一次OnTimer函数。
(2)添加时钟响应函数OnTimer()
如下图所示,选择View菜单,点击“类向导(ClassWizard)”
打开下图所示的“MFCClassWizard”界面,
类名(classname)选择CAaaView,Messages框中找到“WM_TIMER”,双击“WM_TIMER”,给工程添加OnTimer函数。
(3)添加CAaaView的成员变量,控制图形坐标位置,让其动起来,为简单起见,这里只让图形向右平动,这样只要修改每个图形的横坐标即可。
所以只要添加一个成员变量m_x。
下面说明如何让圆动起来。
OnMCircle中将m_x初值设为50,OnDraw将圆心横坐标改为m_x,这样,点“画圆”菜单后,圆形初始位置的圆心横坐标是50。
在OnTimer中设定m_x+=10,这样每隔200毫秒,圆心横坐标变一下,然后重新调用OnDraw重绘视图,即可实现整个圆向右匀速直线运动。
m_x=50;
DrawCircle(pDC,m_x,100,30);
OnTimer(UINTnIDEvent)
m_x+=10;
CView:
OnTimer(nIDEvent);
用同样的方法可以实现矩形的在各个方向上的运动。
本节练习:
(1)在视中画多个圆、三角形和矩形等图形,设定好每个图形的初始运动速度,碰到边框后可以反弹。
(2)画一条正弦曲线,和一个小球,小球按照正弦曲线的轨迹在运动,运动速度按照余弦曲线的规律。
因为正弦的导数就是余弦,位移的导数就是速度。
2.6对话框功能的实现
一个工程当中会有很多地方需要通过对话框来设置参数值或者显示参数值,本节学习如何通过对话框来设置和显示所需要的参数值。
(1)打开工作空间资源视图(ResourceView),右击Dialog文件夹,选择“InsertDialog”新建一个对话框,右击对话框修改对话框的属性,将其标题改为“参数设置”,ID号改为“IDD_CanShuSheZhi”,在对话框上创建三个编辑框,将ID号分别改为IDC_X、IDC_Y、IDC_He,创建一个按钮“求和”,将ID号改为“IDC_QiuHe”,如下图所示。
(2)在该对话框上任何一个地方右击,选择“ClassWizard”,系统会提示为该对话框新建一个类,点击确定弹出如下界面:
(3)设定控制该对话框的类名CDlgCanShuSheZhi,一般对话框的类名以“CDlg”打头,该类的基类取系统默认的“CDialog”。
点击确定系统就会自动生成该类。
至此对话框以及管理该对话框的类已经完成,下面就可以通过添加菜单来打开该对话框。
(4)添加参数设置菜单,为该菜单添加消息响应函数
voidCMainFrame:
OnCanShuSheZhi()
CDlgCanShuSheZhidlg;
dlg.DoModal();
需要注意的是一定要在该文件中包含头文件#include"
DlgCanShuSheZhi.h"
,这样才能使用对话框类CDlgCanShuSheZhi。
此时运行程序点击参数设置菜单就会弹出如下界面。
此时点击“求和”还不能进行计算,这是因为还没有为编辑框绑定变量,也没有为“求和”按钮添加消息响应函数。
下一步为该类添加成员变量用于读取和显示参数值。
(5)打开对话框编辑界面,右击第一个编辑框,选择“ClassWizard”,弹出如下界面,
在上述界面中选择成员变量,双击“IDC_x”,弹出下述界面,设定变量名为m_x,变量类型为int,点击确定即可,用同样的方法添加变量m_y,m_he。
(5)在对话框界面上双击“求和”按钮,添加该按钮的消息响应函数,函数名默认为“OnQiuHe”,添加代码如下:
voidCDlgCanShuSheZhi:
OnQiuHe()
{UpdateData(true);
m_he=m_x+m_y;
UpdateData(false);
其中UpdateData(true)的作用是将界面上输入的值更新到变量m_x和m_y中,UpdateData(false)的作用是将变量m_he的值更新到界面上,即在界面上显示出来。
至此,本节的任务已经全部完成。
需要进一步说明的是,成员变量m_x和m_y和此前讲述的类成员变量有所不同,不同的地方在于这两个变量由MFC自动绑定了两个文本框,其它用法和之前讲述的相同。
绑定文本框的代码在DlgCanShuSheZhi.cpp中,如
DoDataExchange(CDataExchange*pDX)
CDialog:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgCanShuSheZhi)
DDX_Text(pDX,IDC_x,m_x);
DDX_Text(pDX,IDC_y,m_y);
DDX_Text(pDX,IDC_He,m_he);
//}}AFX_DATA_MAP
这部分代码是系统自动生成的,初学者不需要去关注它,只要有所了解就可以了。
2.7添加对话框设置图形参数
一个图形会涉及到多个参数,比如圆的参数有圆心坐标、半径等,我们有时需要在对话框中去设置图形的参数,然后根据参数来重绘图形,下面分步介绍如何实现点击画圆菜单后,弹出一个对话框,在对话框中设置圆心坐标和半径,点击确定后重画图形。
(1)打开工作空间资源视图(ResourceView),右击Dialog文件夹,选择“InsertDialog”新建一个对话框,右击对话框修改对话框的属性,将其标题改为“圆形参数设置”,ID号改为“IDD_HuaYuan”,界面布局设置如下,按照2.6的方式添加成员变量绑定编辑框。
(2)添加“画圆”菜单,在CAaaView添加该菜单的消息响应函数,代码如下
OnYuan()
CDlgYuandlg;
if(dlg.DoModal()==IDOK)
m_X=dlg.m_x;
m_Y=dlg.m_y;
m_R=dlg.m_r;
m_Pic=1;
其中,m_X,m_Y,m_R是CAaaView类的成员变量,m_x,m_y,m_r是CDlgYuan类的成员变量,OnDraw()函数中画圆的代码为:
Ellipse(m_X-m_R,m_Y-m_R,m_X+m_R,m_Y+m_R);
2.8对话框中各种控件的实现
2.8切分视图窗口
新建一个工程Aaa
(1)新建一个CMyView类,基类可以是CFormView,CView或者CTreeView
如果是CFormView,则需要建一个对话框,将对话框属性改为子对话框,且没有标题和边框
这样工程会有两个View类:
CAaaView,CMyView
(2)在AaaView.h中包含#include"
aaaDoc.h"
(3)在MainFrm.h中添加变量,CSplitterWndm_wndSplitter;
(4)在MainFrm.h中包含#include"
AaaView.h"
和#include"
MyView.h"
(5)通过类向导给CMainFrm添加OnCreateClient函数。
BOOLCMainFrame:
OnCreateClient(LPCREATESTRUCTlpcs,CCreateContext*pContext)
{
if(!
m_wndSplitter.CreateStatic(this,1,2))
returnFALSE;
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CAaaView),CSize(270,100),pContext);
//创建第1行第1列的视图窗口
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CMyView),CSize(100,100),pContext);
//创建第1行第2列的视图窗口
returnTRUE;
returnCFrameWnd:
OnCreateClient(lpcs,pContext);
2.9消息响应处理
2.9.1鼠标消息相应处理
以鼠标左键按下的消息处理为例,如下图所示,选择视图类,在消息框中选择“WM_LBUTTONDOWN”,双击添加“OnLButtonDown()”函数
voidCCHuaTuView:
OnLButtonDown(UINTnFlags,CPointpoint)
{CStringstr;
str.Format("
x=%d,y=%d"
point.x,point.y);
AfxMessageBox(str);
OnLButtonDown(nFlags,point);
同学们可以试一下OnLButtonUp函数和OnMouseMove函数。
2.9.2键盘消息相应处理
在类向导中选择WM_KeyDown消息。
添加代码如下:
OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)
switch(nChar)
case39:
m_x+=100;
break;
case37:
m_x-=100;
OnKeyDown(nChar,nRepCnt,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC+ 60 MFC VC