ImageVerifierCode 换一换
格式:DOCX , 页数:35 ,大小:213.08KB ,
资源ID:6843683      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6843683.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(MFC 编程基础 2 文档视图.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

MFC 编程基础 2 文档视图.docx

1、MFC 编程基础 2 文档视图第2章 文档/视图结构应用程序1. 文档/视图结构的思想是将数据的管理与显示分离,其中文档用于管理应用程序的数据,而视图是用户界面,用于显示、打印文档中的数据,并管理与用户的交互。2. SDI(单文档界面) 应用程序具有文档/视图结构的程序框架,该框架包括应用程序类、窗口框架类、文档类和视图类,编程的任务是在文档类和视图类中添加适当的代码。其中文档类中一个重要的成员函数是OnNewDocument(),用户在此添加代码完成对数据的初始化;而视图类中最重要的成员函数是OnDraw(),通过在该函数中添加代码实现窗口内容的输出。3. 通过介绍几种SDI结构的典型应用程

2、序来了解其结构及设计方法,典型应用包括: 利用画笔、画刷等工具及位图处理的方法实现文字和图形的输出。 利用定时器控件制作动画程序。 对鼠标和键盘进行编程的基本方法。 文件、字体、颜色等几种通用对话框的使用方法及自定义对话框的设计、调用方法。 菜单的设计方法。2.1 文档/视图结构SDI 应用程序由 AppWizard(应用向导) 创建好后,即使没有编写一行代码,仍然可以运行,并且具有一个标准 Windows应用程序所需要的组成成份,程序员的工作就是往这个框架添加必要的代码。以下通过一个简单实例说明文档/视图结构应用程序的创建过程。 【例2.1】 创建一个如图所示的应用程序,在窗口中显示一个矩形

3、框,框中显示“同舟共济 自强不息”。视图框架窗口的假定本例的工程名为 TEST ,程序创建过程如下: (1)利用 AppWizard 创建一个 SDI 应用程序框架。 (2)文档类是存放数据的主要地方,本例在其中说明一个存放矩形框数据的 CRect 类对象 r 和一个存放字符串的 CString 对象 s ,方法为: 在工作区的“ ClassView ”中,双击文档类CTESTDoc 类,在该类代码中添加如下代码: public: CRect r; CString s; 说明: CRect 是 MFC 定义的一个类,有 4 个数据成员: left 、 top 、 right 和 bottom

4、。 (left, top) 和( right, bottom )分别表示一个矩形左上角坐标和右下角坐标,单位是像素(点)。窗口中央客户区中坐标系原点(0,0)在左上角,轴正方向朝下。(3)在文档类的成员函数 OnNewDocument() 中完成数据成员的初始化。方法为: 在工作区的 ClassView 中展开 CTESTDoc 类,找到其成员函数 OnNewDocument() ,在其中添加代码: BOOL CTESTDoc:OnNewDocument() if (!Cdocument:OnNewDocument() return FALSE; / TODO: add reinitializ

5、ation code here / (SDI documents will reuse this document) r=CRect(100,60,260,100); s=”同舟共济 自强不息”;return TRUE; 说明:阴影部分为添加的代码。 (4)在工作区的“ Class View ”中展开视图类 CTESTView 类,找到其成员函数 OnDraw() ,添加输出矩形框和文字的代码:void CTESTView:OnDraw(CDC* pDC) CTESTDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw

6、code for native data here pDC-Rectangle(pDoc-r); /用文档中的数据 r画矩形框pDC-TextOut(110,70,pDoc-s); / 输出函数用法 见 2.2 节 说明: GetDocument() 是视图类的一个重要成员函数,其返回值是指向当前文档的指针。视图类中的成员函数通过它访问文档类的公有数据成员。 函数 OnDraw() 是实现输出的关键函数,绝大多数的显示工作都是在这个函数中完成的。其参数 pDC 指向窗口中央的客户区(视图)对应的输出设备,程序使用该输出设备对象的 Rectangle 和 TextOut 函数绘制矩形和输出文字。

7、CDC是设备上下文类,输出设备是CDC类的对象。 ( 5 ) 运行程序,结果如图所示。SDI 应用程序框架 1应用程序类 每个应用程序类必须从 CWinApp 派生出自己的应用程序类,该类封装了包括初始化、运行和结束的整个过程,其名称是 AppWizard 根据工程名称自动命名的,规则如下: (1)如果工程名符合标识符的命名规则,则应用程序类名由字母 C 、工程名和 App 三部分组成。例如,工程名为 TEST ,则应用程序类名为 CTESTApp 。 (2)如果工程名以数字开始,则应用程序类名由字母 Cmy 、工程名和 App 三部分组成。例如,工程名为 1TEST ,则应用程序类名为 CM

8、y1TESTApp 。 (3)忽略工程名的汉字。 文档类和视图类的命名规则与应用程序类类似,区别在于在后面分别添加了 Doc 和 View 。 2窗口框架类 从 CMainWnd 派生,提供了一个 SDI 窗口的所有功能,如显示一个标题、一个菜单栏、一个工具栏等。所有 SDI 应用程序窗口框架类都是 CMainFrame。 3文档类 从 CDocument 类派生出来,是应用程序进行数据定义和初始化的地方 。文档类的数据成员只有被说明成公有成员才能被视图类中的成员函数访问,其重要成员函数是 OnNewDocument() ,是进行数据成员初始化的地方。程序开始时会自动调用该函数。 4视图类 从

9、 CView 中派生出来, 是程序的用户界面,用于显示、打印存储在文档类对象中的数据,并管理与用户的交互。重要成员函数有:(1) GetDocument() 函数 该函数的返回值是指向与当前视图相关联的文档对象的指针,因而通过它可以访问文档类对象中的公有私有成员。其一般使用形式为: CTESTDoc* pDoc = GetDocument(); 说明: 在不同的应用程序中, pDoc 所指向的文档类对象的名称是不一样的。若工程名称为 TEST ,则文档类的名称为 CTESTDoc ,若工程名为 ABC ,则文档类名为 CABCDoc ,则应用 CABCDoc* pDoc 定义。 在 OnDra

10、w函数中,这个语句是自动生成的。在用户自定义的视图类成员函数中,如果需要访问文档类对象的公有数据成员,则应添加这样的语句。 (2) OnDraw() 函数 在视图类中, OnDraw() 是一个很重要的成员函数,用于实现输出。一般来说,窗口中的内容都是 OnDraw() 输出的。 初始的 OnDraw()函数如下: void CTESTView:OnDraw(CDC* pDC) CTESTDoc* pDoc = GetDocument(); / 获得指向文档类对象的指针 ASSERT_VALID(pDoc); / 检查 pDoc 是否有效,若无效结束程序 / TODO: add draw co

11、de for native data here 说明: OnDraw()函数有两种调方法: 自动调用:当窗口发生变化视图需要重新绘制时,应用程序会自动调用该函数。 手工调用:当程序中的数据改变了需要重新显示时,可以通过调用视图类成员函数 Invalidate() 和 InvalidateRect() 函数,引发对 Ondraw() 的调 用。需要注意的是,不是直接调用 Ondraw()函数。原型: void Invalidate( BOOL bErase = TRUE ) / 参数 bErase 默认值 为 TRUEInvalidate(TRUE) / 擦除窗口原有的内容,重新绘制。 Inva

12、lidate(FALSE) / 窗口原有的内容保留,再进行绘制。 InvalidateRect( 矩形 , TRUE) / 擦除矩形区域内原有内容,重新绘制这个区域。 InvalidateRect( 矩形 , FALSE) / 矩形区域内原有内容保留,再绘制这个区域。2.2 文字和图形的输出 窗口中央的客户区是一个输出文字和图形的区域。客户区(视图)对应的输出设备是设备上下文类CDC的对象,在客户区输出信息主要用到CDC类的成员函数。简单的文字和图形输出 文字输出 形式: virtual BOOL TextOut(int x, int y, LPCTSTR lpszString, int nC

13、ount); 说明: 从坐标 (x,y) 开始显示 lpszString 字符串,其中参数 nCount 指定字符串中的字节数。另一种重载形式为 BOOL TextOut( int x, int y, const CString& str );画点 形式: COLORREF SetPixel(int x, int y, COLORREF crColor); COLORREF SetPixel(POINT point, COLORREF crColor); 说明: POINT 是 MFC 定义的结构类型,表示平面上的一个点。它的两个重要元素是 x 和 y ,分别表示一个点的 x 坐标值和 y 坐

14、标值。与 POINT 类似的是 CPoint 类,两个数据成员也是 x 和 y 。 COLORREF 是一个 32 位整数类型,用于表示颜色,其第 0 、 1 、 2 字节分别存放了一种颜色的红、绿、蓝的值。用三种颜色合成一种颜色的函数是 RGB ,例如: COLORREF C1=RGB(0, 0, 0) ;/ 合成黑色 COLORREF C2=RGB(255, 255, 255); / 合成白色 COLORREF C3=RGB(255, 0, 0); / 合成红色 COLORREF C4=RGB(0, 255, 0); / 合成绿色 COLORREF C5=RGB(0, 0,255); /

15、合成蓝色 COLORREF C6=RGB(255, 255, 0); / 合成亮黄色 COLORREF C7=RGB(0,255, 255); / 合成青色 COLORREF C8=RGB(255, 0, 255); / 合成品红色 COLORREF C9=RGB(0, 0,128); / 合成深蓝色 COLORREF C10=RGB(0, 128, 0); / 合成深绿色 COLORREF C11=RGB(128, 128, 128); / 合成深灰色 COLORREF C12=RGB(128, 128, 128); / 合成浅灰色 使用指定颜色 crColor 在坐标 (x,y) 或点 p

16、oint 处画一个点,返回用于画点的颜色。 画线 画线需要调用两个函数:首先调用 MoveTo 函数确定线段的起点,然是调用 LineTo 确定线段的终点。 形式 : CPoint MoveTo(int x,int y); CPoint MoveTo(POINT point); BOOL LineTo(int x, int y); BOOL LineTo(POINT point); 说明: ( x,y)或 point 是线段的起点或 终点坐标。 画矩形 形式: BOOL Rectangle(int x1, int y1, int x2, int y2); BOOL Rectangle(LPCR

17、ECT lpRect); 说明: (x1,y1) 和 (x2,y2) 是所画矩形的左上角和右下角坐标 , lpRect 是指向矩形的指针。 画椭圆 形式: BOOL Ellipse(int x1, int y1, int x2, int y2); BOOL Ellipse(LPCRECT lpRect); 说明: (x1,y1) 和 (x2,y2) 是椭圆外接矩形的左上角和右下角坐标 , lpRect 是指向外接矩形的指针。 获取客户区的大小 使用 Wnd 类的成员函数 GetClientRect 可以将客户区的坐标放入一个 CRect 类的对象中,然后调用成员函数计算到高度和宽度。 形式:

18、void GetClientRect( LPRECT lpRect ) const; 【例2.2】改变窗口时,矩形框和文字总是显示在窗口的中央void CTESTView:OnDraw(CDC* pDC) CTESTDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here CRect a,b; int w=160; int h=40; GetClientRect(&a); b.left=(a.Width()-w)/2; b.top=(a.Height()-h)/2; b.r

19、ight=b.left+w; b.bottom=b.top+h; pDC-Rectangle(b); pDC-TextOut(b.left+10,b.top+10,同舟共济、自强不息!);【例2.3】 编写一个程序,绘制如图所示的 -22 之间的 sin 曲线。(x0,y0)因为需要使用 sin() 函数,所以在 TEST.CPP 的开始添加文件包含命令。 #include math.h 程序代码: void CTESTView:OnDraw(CDC* pDC) CTESTDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add dr

20、aw code for native data here CRect rect; GetClientRect(rect); int x0=rect.Width()/2; int y0=rect.Height()/2; pDC-MoveTo(20,y0); pDC-LineTo(rect.Width()-20,y0); / 画 x轴pDC-MoveTo(x0,20); pDC-LineTo(x0,rect.Height()-20); double step=3.14159/100; for(int i=-200;iSetPixel( int(x0+(i/300.0)*rect.Width()/2

21、), int(y0-sin(step*i)*rect.Height()/4),RGB(255,0,0); / 此处以取整的方式将 坐标值 化 整数,用 四舍五入方式 较 精确/ 注意将 用户坐标 转化为 窗口客户区坐标/ 注意 此处 对 x、y坐标 进行 了 不同 比例的 伸缩 去掉窗口的“无标题”及设置新标题(利用“建立类向导”给CmainFrame 的消息PreCreateWindow添加消息处理函数 )BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs) if( !CFrameWnd:PreCreateWindow(cs) ) return

22、FALSE; / TODO: Modify the Window class or styles here by modifying / the CREATESTRUCT cs cs.style &=FWS_ADDTOTITLE; /去掉无标题 m_strTitle=绘制sin曲线; /设置新标题 return TRUE; 画笔和画刷 自定义画笔 CPen 是 MFC 中的一个类,它封装了一个 Winndows GDI 画笔,并提供了用于操作画笔的若干函数。画笔的创建和使用过程一般为: CPen pen, *oldpen; / 定义画笔 pen 和指向画笔的指针 oldpen pen.Crea

23、tePen(PS_SOLID,3,RGB(255,0,0); / 创建一支红色能画实线 3 号粗细的画笔 oldpen=pDC-SelectObject(&pen); / 选用新的画笔pen ,让oldpen指向旧的画笔pDC-MoveTo(10,10); pDC-LineTo(50,50); pDC-SelectObject(oldpen); / 恢复使用旧的画笔 说明: (1) CreatePen() 是 CPen 的成员函数,用于创建画笔。其使用形式为: BOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor ); 其中:

24、nPenStyle 为所画线的样式,其取值见表; nWidth 线的宽度; crColor 为线的颜色。 (2) SelectObject() 是 CDC 类的成员函数,其作用是将一个新的 GDI 对象选入到设备环境中,新选用的对象取代原来的对象,然后返回指向原对象的指针。函数原型为: CPen* SelectObject( Cpen* pPen ); / 选用新的画笔 Cbrush* SelectObject( Cbrush* pBrush ); / 选用新的画刷 virtual Cfont* SelectObject( Cfont* pFont ); / 选用新的字体 Cbitmap* S

25、electObject( Cbitmap* pBitmap ); / 选用新的位图 自定义画刷 画刷是用来填充图形的工具。 CBrush 是 MFC 中的一个类,它封装了一个 Windows GDI 画刷,并提供了用于操作画刷对象的若干方法。画刷的创建和使用过程一般为: CBrush brush; / 定义画刷对象 brush brush.CreateHatchBrush(HS_CROSS,RGB(0,255,0); / 构造绿色十字线风格的画刷 pDC-SelectObject(&brush); / 选择一个新的画刷 pDC-Ellipse(100,10,200,110); / 用新的画刷画

26、圆 说明: (1) CreateHatchBrush () 是 CBrush 的成员函数,用于创建画刷。其使用形式为: BOOL CreateHatchBrush(int nIndex , COLORREF crColor ); 其中: nIndex 指定了阴影风格,其取值见表; crColor 为画刷的颜色。 (2)创建画刷的另一个函数是 CreateSolidBrush() ,其作用是创建用单一颜色填充的画刷。其函数原形为: BOOL CreateSolidBrush(COLORREF crColor ); 【例2.4】编写一个程序,输出如图所示的图形。 void CTESTView:On

27、Draw(CDC* pDC) CTESTDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here CPen pen,*oldpen; pen.CreatePen(PS_SOLID,3,RGB(255,0,0); oldpen=pDC-SelectObject(&pen); pDC-MoveTo(10,10); pDC-LineTo(100,100); pDC-Ellipse(100,10,200,110); Cbrush brush; brush.CreateHatchBr

28、ush(HS_CROSS,RGB(0,255,0); pDC-SelectObject(&brush); pDC-Ellipse(220,10,320,110); pDC-SelectObject(oldpen); pDC-MoveTo(320,100); pDC-LineTo(410,10); pen.DeleteObject();/释放画笔资源brush.DeleteObject(); 位图处理 CBitmap 是 MFC 中的一个类,它封装了 Winndows GDI 的位图处理,其成员函数主要是装载和操作位图。通过一个实例说明显示位图的一般过程。 【例2.5】编一程序 显示 Windo

29、ws 主目录中的 Soap Bubbles.bmp ,如图所示。 (1)导入位图 导入位图就是把存放在磁盘上的位图文件作为资源导入到应用程序中,方法是: 选择“插入 | 资源”命令,在弹出的“插入资源”对话框中,选定“ Bitmap ”,然后选择“导入”命令导入 Soap Bubbles.bmp 。 (2)装载位图 装载位图就是把应用程序位图资源装载到一个 Cbitmap 对象中。 CBitmap b; b.LoadBitmap(IDB_BITMAP1); /LoadBitmap 将位图资源装载到 CBitmap 对象 (3)读取位图信息 BITMAP bm; / 说明 bm 为 BITMAP 结构类型的变量 b.GetBitmap(&bm); / 把位图的大小等信息读入 bm 中 int w=

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1