Visual-C++编程实例.ppt
《Visual-C++编程实例.ppt》由会员分享,可在线阅读,更多相关《Visual-C++编程实例.ppt(138页珍藏版)》请在咨信网上搜索。
1、第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的 一 个 实 例(
2、调 用CwinApp的构造函数),初始化全局对象;(2)Win32入口程序函数WinMain调用函数AfxWinMain;(3)AfxWinMain调用函数CwinApp的成员函数InitInstance;(4)AfxWinMain调用函数CwinApp的成员函数Run;(5)AfxWinMain函 数 返 回 到WinMain,WimMain结束,程序结束。例10-1 吹泡泡程序。每当用户在窗口客户区中按下鼠标左键时即可产生一个泡泡(彩色圆形)。设计思路:显示一个泡泡所需的数据包括其位置和大小,在MFC中可用其包含矩形表示。可设置一数组,每当用户按下鼠标左键时,就产生一个泡泡的数据并存入数组
3、中。最后,由框架窗口类的OnPaint()函数显示所有的泡泡。#include#define MAX_BUBBLE 250class 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_M
4、AP(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,FA
5、LSE);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_pM
6、ainWnd=pFrame;return TRUE;CMyApp ThisApp;/全局应用程序对象 按【Ctrl+F5】运行程序,运行结果如图10-2所示。说明:该程序声明了两个类,一个是由应 用 程 序 类 CwinApp派 生 出 来 的CmyApp类,一 个 是 由 框 架 窗 口CframeWnd类派生出来的CmyWnd类。MFC的基本类名均以字母C打头,习惯上在为使用MFC编写的应用程序中的类起名时也这样做。在程序中还声明了一个CmyWnd类的全局对象ThisApp。图 10-2 在CmyWnd类中声明了一个数组成员m_rectBubble,用于存放泡泡的数据;另外,还声明了一个整
7、型数据成员m_nBubbleCount,用来存放数组中泡泡的实际数量。在框架窗口类的构造函数中该成员变量被初始化为0,由于构造函数非常简单,因此使用了内联函数的形式。OnPaint()函数用于绘制客户区的内容。要完成这项任各,需要先建立一个设备环境(Device Context),这可以通过声明一个CpaintDC类的对象dc实现。在声明语句中,应将当前窗口对象指针this 传给CpaintDC类的构造函数,把绘图区域确定为当前窗口的客户区。Windows在窗口更新、移动、改变尺寸或移去覆盖在其上的其它窗口对象时均会向该窗口发送WM_PAINT消息,从而触发应用程序调用OnPaint()函数重
8、绘窗口客户区。OnPaint()函 数 根 据 数 组m_rectBubble的内容画出一个泡泡。其中语句。dc.SelectStockObject(LTGRAY_BRUSH);用于选择一个库存画刷,画刷决定了所画图形(如椭圆、矩形和多边形等)内部的颜色。在处理鼠标消息的ONLButtonDown()函数中,语句 int r=rand()%50+10;随机确定了要画出的泡泡的半径(范围为1050像素点),其中全局函数rand()可产生一个随机整数。调试:首先,使用Visual C+集成开发环境中的菜单选项“文件/新建”,并在项目选项卡中选择“Win32 Application。其次,在编译时要
9、确定应用程序的可执行程序如何使用MFC的类库。一种方法是使用共享的动态链接库(DLL)。这种链接方式显著地减小了应用程序的可执行文件的大小,并能有效地利用系统资源。用系统资源。然而,动态链接到MFC时要求提供Mfcnn.dll库文件,文件名中的nn代表MFC的版本号。该文件通常在Windows System或System32文件夹下。如果一个应用程序动态链接到了MFC,但该应用程序通常用在那些可能没有Mfcnn.dll库的计算机系统上,则应把这个库文件作为应用程序包的一部分提供给用户。Microsoft允许程序员自由地把这些库文件附在应用程序中。另外,也可以选择应用程序静态链接到MFC。静态链
10、接意味着,应用程序不依赖于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)”。
11、10.2 常用FC类和消息处理 10.2.1 常用MFC类 MFC的类构成了一个完整的体系,该体系由一个被称为Cobject的类作为基类,其它类大部分由该类派生而来,如CWnd(窗口类)、Cdocument(文档类)、Cfile(文件类)等。也有一部分类如字符串类,Cstring和时间类Ctime等则不从Cobject继承。1.窗口公共基类CWnd 类CWnd对所有Windows窗口提供功能支持,它是所有窗口类的直接或间接父类。一个CWnd对象和一个Windows窗口是有本质区别的,尽管它们有密切的联系。CWnd对象是一个概念,即类的实例,而Windows窗口则是指向Windows内部数据结构
12、的一个句柄,它的创建和显示要消耗系统资源。一个CWnd对象通过其构造函数被创建,被析构函数销毁,而一个Windows窗口则通过 CWnd的 Create函 数 创 建,被DestroyWindow函数销毁。1)窗口句柄 (1)窗 口 句 柄 的 创 建:当CWnd:Create被调用时,Windows窗口被创建,窗口句柄存放在CWnd的成员变量m_hWnd中。(2)程序中窗口句柄的取得:可以直接利用成员变量m_hWnd,但安全的方法是调用函数CWnd:Get(),它返回与窗口对象相关联的句柄,并且当窗口对象没有关联句柄时或当前CWnd指针为NULL时返回空指针。(3)窗 口 句 柄 的 销 毁
13、:调 用CWnd:DestroyWindow。2)窗口的大小和位置 (1)IsIconic:窗口是否处在最小化状态。(2)IsZoomed:判断窗口是否在最大化状态。(3)MoveWindow:改变窗口的大小、位置和Z轴顺序。Z轴顺序指本窗口和其他窗口的覆盖关系。3)窗口的状态 (1)ShowWindow:显示或隐藏一个窗口,显示可以有多种方式:最大化、最小化、正常显示等。(2)IsWindowEnabled:判断一个窗口是否可见。(3)IsWindowEnabled:判断窗口的禁止/使能状态,禁止状态的窗口不能响应用户的键盘和鼠标的输入。(4)EnableWindow:设置窗口的禁止/使能状
14、态,参数为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(通过ClassW
15、izard添加)中加入处理代码来响应定时器消息。结束定时器的方法是调用以定时器标识为参数的函数KillTimer,比如:KillTimer(1);2字符串类CString Cstring类是MFC对字符串的封装,它包含一个可变长的字符序列,提供了很多串操作,使用它比使用其它字符串类型更加方便。可以说,几乎每个MFC程序都要用到这个类。CString没有继承任何类,且其各个字符都是TCHAR类型。CString对象可以随着串合并操作动态增加其长度,而无须用户来对其长度进行专门设置。CString可以看作一个串类型,而不是一个指向字符串的指针。1)CString的构造函数 CString类拥有众多
16、的构造函数,用于以不同的数据类型和不同的方式构造一个字符串对象,它们是(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);/从一个无符号字符指针构造对象 例如:CStrin
17、g 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 LP
18、CTSTR。例如,获取字符串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)CStri
19、ng 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,它根据一个参数字符串(格
20、式控制字符串)和几个变量来格式化一个串。该函数的格式如下: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
21、,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。3CPoint、Crect和Csize类 1)Cpoint类 MFC中的Cpoint类是对Windows结构POINT的封装,凡是能用POINT结构的地方都可以用Cpoint代替。Cpoint提供了一些成员函数,使得操作POINT结构和Cpoint类更加方便。结构POINT表示一个屏幕上的二
22、维点,它的定义如下:typedef struct tagPOINTLONG 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
23、;LONG top;LONG right;LONG bottom;RECT;其中,left和top分别表示矩形左上角顶点的横、纵坐标;right和bottom分别表示矩形右下角顶点的横、纵坐标。4CPaintDC类 在CpaintDC类中封装了大量的绘图和文字输出方法(成员函数)(1)文字信息显示。文字信息显示的成员函数为:BOOL TextOut(int x,int y,LPCTSTR lpszString);该函数用于在指定坐标(x,y)处显示字符串lpszString的内容,显示成功返回非0值,否则返回0。坐标原点(0,0)在客户区左上角,Y轴向下。(2)画点。画点的成员函数为COLOR
24、REF 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
25、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,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Visual C+ 编程 实例
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【可****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【可****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。