面向对象编程技术.ppt
《面向对象编程技术.ppt》由会员分享,可在线阅读,更多相关《面向对象编程技术.ppt(163页珍藏版)》请在三一办公上搜索。
1、考试时间安排,考试初步拟安排在12月16日即第16周周五1、2节,1,2,第一章 Visual C+集成开发环境简介,3,项目的创建与编译、链接过程,4,Visual C+IDE功能组成,编辑:AutoComplete、IntelliSense编译:预编译头文件(stdafx.h),可以加快编译速度链接:增量式链接、ProjectSettingsLinkLink Incrementally调试:Edit&Continue,5,Visual C+功能组成,AppWizard:应用程序导航(框架)。ClassWizard:类导航,6,Visual C+功能组成:ResourceEditor,Wys
2、iwygDialogMenuToolBarIconBitmapAcceleratorString tableVersionInfo,7,Visual C+功能组成,SourceBrowser:可以方便的观察各种信息。Online Help(MSDN需要安装)调试工具Trace、WinDiff、Spy+、ActiveX测试容器,8,开发Windows应用程序的几种选择,使用win32 API的C语言程序,也称为SDK编程;使用win32 API编写自己的类库,实质上也是一种SDK编程;使用MFC应用程序框架,MFC是微软提供的一种类库,也是基于SDK编写;使用其他的应用程序框架(OWL),9,第
3、二章 SDK风格的Windows程序设计,Windows编程主要需要了解如下要点:(1)消息机制(2)Windows图形设备接口(3)基于资源的编程(4)基于动态链接库(5)Win32应用程序编程接口,10,Dos下 的消息处理,DOS操作系统,main(),调用库函数或调用自定义函数,程序需要获得用户击键或使用操作系统功能时,调用适当的函数即可。,11,Windows操作系统,调用WinMain()函数其主要功能是:注册窗口类创建主窗口显示主窗口进入消息循环,windows下的消息处理,调用WndProc()消息函数其主要功能是:处理各种消息,消息到来,处理完成,程序启动,空闲,12,一个不
4、用MFC框架的Windows程序,必须有一个WinMain()函数,格式如下:int WINAPI WinMain(HINSTANCE CurInstance,HINSTANCE PreInstance,LPSTR CmdLine,int ShowStyle)必须有一个消息处理函数,格式如下:Long FAR PASCAL WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam),13,WinMain的流程,Windows操作系统启动程序,执行进入WinMain()函数注册窗口类(通常一次)创建主窗口显示主窗口进入消息循环遇到WM_CLOS
5、E消息退出,14,WinMain的四个参数,CurInstance:当前实例的句柄PreInstance:同一程序的前一个实例(一次运行)CmdLine:命令行参数,是一个以0结尾的ANSI字符串,不含应用程序名ShowStyle:显示窗口的方式,有如下几种:SW_SHOWNORMAL,SW_SHOWMINIMIZED,SW_SHOWMAXIMIZED,15,WndProc中不可缺少的default分支,通过调用DefWindowProc,来处理所有未被处理的消息,调用形式如下:return DefWindowProc(hWnd,msgID,wParam,lParam);,16,显示一个字符串
6、,绘制设备上下文BeginPaint()EndPaint(),17,添加资源,菜单对话框,18,SDK程序向MFC程序转变,第一步:WinMain改造为CWinApp第二步:窗口函数改造为消息映射,19,Win32 API应用程序的修改,InitApplicationInitInstance消息映射结构体,20,为什么使用MFC,是微软提供的Windows编程接口使应用程序的结构标准化使应用程序小而且快(DLL)Visual C+降低编码复杂程度MFC库具有丰富的特性,21,第三章 用AppWizard创建的第一个MFC程序,目的:如何编制一个具有一定功能的MFC类库应用程序(引入简单的视图/
7、文档概念)什么是视图用户角度:与其他Windows窗口一样的窗口程序员:从MFC的Cview类派生的类的一个对象单文档界面和多文档界面单文档:一次只能打开一个文档(NotePad)多文档:一次能打开多个文档(Word),22,应用程序的主要元素WinMain函数CMyApp类-theAppCMyApp:InitInstance();CMyApp:Run();/CMyApp:OnIdle()CMyFrame类CMyFrame:OnLButtonDown、CMyFrame:OnPaint()、CMyFrame:OnDraw()关闭主画面窗口后关闭应用程序。,23,MFC库消息映射,MFC库对Win
8、dows消息映射不采用虚拟函数,而通过宏把特定的消息映射到派生类成员函数。主要是为避免大量的vtable开支。菜单命令消息和按扭消息的处理与Windows消息一样。一个MFC消息处理程序需要一个函数原型、一个函数体和一个在消息映射中的项。,24,MFC库消息映射,afx_msg void OnLButtonDown(UINT nFlags,Cpoint point)CMyFrame:OnLButtonDown(UINT nFlags,CPoint point)BEGIN_MESSAGE_MAP(CMyFrame,CFrameWnd)ON_WM_LBUTTONDOWN()END_MESSAGE_
9、MAP(),25,文档和视图,文档-代表数据模型,基类是CDocument视图-代表用户接口,基类是Cview,26,第一个MFC程序,什么是视图用户角度:与其他Windows窗口一样的窗口程序员:从MFC的Cview类派生类的一个对象单文档界面和多文档界面单文档:一次只能打开一个文档(NotePad)多文档:一次能打开多个文档(Word)在窗口中绘图通过响应OnDraw()函数来完成绘图设备上下文图形设备对象,27,资源编辑器ex03a.rc包含afxres.h(只读符号)afxres.rc(通用组件)resource.h(自定义符号)Debug与Release目标启用诊断宏(C:WINNT
10、afx.ini TraceEnabled=1)Tools/MFC Tracer/enable tracing予编译头文件(stdafx.cpp stdafx.h),28,在视图窗口中绘图,通过修改OnDraw()函数来完成绘图是CView类的虚拟成员函数,每次视图重画时调用(WM_PAINTOnPaintOnDraw)如果程序的数据被改变,则可以调用视图的Invalidate()成员函数,并最终调用OnDraw()InvalidateWM_PAINTOnDraw()对视图窗口的重画不要过于频繁画图过程中涉及的MFC类设备上下文其他图形设备对象,29,设备上下文,Windows系统不允许直接操作
11、显示硬件,而是通过一个抽象层设备上下文来进行通讯MFC编程中,设备上下文是CDC及其派生类的对象添入代码:,30,资源,资源编辑器ex03a.rc包含加速器、对话框、图标、菜单、字符串、工具条、版本信息afxres.h(只读符号),通用的MFC库资源afxres.rc(通用组件),通用的MFC库资源resource.h(自定义符号),31,Debug与Release目标,分两个版本:发行版和调试版区别:源码调试、诊断宏、链接库、编译优化等方面不同启用诊断宏(C:WINNTafx.ini TraceEnabled=1)Tools/MFC Tracer/enable tracing予编译头文件(s
12、tdafx.cpp stdafx.h)/Yc(stdafx.cpp)、/Yu(复用)、/Fp(pch文件路径)编译开关,32,第四章 基本事件处理、映射模式,MFC类库中有很多On-函数由框架调用,完成对事件的响应。他们不是虚拟函数,必须通过消息映射结构,使应用框架和我们的代码关联消息映射当用户在视图中按下鼠标,Windows发送WM_LBUTTONDOWN消息给视图窗口,视图窗口必须有一个OnLButtonDown(UINT nFlags,CPoint point)成员函数来响应该消息,头文件中加入消息处理函数原型afx_msg void OnLButtonDown(UINT nFlags,
13、CPoint point),通过消息映射宏将框架和函数关联,将消息和消息的响应函数连接的过程称为消息映射。,33,消息映射的步骤:,定义函数:void CMyView:OnLButtonDown(UINT nFlags,CPoint point)函数原型:afx_msg void OnLButtonDown(UINT nFlags,CPoint point)消息映射宏BEGIN_MESSAGE_MAP()ON_WM_LBUTTONDOWNEND_MESSAGE_MAP()头文件中添加:DECLARE_MESSAGE_MAP(),34,保存视图的状态,通过一些状态的变化反映事件,在引入文档类之前
14、,存放在视图的数据成员中CRect m_rectEllipse;UINT m_nColor数据成员初始化:放在视图的构造函数中CEx04aView:CEx04aView():m_rectEllipse(0,0,200,200),m_nColor(GRAY_BRUSH),35,如何反映事件,鼠标点击不会引起重画,需要调用:CWnd:InvalidateRect(LPRECT rect);视图的客户区:CRect,CSize,Cpoint及其相互运算如何判断点在矩形内部CRect rect;if(rect.PtInRect(point).如何判断点在区域内部CRgn rgn;rgn.CreateE
15、llipticRgnIndirect(m_rectEllipse);if(rgn.PtInRegion(point).实例,36,映射方式,为使显示与显示分辨率无关,应使用不同于以像素为单位的坐标系统设备坐标-以像素表示的坐标值。逻辑坐标-当前映射方式下的坐标值。映射方式-逻辑坐标和设备坐标之间的比例关系。Windows映射方式,映射方式逻辑单位 MM_LOENGLISH 0.01 inch MM_HIENGLISH 0.001 inch MM_LOMETRIC 0.1 mm MM_HIMETRIC 0.01 mm MM_TWIPS 1/1440 inch MM_TEXT1pixel,37,M
16、M_TEXT映射方式,逻辑坐标和设备坐标1:1坐标X向右增加,坐标Y向下增加通过调用CDC的SetWindowOrg,SetViewportOrg改变原点CMyView:OnDraw(CDC*pDC)pDC-SetMapMode(MM_TEXT);pDC-SetWindowOrg(CPoint(100,100);/将逻辑坐标(100,100)设置为窗口原点,38,自定义映射方式一:固定缩放的映射方式,向右X增加,向下Y减少,39,自定义映射方式二:缩放可变的映射方式,可以改变缩放因子和原点MM_ISOTROPIC和MM_ANISOTROPICMM_ISOTROPIC纵横比始终是1;1MM_AN
17、ISOTROPIC可以分别改变X和Y缩放因子,40,坐标转换,一些重要的规则:CDC的成员函数使用逻辑坐标CWnd的成员函数使用设备坐标在设备坐标系中进行击键测试如(CRect:PtInRect)用逻辑坐标存储长期的值。CDC的函数LPtoDP和DPtoLP负责两个系统之间的转换。在CView:OnPrepareDC()中完成映射方式设定。编程示例,41,滚动窗口,当窗口比屏幕大时,可能需要滚动视口。通过从CScrollView中派生视图类可以实现。在OnInitialUpdate()中定义逻辑大小和映射方式。见举例,42,第五章 图形设备接口,所有与绘制有关的操作都要用到GDI元素设备上下文
18、是最重要的GDI元素,代表某个具体的物理设备,43,设备上下文类,基类是CDC,每个设备上下文对象有一个Windows设备上下文,由32位HDC句柄标识CDC类的虚拟性是应用框架的一个重要特性。显示上下文类:CClientDC、CWindowDC等,44,设备上下文对象-构造和销毁,构造设备上下文对象后,应及时销毁,Windows限制可获取设备上下文的数量。构造的两种方法,45,设备上下文的状态,使用CDC对象绘图时,屏幕上的内容依赖于设备上下文的当前状态:绘图需要的相关对象:笔、刷子、字体映射方式其他方面(文本对齐方式、填充方式等),46,CPaintDC类,重写了OnPaint函数后,需要
19、用到CPaintDC类OnPaint用正确设置的CPaintDC调用OnDraw();,47,图形设备接口对象,CBitmapCBrushCFontCPalatteCPenCRgn,48,如何构造和销毁,一步构造CPen newPen(PS_DASHDOTDOT,2,(COLORREF)0);先定义对象,再创建CFont font;font.CreateFont(30,10,0,0,400,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_MODE
20、RN,Courier New);/TrueType 如何断开其与设备上下文的关系先选出设备上下文,然后析构库存GDI对象自动析构,49,字体,字体是GDI对象字体的选择与设备无关的True Type字体和与设备有关的字体(Windows系统显示字体和LaserJet LinePrinter字体)MFC提供选择准确的打印机字体和大小,然后尽力使显示最好。打印字体以磅来度量显示字体显示字体和打印字体一般不能严格匹配,除非使用MM_TEXT方式。,50,计算字符高度,51,计算字符高度,字体高度=tmHeight-tmInternalHeight(点数)行高=tmHeight+tmExternalL
21、eading对应TEXTMETRIC和GetTextMetrics(,52,举例1,同一种字体,不同大小,53,举例2,大小伸缩字体,54,举例3,格式刷,55,第六章 模态对话框和Windows公用控件,模态和非模态对话框模态:在对话框关闭之前,不能转到其他窗口工作非模态:可以转到其他窗口,但对话框在最顶端,56,对话框与其他窗口类的不同,对话框是基于资源的,资源指定其包含的元素和布局。对话框包含的窗口元素:控件一个从CDialog类派生的MFC类完成和对话框界面的联系,57,模态对话框编程,编程步骤使用对话框编辑器创建对话框资源ClassWizard生成派生对话框类ClassWizard添
22、加数据成员ClassWizard消息映射特殊控件初始化在视图中编写代码,激活对话框对象举例1,58,对话框的运行过程,Cdialog:DoModal(),OnInitDialog,CDialog:OnInitDialog,CWnd:UpdateData(FALSE),DoDatExchange,Cdialog:OnOK,UpdateData(TRUE),59,增强对话框程序,控制OnOK的退出OnCancel 处理挂接滚动条控件改进的ex06a,60,识别控件,CWnd指针和控件IDGetDlgItem返回CWnd指针GetDlgCtrlID返回ID设置对话框背景和控件的颜色(WM_CTLCO
23、LOR-OnCtlColor)在对话框窗口内部画图运行时增加控件,61,Windows公用控件,在Windows95中引入,NT也提供包含在comctl32.dll动态连接库中窗口过程函数及窗口类注册代码包含在该库中DLL加载时注册窗口类对公用控件,ClassWizard不能提供数据成员支持,但提供通知消息的映射应在OnInitDialog和OnOK中分别初始化和读取控件数据,62,几种Windows公用控件,进度指示器控件,对应C+类是CProgressCtrl,可以调用其成员函数SetRange和SetPos进行初始化或更新操作Slider(跟踪栏控件),对应的C+类是CSliderCtr
24、l,不需要映射WM_HSCROLL和WM_VSCROLL即可滚动。,63,几种Windows公用控件,Spin(微调控件),对应的C+类是CSpinButtonCtrl,经常和一个编辑控件一起使用,称“伙伴”,编辑控件的Tab顺序仅在Spin之前。SetRange()和SetAccel()及AutoBuddy和Set Buddy Integer属性,64,几种Windows公用控件,列表控件,对应的C+类是CListCtrl,需要一个图片文件夹,CImageList类的对象树型控件,对应的C+类是 CTreeCtrl,用HTREEITEM而不是整型索引,插入时使用TV_INSERTSTRUCT
25、结构,65,控件通知消息结构,早期的Windows控件利用WM_COMMAND发送通知消息对于Windows公用控件来说,标准的32位wParam和lParam参数是不够的,66,控件通知消息结构,微软提供WM_NOTIFY消息解决这一问题,其结构如下:举例2,67,第七章 非模态对话框,本章介绍非模态对话框和Windows公用对话框非模态对话框:在对话框活动的同时允许在其他地方工作。公用对话框包括:文件、页面设置、颜色选择等,包含在comdlg32.dll中,68,非模态对话框,MFC中类CDialog为基类。创建:(1)调用CDialog的缺省构造函数构造对象(2)调用CDialog:Cr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 编程 技术
链接地址:https://www.31ppt.com/p-5393339.html