VC++6.0-MFC编程实例

上传人:少*** 文档编号:242964029 上传时间:2024-09-12 格式:PPT 页数:138 大小:692KB
返回 下载 相关 举报
VC++6.0-MFC编程实例_第1页
第1页 / 共138页
VC++6.0-MFC编程实例_第2页
第2页 / 共138页
VC++6.0-MFC编程实例_第3页
第3页 / 共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_nBubbleCount,MAX_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(&brushNew,);,dc.SelectObject(&penNew,);,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&stringSrc,); /,用另外一个,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,0xFF);,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(&pen,);,可以看出,将绘图对象选入绘图设备环境的方法是调用,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(&penRed,);,/,以下是作图代码,且使用新画笔画线,dc.SelectObject(pOldPen,); /,恢复原来的画笔,2),画刷,画刷是用来填充图形的工具,创建画刷有两种方法:一种是调用构造函数,另一种是调用相关的成员函数。,使用画刷叶要定义画刷对象,创建画刷并保存原来的画刷,在绘图工作结束后还要恢复原来的画刷。例如:,Cbrush,NewBrush,;/,声明画刷对象,Cbrush,*,POldBrush,;/,保存原画刷的指针,NewBrush.CreateSolidBrush(PS_SOLID,21,RGB(0,0,255);/,建立画刷,Pold_Brush,=,pDC,-,SelectObject(&NewBrush,);/,将画刷选入设备文本对象,/,使用画刷,/,恢复原先的画刷对象,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,类,所有窗口类都直接或间接地继承于它。本程序主对话窗口类,ClitleAdderDlg,继承了,Cdialog,而,Cdialog,又继承了,CWnd,,,因此可以在程序中使用函数,UpdateData,。,用户在程序运行过程中通过鼠标或键盘修改了对话框控件的状态后,对话框中与控件相关联的变量值并没有马上更新。以参数,TRUE,调用函数,UpdateData,(),的作用就是更新所有与对话框图控件相关联的变量值,而以参数,FALSE,调用此函数则更新与变量相关联的控件的显示状态,使之与变量一致。也可以通俗地说,以,TRUE,和,FALSE,作为参数可分别实现控件关联变量的“里传”和“外传”。下面的语句起刷新编辑框的作用。,void CSf1Dlg:BUTTON1(),/ TODO: Add extra validation here(,在这里增加用户代码,),UpdateData(true,);,m_add3=m_add1+m_add2;,UpdateData(false,);,各关联变量的初值在函数,CSf1Dlg:CSf1Dlg(,它是程序主对话框类的构造函数,),中初始化,它是由程序自动生成的。如果想修改某些变量的初值,可以在源程序中找到该函数,修改某些变量的初始值。即,CSf1Dlg:CSf1Dlg(CWnd*,pParent,/*=NULL*/),: CDialog(CSf1Dlg:IDD,pParent,),/AFX_DATA_INIT(CSf1Dlg),m_add1 = 0.0f;,m_add2 = 0.0f;,m_add3 = 0.0f;,/AFX_DATA_INIT,/ Note that,LoadIcon,does not require a subsequent,DestroyIcon,in Win32,m_hIcon,=,AfxGetApp,()-,LoadIcon(IDR_MAINFRAME,);,到此本程序编制完成,可以按,【Ctrl+F5】,键看它的运行结果。本程序并不是很完善,但作者仅仅是想通过这个例子告诉读者简单的对话窗口是如何编制的。如果读者感兴趣,你可以试着增加一些控件或功能使它更加完善。,10.4,菜 单 的 应 用,菜单是一个专业程序不可缺少的程序界面构件,对于不同的程序,这些构件会以不同的面貌出现。菜单是,Windows,使用者天天都要见到的应用元素。,菜单由上层水平列表项及与其相连的弹出式菜单项组成,用户选择了上层某个列表项时,与之相连的弹出式菜单就会随即出现。菜单的各个菜单项用来响应用户的鼠标单击而产生命令消息,从而提供一种用户对程序进行控制的方式。由于弹出式菜单平时是隐藏的,只露出上层水平列表项,因此菜单能容纳大量的操作。,菜单也是一种资源,因此要通过,Developer Studio,的资源编辑器编辑。“弹出式菜单”、“选项”和“分隔线”是构成“树状菜单”的三大要素。通过“弹出式菜单”可以调出一个子菜单,分隔线用来区分一组选项。通过菜单中的“选项”可以调用应用程序的某项功能。每个选项均有一个标识符,而且只有选项才有标识符。,在应用程序中只对选项编程。当用户选择了一个菜单选项后,就会向应用程序发送一个命令消息,WM_COMMAND,。,该消息的格式为,ON_COMMAND(id,memberFxn,),1.,编辑菜单,选择“插入”“资源”菜单项或按,【Ctrl+R】,键,在弹出的添加资源对话框中选择“菜单”,然后按,【Enter】,键,即可向项目添加一个菜单资源。这时,菜单资源编辑器打开,菜单编辑器的窗口如图,10-16,所示。其中,灰色的横条是菜单,周围有一个白框的灰色块是要添加的菜单项。下面分几步编辑菜单:,图,10-16,图,10-17,1),添加菜单上层水平列表项,单击选中要添加的菜单项小灰块,按,【Enter】,键弹出其属性对话框,(,如图,10-7,所示,),,上层水平列表项是具有弹出属性的菜单项,它没有,ID,,,它的“,C,标题”是菜单上显示的字符串,也叫菜单的名字。在图中的“,C,标题”处输入了字符串“文件,(&F),,,当程序运行时界面上将显示“文件,(F)(,字符,&,并不显示出来,),,实际上,字符,&,的作用是使紧跟在它后面的字符下面加下划线。这样按,【Alt+V】,键可激活此菜单项,这是利用键盘选择菜单项的一种方法。,2),添加各上层水平列表项的子菜单项,单击已经添加的某一个水平列表菜单项,其下面会出现一个空的菜单项,选中这个空的菜单项,按,【Enter】,键弹出要新加子菜单的属性对话框,在对话框中输入菜单项的,ID,和,Caption,,,然后设置菜单的其它属性。有时希望把功能相近的菜单项放在一起成为一组,通过一个横的分割线把它与其它菜单项分割开。产生一条分割线的方法是在菜单项的属性对话框中选择“分隔符”复选框。,图,10-18,2.,为菜单单击增加消息响应函数,1),方法一,设置好菜单的各个菜单项后,就可用,ClassWizard,为菜单增加消息响应函数了。,(,通过按,【Ctrl+W】,键,),弹出,ClassWizard,对话框后,选择,ClassWizard,的,Message Maps,页,(,如图,10-19,所示,),图,10-19,在图,10-19,中的,Project,和,Class name,组合框中分别选择要为哪个项目的哪个类增加消息响应函数,所以,Project,中选择“,Menutest,和,Class name,组合框中选择“,CmenuTestView,。在,Object Ids,列表框中选中一个菜单,ID(,比如,ID_TEST_COMMAND),可以为这个,ID,的菜单增加单击响应函数,方法是:选中右边,Message,列表框中的,COMMAND,行,单击,Add Function.(,或双击,COMMAND,行,),,在弹出的对话框中单击,OK,按钮。用同样的操作为所有菜单项增加单击响应函数。最后单击,ClassWizard,对话框的“确定”按钮来确认添加,(,或者单击,edit Code,按钮直接跳到源文件为函数增加实现代码,),。,例,10.2,在单文档界面的应用程序中,添加一个“画图”菜单项包括“画矩形”和“画圆形”,并添加不同的颜色。,第一步:创建一个基于单文档界面的应用程序,将工程命名为,MenuTest,(,参照,1.3.2,节的步骤,),第二步:在“工程管理区”中点击“,Resource View”,,在,Menu,文件夹中选择“,IDR_,MAINFRAME”,,,双击菜单中添加一个菜单,如图,10-20,所示。,菜单项“画矩形”的,ID,标识为“,ID_RECT_COMMAND”,。,菜单项“画圆形”的,ID,标识为“,ID_CIRCLE_COMMAND”,。,第三步:为“画图”菜单项添加消息响应函数。按,【Ctrl+w】,键弹出如图,10-21,的窗口,选择“,Pojec,为工程名“,MenuTest,”,,,选择“,Class name,为“,CmenuTestView,”,,,选择“,Object Ids:”,为画矩形的标识“,ID_RECT_COMMAND”,,,选中右边,Message,列表框中的,COMMAND,行,单击,Add Function.(,或双击,COMMAND,行,),,在弹出的对话框中单击,OK,按钮。用同样的操作为“画圆形”菜单项增加单击响应函数。最后单击,ClassWizard,对话框的“确定”按钮来确认添加,(,或者单击,Edit Code,按钮直接跳到源文件为函数增加实现代码,),。,图,10-20,图,10-21,两个菜单项的响应函数为:,void,CMenuTestView:OnRectCommand,(),/ TODO: Add your command handler code here(,在这里加入命令处理代码,),CClientDC,dc(this);,CBrush,brushNew,;,CPen,penNew,;,brushNew.CreateSolidBrush(RGB(255,0,0);,penNew.CreatePen(PS_SOLID,1,RGB(255,0,0);,dc.SelectObject(&brushNew,);,dc.SelectObject(&penNew,);,dc.Rectangle(20,20,200,180);,void,CMenuTestView:OnCircleCommand,(),/ TODO: Add
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!