收藏 分销(赏)

c++编程实例PPT.ppt

上传人:w****g 文档编号:10040588 上传时间:2025-04-19 格式:PPT 页数:138 大小:749.50KB 下载积分:20 金币
下载 相关 举报
c++编程实例PPT.ppt_第1页
第1页 / 共138页
c++编程实例PPT.ppt_第2页
第2页 / 共138页


点击查看更多>>
资源描述
,第二级,第三级,第四级,第五级,第,10,章,Visual C+,编程实例,第,10,章,Visual C+,编程实例,10.1 MFC,编程流程,10.2,常用,FC,类和消息处理,10.3,对话框的应用,10.4,菜 单 的 应 用,10.5,工具栏应用,10.1 MFC,编程流程,在普通的,C/C+,程序中,可以看到程序从,main,函数开始到结束的所有代码,但在,Visual C+,中,MFC,封装了一部分类,同时也隐藏了一部分代码,因此我们看不到源程序的所有代码,例如从项目的所有源文件中找不到,main,函数。,基本对话框的,MFC,程序流程图如图,10-1,所示。,图,10-1,一个,MFC,程序运行的一般过程如下:,(1),生成,CwinApp,的一个实例,(,调用,CwinApp,的构造函数,),,初始化全局对象;,(2)Win32,入口程序函数,WinMain,调用函数,AfxWinMain;,(3)AfxWinMain,调用函数,CwinApp,的成员函数,InitInstance;,(4)AfxWinMain,调用函数,CwinApp,的成员函数,Run;,(5)AfxWinMain,函数返回到,WinMain,WimMain,结束,程序结束。,例,10-1,吹泡泡程序。每当用户在窗口客户区中按下鼠标左键时即可产生一个泡泡,(,彩色圆形,),。,设计思路:显示一个泡泡所需的数据包括其位置和大小,在,MFC,中可用其包含矩形表示。可设置一数组,每当用户按下鼠标左键时,就产生一个泡泡的数据并存入数组中。最后,由框架窗口类的,OnPaint(),函数显示所有的泡泡。,#include,#define MAX_BUBBLE 250,class CMyWnd:public CFrameWnd,CRect m_rectBubbleMAX_BUBBLE;,int m_nBubbleCount;,public:,CMyWnd()m_nBubbleCount=0;,protected:,afx_msg void OnLButtonDown(UINT nFlags,CPoint point);,afx_msg void OnPaint();,DECLARE_MESSAGE_MAP(),;,/,消息映射,BEGIN_MESSAGE_MAP(CMyWnd,CFrameWnd),ON_WM_LBUTTONDOWN(),ON_WM_PAINT(),END_MESSAGE_MAP(),/,框架窗口类的成员函数,void CMyWnd:OnLButtonDown(UINT nFlags,CPoint point),if(m_nBubbleCountMAX_BUBBLE),int r=rand()%50+10;,CRect rect(point.x-r,point.y-r,point.x+r,point.y+r);,m_rectBubblem_nBubbleCount=rect;,m_nBubbleCount+;,InvalidateRect(rect,FALSE);,void CMyWnd:OnPaint(),CPaintDC dc(this);,CBrush brushNew;,CPen penNew;,brushNew.CreateSolidBrush(RGB(rand()%255,rand()%255,rand()%255);,penNew.CreatePen(PS_SOLID,1,RGB(255,0,0);,dc.SelectObject(,dc.SelectObject(,for(int i=0;iCreate(0,_T(,吹彩色泡泡,);,pFrame-ShowWindow(m_nCmdShow);,this-m_pMainWnd=pFrame;,return TRUE;,CMyApp ThisApp;/,全局应用程序对象,按,【Ctrl+F5】,运行程序,运行结果如图,10-2,所示。,说明:,该程序声明了两个类,一个是由应用程序类,CwinApp,派生出来的,CmyApp,类,一个是由框架窗口,CframeWnd,类派生出来的,CmyWnd,类。,MFC,的基本类名均以字母,C,打头,习惯上在为使用,MFC,编写的应用程序中的类起名时也这样做。在程序中还声明了一个,CmyWnd,类的全局对象,ThisApp,。,图,10-2,在,CmyWnd,类中声明了一个数组成员,m_rectBubble,用于存放泡泡的数据;另外,还声明了一个整型数据成员,m_nBubbleCount,用来存放数组中泡泡的实际数量。在框架窗口类的构造函数中该成员变量被初始化为,0,,由于构造函数非常简单,因此使用了内联函数的形式。,OnPaint(),函数用于绘制客户区的内容。要完成这项任各,需要先建立一个设备环境,(Device Context),这可以通过声明一个,CpaintDC,类的对象,dc,实现。在声明语句中,应将当前窗口对象指针,this,传给,CpaintDC,类的构造函数,把绘图区域确定为当前窗口的客户区。,Windows,在窗口更新、移动、改变尺寸或移去覆盖在其上的其它窗口对象时均会向该窗口发送,WM_PAINT,消息,从而触发应用程序调用,OnPaint(),函数重绘窗口客户区。,OnPaint(),函数根据数组,m_rectBubble,的内容画出一个泡泡。其中语句。,dc.SelectStockObject(LTGRAY_BRUSH);,用于选择一个库存画刷,画刷决定了所画图形,(,如椭圆、矩形和多边形等,),内部的颜色。,在处理鼠标消息的,ONLButtonDown(),函数中,语句,int r=rand()%50+10;,随机确定了要画出的泡泡的半径,(,范围为,10,50,像素点,),,其中全局函数,rand(),可产生一个随机整数。,调试:,首先,使用,Visual C+,集成开发环境中的菜单选项,“,文件,/,新建,”,,并在项目选项卡中选择,“,Win32 Application,。,其次,在编译时要确定应用程序的可执行程序如何使用,MFC,的类库。一种方法是使用共享的动态链接库,(DLL),。这种链接方式显著地减小了应用程序的可执行文件的大小,并能有效地利用系统资源。,用系统资源。,然而,动态链接到,MFC,时要求提供,Mfcnn.dll,库文件,文件名中的,nn,代表,MFC,的版本号。该文件通常在,Windows System,或,System32,文件夹下。如果一个应用程序动态链接到了,MFC,,但该应用程序通常用在那些可能没有,Mfcnn.dll,库的计算机系统上,则应把这个库文件作为应用程序包的一部分提供给用户。,Microsoft,允许程序员自由地把这些库文件附在应用程序中。,另外,也可以选择应用程序静态链接到,MFC,。静态链接意味着,应用程序不依赖于,MFC,库文件的存在,(,但仍然可能需要,Msvcrt.dll,文件,),。静态链接的代价是可执行文件更大,而且,MFC,内存的利用可能不够充分。,在菜单中选择,“,工程,”,中的,“,设置,”,对话框,在对话框右方的,“,General,”,选项卡中通过组合框,“,Microsoft Foundation Classes,”,选择使用,MFC,类库的方法。可选项有三种,分别为,“,Not Using MFC(,不使用,MFC),Use MFC in a Shared DLL(,以动态链接库方式使用,MFC),”,和,“,Use MFC in a Static Library(,以静态库方式使用,MFC),”,。,10.2,常用,FC,类和消息处理,10.2.1,常用,MFC,类,MFC,的类构成了一个完整的体系,该体系由一个被称为,Cobject,的类作为基类,其它类大部分由该类派生而来,如,CWnd(,窗口类,),、,Cdocument(,文档类,),、,Cfile(,文件类,),等。也有一部分类如字符串类,,Cstring,和时间类,Ctime,等则不从,Cobject,继承。,1.,窗口公共基类,CWnd,类,CWnd,对所有,Windows,窗口提供功能支持,它是所有窗口类的直接或间接父类。,一个,CWnd,对象和一个,Windows,窗口是有本质区别的,尽管它们有密切的联系。,CWnd,对象是一个概念,即类的实例,而,Windows,窗口则是指向,Windows,内部数据结构的一个句柄,它的创建和显示要消耗系统资源。一个,CWnd,对象通过其构造函数被创建,被析构函数销毁,而一个,Windows,窗口则通过,CWnd,的,Create,函数创建,被,DestroyWindow,函数销毁。,1),窗口句柄,(1),窗口句柄的创建:当,CWnd:Create,被调用时,,Windows,窗口被创建,窗口句柄存放在,CWnd,的成员变量,m_hWnd,中。,(2),程序中窗口句柄的取得:可以直接利用成员变量,m_hWnd,,但安全的方法是调用函数,CWnd:Get(),,它返回与窗口对象相关联的句柄,并且当窗口对象没有关联句柄时或当前,CWnd,指针为,NULL,时返回空指针。,(3),窗口句柄的销毁:调用,CWnd:DestroyWindow,。,2),窗口的大小和位置,(1)IsIconic:,窗口是否处在最小化状态。,(2)IsZoomed:,判断窗口是否在最大化状态。,(3)MoveWindow:,改变窗口的大小、位置和,Z,轴顺序。,Z,轴顺序指本窗口和其他窗口的覆盖关系。,3),窗口的状态,(1)ShowWindow:,显示或隐藏一个窗口,显示可以有多种方式:最大化、最小化、正常显示等。,(2)IsWindowEnabled:,判断一个窗口是否可见。,(3)IsWindowEnabled:,判断窗口的禁止,/,使能状态,禁止状态的窗口不能响应用户的键盘和鼠标的输入。,(4)EnableWindow:,设置窗口的禁止,/,使能状态,参数为,true,表示使能。,4),定时器函数,(1)SetTimer,:开始一个系统定时器。定时器的作用是每隔指定时间发一次,WM_TIMER,消息。,(2)KillTimer:,结束一个指定的系统定时器。,5),提示函数,(1)FlashWindow:,闪烁窗口。,(2)MessageBox:,弹出一个标准消息框。,例如:开始一个系统定时器每,0.5,秒发一次,WM_TIMER,消息,代码为:,SetTimer(1,500,NULL):,其中,第一个参数表示定时器的标识,第二个参数表示发送,WM_TIMER,的间隔时间,第三个参数是一个回调函数,一般设为,NULL,。可以在,WM_TIMER,消息的处理函数,OnTimer(,通过,ClassWizard,添加,),中加入处理代码来响应定时器消息。结束定时器的方法是调用以定时器标识为参数的函数,KillTimer,,比如:,KillTimer(1);,2,字符串类,CString,Cstring,类是,MFC,对字符串的封装,它包含一个可变长的字符序列,提供了很多串操作,使用它比使用其它字符串类型更加方便。可以说,几乎每个,MFC,程序都要用到这个类。,CString,没有继承任何类,且其各个字符都是,TCHAR,类型。,CString,对象可以随着串合并操作动态增加其长度,而无须用户来对其长度进行专门设置。,CString,可以看作一个串类型,而不是一个指向字符串的指针。,1)CString,的构造函数,CString,类拥有众多的构造函数,用于以不同的数据类型和不同的方式构造一个字符串对象,它们是,(1)CString();/,无参数的构造函数,产生一个空的,Cstring,对象,(2)CString(const Cstring /,用另外一个,Cstring,对象的值初始化对象,(3)CString(TCHAR ch,int nRepeat=1);/,用一个字符重复若干次来初始化对象,(4)CString(LPCTSTR lpch,int nLength);/,用一个字符数组和一定长度初始化对象,(5)CString(const unsigned char *psz);/,从一个无符号字符指针构造对象,例如:,CString s1;,CString s2(big);,CString s3=s2;,CString s4(s2+s3);,2)CString,的基本操作,Cstring,的基本操作如下:,(1),求得到字符串长度:,GetLength,返回一个,int,类型的数。,(2),判断字符串是否为空:,BOOL IsEmpth()const,。,(3),强制字符串长度为,0,:,void Empty(),。,(4),得到字符串某位置的字符:,TCHAR GetAt(int nIndex)const,。,(5),设置字符串某位置的字符:,void SetAt(int nIndex,TCHAR ch),。,(6),强制转换为字符串指针类型:,operator LPCTSTR,。,例如,获取字符串,str,最后一个字符的语句如下:,CString str=aabbcde;,Char c1=str.GetAt(str.GetLength()-1);,3),串提取,串提取函数由于根据某种原则从串中提取一个子串。相关函数包括,Mid,,,Left,和,Right,。,(1)CString Mid(int nFirst)const;/,获取从,nFirst,位置字符开始的子串,(2)CString Mid(int nFrist,int nCount)const;/,获取从,nFirst,位置的字符开始包含,nCount,/,个字符的子串,(,即到,nFirst+nCount-1,位置,/,的字符为止,),(3)CString Left(int nCount)const;/,获取左边,nCount,个字符所构成的子串,(4)CString Right(int nCount)const;/,获取右边,nCount,个字符所构成的子串,4),转换字符串,(1)void MakeUpper();/,将字符串中所有字符换成大写,(2)void MakeLower();/,将字符串中所有字符换成小写,(3)void MakeReverse();/,将字符串中各字符的顺序倒转,(4)void Empty();/,将字符串中所有字符删除,5),字符串格式化函数,字符串格式化函数是,CString:Format,,它根据一个参数字符串,(,格式控制字符串,),和几个变量来格式化一个串。,该函数的格式如下:,void Format(LPCTSTR lpszFormat,.);,void Format(UINT nFormatID,.);,该成员函数用于根据格式,lpszFormat,,用其它数据构造一个字符串。其中省略号,“,.,是输出参数表,每个参数可以是一个变量或表达式。函数,Format,常常用于把其它类型的变量转换为字符串形式,或者把几个不同类型的值合并成一个字符串的形式。,例如:,CString s1,s2,s3;,s1.Format(%c,65);,s2.Format(float:%f,int:%d,hexint:%x,3.48,20,0 xFF);,s3.Format(string:%s,formated float:%2.1f,hehe,3.14159);,执行以上代码后,s1,字符串是,A,,,s2,字符串是,float:3.480000,int:20,hexint:ff,s3,字符串是,string:hehe,formated float:3.1,。,3,CPoint,、,Crect,和,Csize,类,1)Cpoint,类,MFC,中的,Cpoint,类是对,Windows,结构,POINT,的封装,凡是能用,POINT,结构的地方都可以用,Cpoint,代替。,Cpoint,提供了一些成员函数,使得操作,POINT,结构和,Cpoint,类更加方便。,结构,POINT,表示一个屏幕上的二维点,它的定义如下:,typedef struct tagPOINT,LONG x;,LONG y;,POINT;,其中,x,和,y,分别是点的横坐标和纵坐标。,2)CSize,类,MFC,中的,Csize,类是对,indows,结构,SIZE,的封装,凡是能用,SIZE,结构的地方都可以用,CSize,代替。结构,SIZE,表示一个矩形的长度和宽度,它的定义如下:,typedef struct tagSIZE,int cx;,int cy;,SIZE;,其中,cx,和,cy,分别是矩形的长度和宽度。,3)CRect,类,Crect,类是对,Windows,结构,RECT,的封装。结构,RECT,表示一个矩形。,Typedef struct tagRECT,LONG left;,LONG top;,LONG right;,LONG bottom;,RECT;,其中,,left,和,top,分别表示矩形左上角顶点的横、纵坐标;,right,和,bottom,分别表示矩形右下角顶点的横、纵坐标。,4,CPaintDC,类,在,CpaintDC,类中封装了大量的绘图和文字输出方法,(,成员函数,),(1),文字信息显示。文字信息显示的成员函数为:,BOOL TextOut(int x,int y,LPCTSTR lpszString);,该函数用于在指定坐标,(x,y),处显示字符串,lpszString,的内容,显示成功返回非,0,值,否则返回,0,。坐标原点,(0,,,0),在客户区左上角,,Y,轴向下。,(2),画点。画点的成员函数为,COLORREF SetPixel(int x,int y,COLORREF color);,COLORREF SetPIxel(POINT point,COLORREF color);,该函数在指定坐标处按给定颜色画点,返回值为原来此坐标处的颜色。,(3),取指定坐标点的颜色。取指定坐标点的颜色的函数为:,COLORREF GetPixel(int x,int y)const;,COLORREF GetPixel(POINT point)const;,该函数的返回值为指定坐标处的颜色。,(4),画线。画线分两步完成:首先确定线的起始位置,然后再调用画线函数。,用,MovoTo,将绘图位置移动到指定位置的原型为:,CPoint MoveTo(int x,int y);,Cpoint Moveto(POINT point);,用,LineTo,函数画线的原型为:,BOOL LineTo(int x,int y);,BOOL LineTo(POINT point);,(5),绘制矩形。绘制矩形的成员函数为:,BOOL Rectangle(int x1,int y1,int x2,int y2);,BOOL Rectangle(LPCRECT lpRect);,该函数的参数为需要绘制的矩形的左上角坐标,(x1,y1),和右下角坐标,(x2,y2),。,(6),绘制椭圆。绘制椭圆的成员函数的原型为:,BOOL Ellipse(int x1,int y1,int x2,int y2);,BOOL Ellipse(LPCRECT lpRect);,该函数的参数的含义为所绘椭圆的包含矩形的左上角和右下角坐标。,10.2.2,绘制图形,1.,图形对象的使用方法,普通绘图对象使用的模式为以下,4,步:,(1),生成绘图对象。,例如:,Cpen pen,*op;,pen.CreatePen(PS_SOLID,1,RGB(0,0,0);,这里定义的,Cpen,类指针,op,用于存储绘图前的画笔,使绘图结束后能够恢复系统原有状态。上面代码中的,RGB(0,0,0),是一个宏,用于定义,COLORREF,类型的颜色。,COLORREF,实际上是一个,32,位整数类型,用于表示颜色,其第,0,、,1,、,2,字节分别用于存放该颜色的红、绿、蓝色分量。如果已知某颜色的,3,个分量,则可使用宏,RGB(),构造出该颜色:,COLORREF RGB(BYTE bRed,,,BYTE bGreen,,,BYTE bBlue),;,其中,第,1,个参数是颜色的红色分量,第,2,个参数是颜色的绿色分量,第,3,个参数是颜色的蓝色分量,各个分量的取值范围为,0,255,。例如:,RGB(0,,,0,,,0),为黑色,,RGB(255,,,255,,,255),为白色。,(2),将绘图对象选入绘图设备环境。其代码为:,op=pDC-SelectObject(,可以看出,将绘图对象选入绘图设备环境的方法是调用,CDC,:,SelectObject(),函数,与此同时,还要保留旧的画笔。,(3),进行绘图。其代码为:,pDC-Moveto(100,100);,pDC-Lineto(200,200);,(4),绘图工作结束后,进行绘图设备环境的恢复工作。其代码为:,pDC-SelectObject(op);,如果还要改变,pen,的参数的话,必须将,pen,删除:,pen.DeletObject();,2.,画笔和画刷,画笔是用来画线的工具,是,Cpen,类的对象。画刷是用来填充图形的工具,是,Cbrush,类的对象。,1),画笔,画笔由,Cpen,类管理,使用,Cpen,类对象时,需要无对其进行初始化工作,初始化,Cpen,类对象的方法有以下,3,种:,(1),调用,Cpen,类的构造函数。,(2),调用,Cpen:CreatePen(int nPenStyle,int nWidth,COLORREF crColor),函数。其中第,1,个参数是画笔的样式,可取值为:,PS_SOLID /,创建实线笔,PS_DASH /,创建由短线构成的虚线,PS_DOT /,创建由点构成的虚线,PS_DASHDOT /,创建由短线和点构成的虚线,(3),调用,Cpen:CreatePenIndirect(),函数,通过,LPLOGPEN,结构来设置,Cpen,的属性。例如:,Cpen penRed;/,说明画笔对象,penRed.CreatePen(PS_SOLID,3,RGB(255,0,0);/,创建宽度为,3,的红色实线画笔,/,使用新的画笔时,要保存原来的画笔以便恢复,Cpen *pOldPen;,POldPen=dc.SelectObject(,/,以下是作图代码,且使用新画笔画线,dc.SelectObject(pOldPen);/,恢复原来的画笔,2),画刷,画刷是用来填充图形的工具,创建画刷有两种方法:一种是调用构造函数,另一种是调用相关的成员函数。,使用画刷叶要定义画刷对象,创建画刷并保存原来的画刷,在绘图工作结束后还要恢复原来的画刷。例如:,Cbrush NewBrush;/,声明画刷对象,Cbrush *POldBrush;/,保存原画刷的指针,NewBrush.CreateSolidBrush(PS_SOLID,21,RGB(0,0,255);/,建立画刷,Pold_Brush=pDC-SelectObject(/,将画刷选入设备文本对象,/,使用画刷,/,恢复原先的画刷对象,pDC-Selectobject(PoldBrush);,10.2.3,消息处理,Windows,操作系统是一个基于消息的操作系统,其程序总要同消息打交道,这正是,Windows,程序同,DOS,程序不同的地方。实际上,,Windows,系统通过,Windows,消息告诉所有应用程序发生了什么事件,例如用户点击了鼠标、用户点击了键盘的哪个键等,每个应用程序都有消息处理或一组消息响应函数,用于对消息进行响应。,Windows,操作系统中定义了,900,余个,Windows,消息,系统将用户的输入传给应用程序,然后又为每个输入产生消息。此外,系统还为应用程序的变化产生消息,如窗口的尺寸发生了变化等。应用程序自已也可能产生消息,用于对应用程序内部发生的特殊事件进行处理或其它应用程序之间的通信。,系统向应用程序发送消息时,将向应用程序发送个参数:,(1),一个窗口的句柄:窗口句柄用于标识窗口的一个常数,,Windows,的每个窗口都有一个窗口句柄。消息参数中的窗口句柄标识的是接受消息的窗口。,(2),一个消息标识:标识了产生的消息。消息标识的例子有,WM_CREATE,其中,,WM_,代表,indows Message,是,indows,窗口产生的消息,而,WM_CREATE,代表窗口正在被创建,,WM_PAINT,则代表窗口的客户区需要被重画。,(3),两个,32,位的参数:消息参数定义了,Windows,应用程序处理消息所需的数据或数据所在的位置,这两个参数的含义与具体的消息有关。消息参数可以包含一个整数、一组标志或一个结构对象的指针。消息参数也可以是,NULL,,表示消息没有参数。,1.Windows,消息分类,Windows,消息大体上可以分为两大类:一类是系统定义的消息,另一类是用户自定义的消息。其中,Windows,系统定义的消息可以分为以下种:,(1)Windows,消息:这类消息主要是以,WM_,作前缀的消息,(WM_COMMAND,除外,,WM_COMMAND,消息专门被用于处理菜单和控件发出的消息,),,且必须由,CWnd,类或,CWnd,类的派生类进行处理。消息响应函数也必须被定义在发送消息,CWnd,类或,CWnd,派生类中。可见,这类消息属于面向,Windows,窗口的消息。,(2),控件通知消息:这类消息主要由控件或其它子窗口发出,并对各控件或子窗口的父窗口进行处理。这类消息属于,WM_COMMAND,消息,只不过在,WM_COMMAND,消息的两个消息参数中包含了每个控件的句柄、标识,(ID),和通知消息等信息。,(3)Windows,命令消息:这类消息是指由菜单、工具条和加速键等发出的,WM_COMMAND,通知消息。,2.,鼠标消息处理,移动鼠标或点击鼠标按键,,Windows,便产生一个或多个消息并将其发送给位于鼠标光标下的窗口。编程时常用的鼠标消息有:,WM_LBUTTONDOWN /,按下鼠标左键,WM_LBUTTONUP /,释放鼠标左键,WM_LBUTTONDBLCLK /,双击鼠标左键,WM_RBUTTONDOWM /,按下鼠标右键,WM_RBUTTONUP /,释放鼠标右键,WM_RBUTTONDBLCLK /,双击鼠标右键,WM_MOUSEMOVE /,移动鼠标,对应的,Wnd,类的消息处理成员函数分别为:,void OnLButtonDown(UINT nFlags,CPoint point);,void OnLButtonUp(UINT nFlags,CPont point);,void OnLButtonDblClk(UINT nFlags,Cpoint point);,void OnRButtonDown(UINT nFlags,Cpoint point);,void OnRButtonUp(UINT nFlags,Cpoint point);,void OnRButtonDblClk(UINT nFlags,Cpoint point);,void OnMouseMove(UINT nFlags,Cpoint point);,其中,参数,point,表示鼠标的位置,,nFlags,是几个控制键的状态,可以是下列值及其组合:,MK_CONTROL /Ctrl,键被按下,MK_LBUTTON /,鼠标左键被按下,MK_RBUTTON /,鼠标右键被按下,MK_SHIFT /Shift,键被按下,例如:,“,MK_SHIFT|MK_LBUTTON,”,表示同时按下了,Shift,键和鼠标左键。,10.3,对话框的应用,对话框是一些弹出式窗口信息的弹出式窗口。它通常包含,应用程序利用它可和用户进行交互式操作。对话框是应用程序,用于显示或提示并等待用户输入一个或多个控件,利用这些控件,用户可以输入文本、选择选项,并完成某一特定命令。,对话框分为模式对话框和非模式对话框两种。模式对话框是指这种对话框出现时,它的父窗口将暂时失效,只有处理完对话框所要求的动作后,才会将控制权交回给父窗口。非模态对话框图类似普通的窗口,并不垄断用户的输入。在非模式对话框打开时,用户随时可用鼠标点击等手段激活其它窗口对象,操作完毕后再回到本对话框。本节只通过一个实例来介绍模式对话框。,图,10-3,是用,AppWizard,生成的一个基于对话框的程序运行界面。下面详细介绍它的实现步骤:,图,10-3,1.,产生对话框模板,在,VC+6.0,中选择菜单,“,File,”,“,New,”,或按,【Ctrl+N】,键,弹出一个对话框,如图,10-4,所示。在对话框中选择工程标签页,用鼠标选中左边列表框中的,“,MFC AppWizard【exe】,”,一行;在,“,C,位置:,”,处输入存放源代码的目录的名字,单击,“,确定,”,后出现图,10-5,所示对话框。,图,10-4,图,10-5,2.,设置对话框模板,设置对话框模板一般需要以下几步:设置对话框的属性;向对话框模板放置控件;通过控件属性对话框设置各个控件的属性和控件的跳表顺序。,1),设置对话框的属性,首先调整模板的大小:把鼠标放在对话框模板的边或角上,等鼠标变为双箭头形状,拖动鼠标即可。,点击对话框模板,(,而不是它上面某一控件,),,按,【Enter】,键弹出属性设置对话框,图,10-6,所示为该对话框的,General,页。可以设置对话框的风格和各边界滚动条的类型,对话框的标题等。,图,10-6,2),添加控件并设置控件属性,添加控件要借助于控件工具条,(,图,10-7,所示,),,控件工具条提供了,25,种控件。常用的控件是:图形控件,(Picture),、静态文本框,(Static Text),、编辑框,(Edit Box),、组框,(Gorup Box),、按钮,(Botton),、复选框,(Check Box),和单选框,(Radio Button),。图形控件用于显示位图,(Bitmap),和图标,(Icon),;静态文本框用于显示静态文本,(,当然显示的内容可以通过程序改变,),;编辑框用于数据的输入和显示;组框用于把若干控件从视觉上组合成一组,形成友好的界面;按钮用于用户向程序提供命令;复选框完成开关功能;单选框也提供选择,它与复选框的区别是在一组单选框中,用户只能选择其中一个,并且单选框自已不能取消自已的选择,而只能通过选中别的单选框来取消。,图,10-7,向对话框增加一个控件的方法是在控件工具条上通过单击选择一个控件,然后在对话框模板上按下鼠标左键,控件就会按默认大小放置在对话框上。通过单击选中控件,把鼠标光标移动到控件边缘,等光标呈箭头状时拖动鼠标可以改变控件的大小。删除一个控件的方法是先选中控件后按,【Delete】,键。,设置控件的属性:先选中控件,按,【Enter】,键,(,或者按鼠标右键,在弹出的菜单上选择,Properties,项,),弹出图,10-8,所示的属性对话窗口,在该窗口中可以设置控件的标识符,(ID),,标题,(Caption),和各种风格,(Style),等。,图,10-8,在图,10-9,中,将对话框模板上的,“,TODO:,在这是设置对话控制,”,静态文本框和,“,确定,”,按钮删除。为对话框增加,3,个编辑框,它们的,ID,分别为,ID_EDIT_ADD1,,,ID_EDIT_ADD2,和,ID_EDIT_ADD3,;添加两个静态文本框,它们的,Caption,分别为,“,+,”,和,“,=,”,。另外,,“,+,”,和,“,=,”,的属性页对话框的,Styles,属性页要作两点改变:将,“,X,对齐文本,”,属性设为,Center,,选择,“,C,中垂直,”,复选框,如图,10-10,所示。,图,10-9,图,10-10,再添加两个命令按钮,它们的,Caption,分别为,“,计算结果,”,和,“,退出,”,,,“,计算结果,”,的,ID,是,IDC_BUTTON1,“,退出,”,的,ID,是,IDC_BUTTON2,。,3),定义成员变量,增加了,3,个编辑框后,获取三个编辑框中的输入数字的常用方法是:先定义一些与控件相联系的变量,然后在程序中通过这些变量来完成对控件的控制。,为控件定义变量最方便的方法是通过,ClassWizard,。按,【Ctrl+W】,键,弹出图,10-11,所示的,MFC ClassWizard,对话框,选择,Member Variables,窗口如图,10-12,所示。,图,10-11,图,10-12,选中,“,IDC_EDIT1,”,,双击鼠标或单击,Add Variable.,按钮,弹出图,10-13,所示的对话框,这个对话框用来增加与控件相联系的成员变量。先为变量取名为,m_add1,,填在,Member variable name,中。这个变量用来存放用户在,IDC_EDIT1,编辑框中输入的数,供程序计算结果用;再选择变量的类别填在,Category,中,可以为,Value,或,Control,,后者表示所定义的变量是控件类的一个对象,比如对于编辑框而言,,Control,类变量的类型是,Cedit,,前者表示所定义的变量是与控件相联系的一个值,,这个值的含义随不同类型的控件而不同,如对于编辑框而言,变量表示在编辑框所输入的内容。有的控件不能定义与之相关的,Value,变量,如按扭;最后选择变量的类型填在,Variable type,中,变量,m_add1,的类型定义为,double,类型。,用同样的方法可以为其它控件增加变量,最终增加的所有变量如下:,IDC_EDIT1,double,a_add1,IDC_EDIT2,double,a_add2,IDC_EDIT3,double,a_add3,图,10-13,4),增加事件处理函数,在程序中希望点击图,10-3,中的命令按钮,“,计算结果,”,时,会将输入的两个数的和填入第,3,个编辑框。要想实现以上操作,必须为,“,计算结果,”,这个命令按钮填加鼠标左键单击命令按扭的处理函数。这样当鼠标左键单击这个事件发生时,就会执行这个处理函数。,增加事件处理函数有两种方法:,(1),通过专门的事件处理对话框,(2),可以在,10-11,窗口中所示的,ClassWizard,的,Message Maps,标签页为控件添加事件处理函数。,下面介绍第,1,种方法:选中图,10-3,中,“,计算结果,”,按钮,单击鼠标右键,在弹出菜单中选择,Events,,弹出的对话框如图,10-14,所示。,图,10-14,此窗口用于添加、删除窗口的消息和事件处理函数。本程序需为按钮增加单击事件处理函数:双击左边列表框中的,“,BN_CLICKED,”,(,这时会弹出一个对话框让用户修改事件处理函数的名字,若保持默认的名字,直接单击,“,确定,”,即可,),。添加完单击事件处理函数后的对话框如图,10-15,所示,注意到增加了处理函数的事件名移动到了右边的列表框中,在图,10-15,中单击,Edit Existing,按钮可以直接进入对话框的源文件,(.CPP),,并为事件响应函数增加代码。,图,10-15,因为添加的函数全都是空的,所以需要手工添加代码来实现用户想要的功能。在下面的程序中有一个函数,UpdateData(),出现了两次,其格式为:,BOOL UpdateData(BOOL bSaveAndValidate=TRUE);,UpdateData,函数是,MFC,中的,CWnd,类的成员函数,,CWnd,类是很重要的,MFC,类,所有窗口类都直接或间接地继承于它。本程序主对话窗口类,ClitleAdd
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服