面向对象编程技术OOP

上传人:xiao****1972 文档编号:252959312 上传时间:2024-11-26 格式:PPT 页数:163 大小:1.22MB
收藏 版权申诉 举报 下载
面向对象编程技术OOP_第1页
第1页 / 共163页
面向对象编程技术OOP_第2页
第2页 / 共163页
面向对象编程技术OOP_第3页
第3页 / 共163页
资源描述:

《面向对象编程技术OOP》由会员分享,可在线阅读,更多相关《面向对象编程技术OOP(163页珍藏版)》请在装配图网上搜索。

1、单击此处编辑母版标题样式,,,,*,单击此处编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,考试时间安排,考试初步拟安排在,12,月,16,日,,即第,16,周周五,1,、,2,节,,1,2,第一章,Visual C++,集成开发环境简介,,3,项目的,创建,与编译、链接,过程,4,Visual C++ IDE,功能组成,,编辑:,AutoComplete,、,IntelliSense,,编译:,,预编译头文件(,stdafx.h),,可以加快编译速度,,链接:,,增量式链接、,Project\Settings\Link\Link Incrementally,,调试:,Edit &

2、 Continue,5,Visual C++,功能组成,AppWizard,:应用程序导航(框架)。,,ClassWizard,:类导航,6,Visual C++,功能组成:,ResourceEditor,Wysiwyg,,Dialog,,Menu,,ToolBar,,Icon,,Bitmap,,Accelerator,,String table,,VersionInfo,7,Visual C++,功能组成,SourceBrowser,:可以方便的观察各种信息。,,Online Help(MSDN,需要安装,),,调试工具,,Trace,、,WinDiff,、,Spy++,、,ActiveX,

3、测试容器,8,开发,Windows,应用程序的几种选择,使用,win32 API,的,C,语言程序,,也称为,SDK,编程;,,使用,win32 API,编写自己的类库,,实质上也是一种,SDK,编程;,,使用,MFC,应用程序框架,,,MFC,是微软提供的一种类库,也是基于,SDK,编写;,,使用其他的应用程序框架(,OWL),9,第二章,SDK,风格的,Windows,程序设计,Windows,编程,主要需要了解如下要点:,,(,1,),消息,机制,,(,2,),Windows,图形设备接口,,(,3,),基于资源的编程,,(,4,)基于,动态链接库,,(,5,),Win32,应用程序编程

4、接口,,10,Dos,下 的消息处理,DOS,操作系统,main(),调用库函数或,,调用自定义函数,,,程序需要获得用户击键或使用操作系统功能时,调用适当的函数即可。,,,11,Windows,操作系统,调用,WinMain(),函数,,其主要功能是:,,注册窗口类,,创建主窗口,,显示主窗口,,进入消息循环,windows,下的消息处理,,,调用,WndProc(),消息,函数,,其主要功能是:,,处理各种消息,消息到来,,处理完成,程序启动,,空闲,12,一个不用,MFC,框架的,Windows,程序,必须有一个,WinMain(),函数,格式如下:,,int WINAPI WinMai

5、n(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_CLOSE,消息退出,,14,WinMain,的四个参数,CurInstance

6、:,当前实例的句柄,,PreInstance:,同一程序的前一个实例(一次运行),,CmdLine:,命令行参数,是一个以‘\0’结尾的,ANSI,字符串,不含应用程序名,,ShowStyle:,显示窗口的方式,有如下几种:,,SW_SHOWNORMAL,SW_SHOWMINIMIZED,SW_SHOWMAXIMIZED,15,WndProc,中不可缺少的,default,分支,通过调用,DefWindowProc,,来处理所有未被处理的消息,调用形式如下:,,return DefWindowProc(hWnd,msgID,wParam,lParam);,16,显示一个字符串,绘制设备上下文,

7、,BeginPaint(),,EndPaint(),17,添加资源,菜单,,对话框,,18,SDK,程序向,MFC,程序转变,第一步:,WinMain,改造为,CWinApp,,第二步:窗口函数改造为消息映射,19,Win32 API,应用程序的修改,InitApplication,,InitInstance,,消息映射结构体,20,为什么使用,MFC,是微软提供的,Windows,编程接口,,使应用程序的结构标准化,,使应用程序小而且快(,DLL,),,Visual C++,降低编码复杂程度,,MFC,库具有丰富的特性,21,第三章 用,AppWizard,创建的第一个,MFC,程序,目的:

8、如何编制一个具有一定功能的,MFC,类库应用程序(引入简单的视图/文档概念),,什么是视图,,用户角度:与其他,Windows,窗口一样的窗口,,程序员:从,MFC,的,Cview,类派生的类的一个对象,,单文档界面和多文档界面,,单文档:一次只能打开一个文档(,NotePad),,多文档:一次能打开多个文档(,Word),22,应用程序的主要元素,,WinMain,函数,,CMyApp,类----,theApp,,CMyApp::InitInstance();,,CMyApp::Run() ;//CMyApp::OnIdle(),,CMyFrame,类,,CMyFrame::OnLButto

9、nDown,、,CMyFrame::OnPaint(),、,CMyFrame::OnDraw(),,关闭主画面窗口后关闭应用程序。,23,MFC,库消息映射,MFC,库对,Windows,消息映射不采用虚拟函数,而通过宏把特定的消息映射到派生类成员函数。主要是为避免大量的,vtable,开支。,,菜单命令消息和按扭消息的处理与,Windows,消息一样。,,一个,MFC,消息处理程序需要一个函数原型、一个函数体和一个在消息映射中的项。,24,MFC,库消息映射,afx_msg void OnLButtonDown(UINT nFlags,Cpoint point),,CMyFrame::OnL

10、ButtonDown(UINT nFlags,CPoint point),,{…},,BEGIN_MESSAGE_MAP(CMyFrame,CFrameWnd),,ON_WM_LBUTTONDOWN(),,END_MESSAGE_MAP(),25,文档和视图,文档,----,代表数据模型,基类是,CDocument,,视图,----,代表用户接口,基类是,Cview,,26,第一个,MFC,程序,什么是视图,,用户角度:与其他,Windows,窗口一样的窗口,,程序员:从,MFC,的,Cview,类派生类的一个对象,,单文档界面和多文档界面,,单文档:一次只能打开一个文档(,NotePad),

11、,多文档:一次能打开多个文档(,Word),,在窗口中绘图,,通过响应,OnDraw(),函数来完成绘图,,设备上下文,,图形设备对象,27,,资源编辑器,,ex03a.rc,包含,,afxres.h(,只读符号),,afxres.rc(,通用组件),,resource.h(,自定义符号),,Debug,与,Release,目标,,启用诊断宏(,C:\WINNT\afx.ini TraceEnabled=1),,Tools/MFC Tracer/enable tracing,,予编译头文件,(stdafx.cpp stdafx.h),28,在视图窗口中绘图,通过修改,OnDraw(),函数来

12、完成绘图,,是,C,View,类的虚拟成员函数,每次视图重画时调用(,WM_PAINT,OnPaintOnDraw),,如果程序的数据被改变,则可以调用视图的,Invalidate(),成员函数,并最终调用,OnDraw() [Invalidate,WM_PAINTOnDraw()],,对视图窗口的重画不要过于频繁,,画图过程中涉及的,M,FC,类,,设备上下文,,其他图形设备对象,29,设备上下文,W,indows,系统不允许直接操作显示硬件,而是通过一个抽象层—设备上下文来进行通讯,,M,FC,编程中,设备上下文是,CDC,及其派生类的对象,,添入代码:,30,资源,资源编辑器,,

13、ex03a.rc,包含,,加速器、对话框、图标、菜单、字符串、工具条、版本信息,,afxres.h(,只读符号),通用的,M,FC,库资源,,afxres.rc(,通用组件),通用的,M,FC,库资源,,resource.h(,自定义符号),31,Debug,与,Release,目标,分两个版本:发行版和调试版,,区别:源码调试、诊断宏、链接库、编译优化等方面不同,,启用诊断宏(,C:\WINNT\afx.ini TraceEnabled=1),,Tools/MFC Tracer/enable tracing,,予编译头文件(,stdafx.cpp stdafx.h),,/Yc(stdafx

14、.cpp)、/Yu(,复用)、/,Fp(pch,文件路径)编译开关,32,第四章 基本事件处理、映射模式,MFC,类库中有很多,On-,函数—由框架调用,完成对事件的响应。,,他们不是虚拟函数,必须通过消息映射结构,使应用框架和我们的代码关联,,消息映射,,当用户在视图中按下鼠标,,Windows,发送,WM_LBUTTONDOWN,消息给视图窗口,视图窗口必须有一个,OnLButtonDown(UINT nFlags,CPoint point),成员函数来响应该消息,头文件中加入消息处理函数原型,a,fx_msg void OnLButtonDown(UINT nFlags,CPoint p

15、oint),,通过消息映射宏将框架和函数关联,,将消息和消息的响应函数连接的过程称为消息映射。,33,消息映射的步骤:,定义函数:,void CMyView::OnLButtonDown(UINT nFlags,CPoint point){…},,函数原型:,afx_msg void OnLButtonDown(UINT nFlags,CPoint point),,消息映射宏,,BEGIN_MESSAGE_MAP(),,ON_WM_LBUTTONDOWN,,END_MESSAGE_MAP(),,头文件中添加:,,DECLARE_MESSAGE_MAP(),34,保存视图的状态,通过一些状态的

16、变化反映事件,在引入文档类之前,存放在视图的数据成员中,,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.PtInRe

17、ct(point){...},,如何判断点在区域内部,,CRgn rgn;,,rgn.CreateEllipticRgnIndirect(m_rectEllipse);,,if(rgn.PtInRegion(point){...},,实例,36,映射方式,为使显示与显示分辨率无关,应使用不同于以像素为单位的坐标系统,,设备坐标----以像素表示的坐标值。,,逻辑坐标----当前映射方式下的坐标值。,,映射方式----逻辑坐标和设备坐标之间的比例关系。,,Windows,映射方式,映射方式 逻辑单位,,MM_LOENGLISH 0.01 inch,,MM_HIENGLISH

18、0.001 inch,,MM_LOMETRIC 0.1 mm,,MM_HIMETRIC 0.01 mm,,MM_TWIPS 1/1440 inch,,MM_TEXT 1pixel,37,MM_TEXT,映射方式,逻辑坐标和设备坐标1:1,,坐标,X,向右增加,坐标,Y,向下增加,,通过调用,CDC,的,SetWindowOrg,SetViewportOrg,改变原点,,CMyView::OnDraw(CDC* pDC),,{,,pDC->SetMapMode(MM_TEXT);,,pDC->SetWindowOrg(CPoint(100,100));,,//,将逻辑坐

19、标(,100,,,100,)设置为窗口原点,,},38,自定义映射方式一:,固定缩放的映射方式,向右,X,增加,向下,Y,减少,39,自定义映射方式二: 缩放可变的映射方式,可以改变缩放因子和原点,,MM_ISOTROPIC,和,MM_ANISOTROPIC,,MM_ISOTROPIC,纵横比始终是1;1,,M,M_ANISOTROPIC,可以分别改变,X,和,Y,缩放因子,40,坐标转换,一些重要的规则:,,C,DC,的成员函数使用逻辑坐标,,C,Wnd,的成员函数使用设备坐标,,在设备坐标系中进行击键测试如(,C,Rect::PtInRect,),,用逻辑坐标存储长期的值。,,CDC,的

20、函数,LPtoDP,和,DPtoLP,负责两个系统之间的转换。,,在,CView::OnPrepareDC(),中完成映射方式设定。,,编程示例,41,滚动窗口,当窗口比屏幕大时,可能需要滚动视口。,,通过从,CScrollView,中派生视图类可以实现。,,在,OnInitialUpdate(),中定义逻辑大小和映射方式。,,见举例,42,第五章 图形设备接口,所有与绘制有关的操作都要用到,GDI,元素,,设备上下文是最重要的,GDI,元素,代表某个具体的物理设备,43,设备上下文类,基类是,CDC,,每个设备上下文对象有一个,Windows,设备上下文,由,32位,HDC,句柄标识,,CD

21、C,类的虚拟性是应用框架的一个重要特性。,,显示上下文类:,CClientDC、CWindowDC,等,44,设备上下文对象,-,构造和销毁,构造设备上下文对象后,应及时销毁,,Windows,限制可获取设备上下文的数量。,,构造的两种方法,45,设备上下文的状态,使用,CDC,对象绘图时,屏幕上的内容依赖于设备上下文的当前状态:,,绘图需要的相关对象:笔、刷子、字体,,映射方式,,其他方面(文本对齐方式、填充方式等),46,CPaintDC,类,重写了,OnPaint,函数后,需要用到,CPaintDC,类,,OnPaint,用正确设置的,CPaintDC,调用,OnDraw();,47,图

22、形设备接口对象,CBitmap,,CBrush,,CFont,,CPalatte,,CPen,,CRgn,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_MODERN, "Courier

23、New"); // TrueType,,如何断开其与设备上下文的关系,,先选出设备上下文,然后析构,,库存,G,DI,对象自动析构,49,字体,字体是,GDI,对象,,字体的选择,,与设备无关的,True Type,字体和与设备有关的字体(,Windows,系统显示字体和,LaserJet LinePrinter,字体),,MFC,提供选择准确的打印机字体和大小,然后尽力使显示最好。,,打印字体,,以磅来度量,,显示字体,,显示字体和打印字体一般不能严格匹配,除非使用,MM_TEXT,方式。,50,计算字符高度,,51,计算字符高度,字体高度=,tmHeight-tmInternalHeigh

24、t(,点数),,行高=,tmHeight+tmExternalLeading,,对应,TEXTMETRIC,和,GetTextMetrics(,52,举例1,同一种字体,不同大小,53,举例2,大小伸缩字体,54,举例3,格式刷,55,第六章 模态对话框和,Windows,公用控件,模态和非模态对话框,,模态:在对话框关闭之前,不能转到其他窗口工作,,非模态:可以转到其他窗口,但对话框在最顶端,56,对话框与其他窗口类的不同,对话框是基于资源的,资源指定其包含的元素和布局。,,对话框包含的窗口元素:控件,,一个,从,CDialog,类派生的,MFC,类完成和对话框界面的联系,57,模态对话框编

25、程,编程步骤,,使用对话框编辑器创建对话框资源,,ClassWizard,生成派生对话框类,,C,lassWizard,添加数据成员,,C,lassWizard,消息映射,,特殊控件初始化,,在视图中编写代码,,激活对话框对象,,举例1,58,对话框的运行过程,Cdialog::DoModal(),OnInitDialog,CDialog::OnInitDialog,CWnd::UpdateData(FALSE),DoDatExchange,Cdialog::OnOK,UpdateData(TRUE),59,增强对话框程序,控制,OnOK,的退出,,OnCancel,处理,,挂接滚动条控件,,

26、改进的,ex06a,60,识别控件,CWnd,指针和控件,ID,,GetDlgItem,返回,CWnd,指针,,GetDlgCtrlID,返回,ID,,设置对话框背景和控件的颜色(,WM_CTLCOLOR------OnCtlColor),,在对话框窗口内部画图,,运行时增加控件,61,Windows,公用控件,在,Windows95,中引入,,NT,也提供,,包含在,comctl32.dll,动态连接库中,,窗口过程函数及窗口类注册代码包含在该库中,,DLL,加载时注册窗口类,,对公用控件,,ClassWizard,不能提供数据成员支持,但提供通知消息的映射,,应在,OnInitDialog

27、,和,OnOK,中分别初始化和读取控件数据,62,几种W,indows,公用控件,进度指示器控件,对应,C++类是,CProgressCtrl,,可以调用其成员函数,SetRange,和,SetPos,进行初始化或更新操作,,Slider(,跟踪栏控件),对应的,C++类是,CSliderCtrl,,不需要映射,WM_HSCROLL,和,WM_VSCROLL,即可滚动。,63,几种W,indows,公用控件,Spin(,微调控件),对应的,C++类是,CSpinButtonCtrl,,经常和一个编辑控件一起使用,称“伙伴”,编辑控件的,Tab,顺序仅在,Spin,之前。,SetRange(),

28、和,SetAccel(),及,AutoBuddy,和,Set Buddy Integer,属性,64,几种W,indows,公用控件,列表控件,对应的,C++类是,CListCtrl,,需要一个图片文件夹,,CImageList,类的对象,,树型控件,对应的,C++类是,CTreeCtrl,,用,HTREEITEM,而不是整型索引,插入时使用,TV_INSERTSTRUCT,结构,65,控件通知消息结构,早期的,W,indows,控件利用,WM_COMMAND,发送通知消息,,对于,Windows,公用控件来说,标准的32位,wParam,和,lParam,参数是不够的,66,控件通知消息结构

29、,微软提供,WM_NOTIFY,消息解决这一问题,其结构如下:,,举例2,67,第七章 非模态对话框,本章介绍非模态对话框和,Windows,公用对话框,,非模态对话框:在对话框活动的同时允许在其他地方工作。,,公用对话框包括:文件、页面设置、颜色选择等,包含在,comdlg32.dll,中,68,非模态对话框,MFC,中类,CDialog,为基类。,,创建:,,(1)调用,CDialog,的缺省构造函数构造对象,,(2),调用,CDialog::Create(IDD),创建,,可以通过向视图发送用户定义的消息处理按钮消息。,,(1),SendMessage(),,(2)PostMessage

30、(),69,举例1,,70,Windows,公用对话框,CColorDialog,,CFileDialog,,CFindReplaceDialog,,CPageSetupDialog,,CFontDialog,,CPrintDialog,71,直接使用公用对话框类,,,,,72,Windows,公用对话框,派生新类,,对话框嵌套,,创建带有一个特殊成组框的对话框(成组框,ID=0x045f),73,第八章 使用,ActiveX,控件,1991年推出,VB,,同时引入,VBX,,VBX,被证明是成功的,但它是16位段结构的,不能移植到32位系统,,ActiveX,是基于,COM,技术的,VBX,

31、的强有力的替代,,ActiveX,的开发可以用,MFC,和,ATL,,ActiveX,可以在,VB,和,VC,中使用,74,普通控件和,ActiveX,控件,普通控件,,都是子窗口(经常在对话框中使用),,通过,MFC,类对象操控,,客户程序负责创建控件的子窗口,,控件向父窗口发送标准,Windows,消息(,BN_CLICKED),,父窗口通过调用对应控件的,C++,类的成员函数操作控件,75,普通控件和,ActiveX,控件,ActiveX,控件,,属性和方法,,属性具有符号名字(可以匹配到整型索引)和类型,,方法与函数非常相似,,不是向控件容器发送,WM_,通知消息,而是“触发”事件入,

32、Clicked,事件,,可以没有窗口,窗口的创建是通过控件自己(,Create,In place activation),,常用动态连接库存放,但其扩展名是,OCX,76,使用,ActiveX,控件,安装,,拷贝相关文件到系统目录下(*.,ocx,*.hlp,*.lic,等),,运行,Regsvr32,注册,,将想要的控件加到项目中,77,A,ctiveX,控件容器的编程,C,alender,控件,,访问属性,,控件的,C++,包装类,,A,ppWizard,中对,ActiveX,的支持,,A,fxEnableControlContainer(),,Stdafx.h,中的#,include

33、,,利用,ClassWizard,添加针对,ActiveX,控件的数据成员和事件处理函数,78,数据成员,可以向对话框类添加两种数据成员,,针对,A,ctiveX,控件某个属性的,可以在控件显示出来之前控制其属性的值,,针对A,ctiveX,控件的对象数据成员,可以方便地操作属性等,,映射控件事件,,将控件锁定在内存种,,A,fxOleLockControl(m_Cal.GetClsId()),,A,fxOleUnlockControl(,,一个示例,79,第九章,Internet Explorer 4,控件,发布,I,E4,的同时,带有新的,COMCTL32.DLL,,称,IE4,公用控件,

34、,IE4,公用控件介绍,,日期和时间选取器,,月历,,IP,协议地址控件,,扩展组合框,,示例,80,第十章 位图,位图就是一个位矩阵,影射到显示器的象素点上。,,GDI,位图和,DIB,位图,,GDI,位图由,MFC,的类,Cbitmap,代表,,GDI,位图在同一台机器的不同程序间可以传输,但不同机器间不可以,,DIB,带有自己的颜色信息,,彩色位图和单色位图,81,使用,GDI,位图,位图也是,GDI,对象之一,,首先创建位图,,创建内存设备上下文,CreateCompatibleDC,,将位图选入内存设备上下文,SelectObject,,从内存设备上下文将位图画到实际的设备上下文,B

35、,itBlt,或,StretchBlt(),82,使用,GDI,位图,从资源中装载位图,83,映射模式的效果,如果映射模式不是,M,M_TEXT,,则位图可能会变形,,使用,pDC->SetStretchBltMode(COLORONCOLOR);调用可以使显示效果好一些,,也可以通过位图拉伸解决问题,,示例,84,DIB,位图/调色板编程,如果你的程序显示单一,D,IB,位图,,创建逻辑调色板(包含,D,IB,位图的颜色信息,),,将逻辑调色板“实现”到硬件系统调色板中,,如果你的程序是前台程序,实现过程将把,D,IB,位图的所有颜色拷贝到系统调色板(236种颜色,20种由系统保留),,如果

36、另一个程序是前台程序,且要显示236级的绿色场景,则在你的逻辑调色板和系统调色板之间建立映射,假如有一个品红色,则将被映射位标准红色,如果忘了实现调色板,则将被映射为绿色,85,何时“实现”调色板,任何程序实现其调色板的时候,你的程序的主窗口将收到,W,M_PALETTECHANGED,消息,,你程序中的任何一个窗口得到焦点时,,WM_QUERYNEWPALETTE,消息发送,,在主框架窗口中应响应这两种消息,,用,pDC->SelectPalette(),将逻辑调色板选入,,用,RealizePalette,,实现,86,D,IB、,象素和颜色表,一个,D,IB,由一个两维的象素矩阵组成,,

37、每个象素由1、4、8、16、32个位组成,,对于16,bpp、24bpp、32bpp,的,DIB,,每个象素是一个,RGB,颜色,,1,bpp、4bpp、8bpp,的,DIB,,有一个颜色表,每个象素是一个指向颜色表的索引,,当需要显示的颜色多于显示卡能显示的颜色时:,,如果,D,IB,包含重要颜色表,,CreateHalftonePalette,87,D,IB,位图的结构,88,D,IB,位图的结构,BITMAPFILEHEADER,结构,,包含到映象位矩阵的偏移量,,BITMAPINFOHEADER,,DIB,位映象按列、行组织,,从最底行开始,,每行填充到4字节对齐,89,DIB,存取函

38、数,SetDIBitsToDevice:,按一个位图位显示成一个显示象素或一个打印点显示,,StretchDIBits:,类似于,StretchBlt(),,GetDIBits,从一个,GDI,位图构建,DIB,,CreateDIBitmap:,从,DIB,构建,GDI,位图,,CreateDIBSection:,创建一个称为,DIB,段的特殊,DIB,,返回一个,GDI,位图句柄,90,第,四,部分,,MFC,文档/视图结构详解,,91,第一章 菜单、键盘加速器及属性表,本章的主要内容是菜单和命令路由架构,,同时介绍:,,框架、文档和视图的关系,,命令用户接口更新函数,,键盘加速器,,以,R

39、,ichText,控件和属性表来介绍,92,主框架窗口,主框架窗口管理菜单条、标题条、工具条、状态条及视图窗口,93,Windows,菜单,一般由水平菜单列表及附属的弹出式菜单组成,,一般为框架窗口定义默认的菜单资源,创建时自动装载,,也可以定义独立的菜单,用户程序负责装载,,94,键盘加速键,选择菜单命令的快捷方式(定义菜单时字母前导,&),,加速键:通过把一个组合键和命令,ID,对应即可,95,命令处理,应用框架为菜单、加速键、工具条、对话框操作产生的命令消息提供消息路由,,路由的顺序如下:,96,命令消息处理,--,派生类中的命令消息处理,命令消息的路由系统是命令消息处理的一条路径,,类

40、继承树是另一条路径,,类继承时同时继承了全部命令消息函数和消息映射表项,,要覆盖父类的命令消息处理,必须添加派生类的对应命令消息函数和消息映射表项,97,更新命令用户接口处理程序,菜单的外观需要根据程序的状态调整,,菜单第一次显示的时候调用,,空闲的时候,,只能处理弹出式菜单项,98,起源于对话框的命令,如果对话框按扭要发送命令消息,其,I,D,必须在0,X8000—0XDFFF,之间,,这样按扭产生的消息是可路由的,可以在视图类或其他地方处理,,可以先在符号表中添加一个符号,指定其值在0,X8000—0XDFFF,之间,然后将控件,ID,指定为该,ID,即可,99,内置框架菜单项,利用,A,

41、ppWizard,生成的程序带有一个默认的菜单,,菜单的项目根据选择项的不同而不同,,对于没有命令处理函数的菜单项,框架自动禁用之,100,M,FC,的文本编辑选择,利用,TextBox,或,RichTextBox,控件,,C,EditView,是基于,TextBox,的,文本64,K,以下,不支持混合字体,,C,RichEditView,,支持混合字体,大批量文本,主要用于,ActiveX,,C,RichEditCtrl,,与,CRichEditView,类似,101,属性表,属性页,,创建过程,,创建一系列对话框模板,,为每个模板生成一个类,基类,CPropertyPage,,ClassW

42、izard,生成从,CPropertySheet,中派生的类,,针对每个页面添加一个数据成员到属性表类中,,在构造函数中逐一调用,AddPage,,构造属性表的一个对象,然后调用,DoModal(),102,属性表的数据交换,一个示例,103,C,Menu,菜单类,-,菜单的动态加载,创建菜单资源,,在程序中创建,CMenu,对象,,调用对象的,LoadMenu(),,调用某个窗口对象的,SetMenu,,使用完成后调用,Detach,,分离出,HMENU,句柄,以备再次使用,104,浮动菜单及扩展命令处理程序,使用菜单编辑器新建菜单,,在需要的窗口类中映射,W,M_CONTEXTMENT,消

43、息,,在消息处理函数中弹出菜单,105,第二章 工具栏和状态栏,控制拦和应用程序框架,,工具栏是,C,ToolBar,的对象,状态栏是,CStatusBar,的对象,两者都是,CControlBar,的派生类,,CControlBar,派生于,CWnd,类。,,应用框架负责对象的构造,析构、窗口的创建,,A,ppWizard,在框架窗口的派生类中创建代码,106,工具拦,工具条位图由一组图形按扭组成,存放在单一文件中,,工具条按扭的状态:,T,BSTATE_ENABLED,TBSTATE_PRESSED,TBSTATE_CHECKED,,工具栏和命令消息,,工具条按扭一般映射一个菜单项,也可以

44、单独,映射,,工具栏也采用更新命令消息处理(,UI),来更新,,工具提示,,一个示例,107,状态栏,状态栏的定义在数组,i,ndicators,中,,消息行,:调用,SetPaneTetxt(),设置文字,,自己控制状态栏:用另一个,I,D,替代,AFX_IDW_STATUS_BAR,,还要:,,替换创建函数,映射视图中关闭和打开状态栏的消息,ID_VIEW_STATUSBAR,,一个示例,,108,IE,重组控件栏,提供工具夹,从而可以水平或垂直移动,,内部可以使用下拉式菜单等,,CReBar,类,CReBarCtrl,,一个示例,109,第,三,章,,从视图中分离文档,本章介绍文档和视图

45、的相互作用,110,文档和视图交互的函数,文档保存数据,视图显示和编辑数据,,CView::GetDocument,,得到对应的文档对象,,CDocument::UpdateAllViews,,更新所有的视图对象,,CView::OnUpdate,,由框架调用响应,UpdateAllViews,调用,,CView::OnInitialUpdate,,视图初始化,,CDocument::OnNewDocument,,新建文档对象时调用,111,最简单的文档视图结构,单文档,/,单视图结构,不需要,UpdateAllViews,和,OnUpdate(),函数。,,在文档类中添加数据成员(公有),,

46、重写视图类的,OnInitialUpdate,成员函数,,在视图的,OnDraw,函数中使用文档类的数据成员,112,最简单的文档视图结构,整个流程如下:,,一个示例:基于,CFormView,(窗体视)基类,113,多视图,的文档,/,视图结构及交互,在派生视图类中重写,OnUpdate,虚拟成员函数,用于响应文档的修改通知;,,分析命令消息,哪些在文档类中处理?哪些在视图类中处理?,,在派生视图类中合适的函数中更新文档的数据成员,,在文档类合适的函数中调用,UpdateAllViews,更新视,114,切分窗口及多视图,切分窗口是框架子窗口,分几片,每片容纳一个视图对象,,一个,CSpli

47、tterWnd,类的对象代表切分窗口,,切分窗口对象完全拥有框架窗口(,SDI,主框架或,MDI,子框架)的客户区,视图拥有切分窗口每片的区域,,切分窗口不参与命令分发,115,多视图的几种选择,SDI,,切分窗口,单一视图类,,SDI,,切分窗口,多视图类,,SDI,,无切分窗口,多视图类,,MDI,,无切分窗口,单一视图类,,MDI,,无切分窗口,多视图类,,MDI,,切分子窗口,116,动态与静态切分,动态切分,,允许用户在任何时候切分或取消切分窗口,,切分窗口创建时,左上角的片被初始化为特定的视对象,,静态切分,,窗口创建时切分,不能改变,,可以多个视图类,,示例,1,,,2,,,3,

48、,,4,117,第,四,章,,SDI,应用程序的文档读写,串行化(,Serialization,),:,将对象保存到磁盘上或从磁盘上恢复的过程,,主要功能函数是:,Serialize(),,文档的全部对象存在一个文件中,不能单独存取,118,磁盘文件和归档,MFC,的,CFile,类的对象代表磁盘文件,,如果你的程序不直接操作磁盘文件,则可以通过,CArchive,归档对象进行,119,如何串行化,使类成为可串行化的类:,DECLARE_SERIAL(,类名,),,,IMPLEMENT_SERIAL(,类名,基类名,模式号),,编写一个,Serialize(),函数,,在派生类的,Serial

49、ize(),函数中调用基类的,Serialize(),函数,如果基类是,CObject,,则不必调用,,Serialize(CArchive& ar),的参数是一个归档类对象的引用,,归档类重载了插入和提取操作符,120,从归档类中载入对象,内嵌对象,,必须直接在内嵌对象上调用其串行化函数,,之前必须创建该对象,,内嵌指针对象,,可以先创建指针对象,然后调用串行化函数,,也可以直接读入指针对象(动态对象创建),121,对象动态创建过程,确认对象所属的类,,在堆中申请对象所需的内存,,将对象的数据载入申请的对象中,,返回申请对象的指针,122,集合类的串行化,集合类的基类是,CObject,,都

50、支持串行化,,如果集合包含不同类对象的指针,则其所属的类名都存入归档对象,,容器对象(如文档)包含集合对象,载入的数据直接添加到现存的集合中,所以,在载入之前要清除集合对象,(DeleteContents()),,文档对象只要声明,DECLARE_DYNCREATE,和,IMPLEMENT_DYNCREATE(),即可,因为文档对象从不和归档对象的插入和提取符结合,也不会成为集合类的元素,其他类都应声明,DECLARE_SERIAL,和,IMPLEMENT_SERIAL,123,SDI,应用,-,对象关系,Windows,应用对象,,应用对象、文档对象、视图对象、主窗口对象、文档模板对象;应用

51、为全局对象,theApp;,,Windows,应用的启动过程,,Windows,将程序载入内存,,构造全局对象,theApp,,Windows,调用全局函数,WinMain(),AfxWinMain,,WinMain,寻找唯一的一个,CWinApp,的派生类的对象,,WinMain,调用,theApp,的,InitInstance(),函数,,重写的,InitInstance(),启动载入文档并显示主框架窗口和视图窗口的进程,,WinMain,调用,theApp,的,Run(),函数,进入消息循环,124,文档模板类,建立了应用类、文档类、视图类、框架窗口类之间的关系,,MFC,类中的,DE

52、CLARE_DYNCREATE,和实现部分的,IMPLEMENT_DYNCREATE,保证可以动态创建对象,,对象的动态构造,解决了用户编码复杂度问题;,,使用,RUNTIME_CLASS,宏通知框架,125,对象间的关系见图,126,文档模板资源,AddDocTemplate(),的第一个参数是,IDR_MAINFRAME,,是字符串表的一个资源编号,,其结构如下:,,127,CWinApp::OnFileNew(),在调用完,InitInstance(),之后,调用,CWinApp::OnFileNew()[,通过,CWinApp::ProcessShellCommand,],完成如下操作

53、:,,构造文档对象,但不载入数据(串行化),,构造主框架对象,并创建主框架窗口(,IDR_MAINFRAME,菜单,工具条,状态条),但不显示,,构造视图对象,并创建视图窗口,但不显示,,建立文档、主框架、视图对象之间的关系,,调用虚拟,CDocument::OnNewDocument,,该函数调用,,DeleteContents,,(实际中经常需要重写),,调用视图的,CView::OnInitialUpdate,,函数,,对框架对象调用虚拟的,CFrameWnd::ActivateFrame,,,显示主框架窗口、菜单,工具条,状态条,128,关于文档类的其他操作,OnNewDocument

54、(),函数,完成一些初始化操作,,将文件打开操作和串行化代码关联,,提示用户选择文件,,对已存在的文档对象,调用,CDocument::OnOpenDocument,,,该函数调用,C,Document::DeleteContents,,创建归档对象,调用,Serialize,载入数据,,调用,CView::OnInitialUpdate(),,文档类的,DeleteContents(),虚拟函数:如果你要从磁盘载入文档数据(,OnFileNew,和,OnFileOpen,),先调用这个函数,一般要重写;,,将存盘和另存操作和,Serialize(),关联,两个操作都要调用,OnSaveDoc

55、ument(),OnSaveDocument(),要调用,Serialize(),,文档,“,脏,”,标志,文档类的数据成员,m_bModified,表示,通过,SetModifiedFlag(),和,IsModified(),,示例,129,第,五,章,,MDI,应用程序的文档读写,多文档应用程序与单文档应用程序的启动流程基本一致,,多文档模板类,CMultiDocTemplate,,MDI,框架窗口和子窗口:一个,MDI,应用拥有一个主框架窗口和多个子框架窗口,,主框架窗口直接创建,而子框架窗口则在打开时创建,130,MDI,应用程序的,资源,主框架和文档模板资源,,MDI,应用有两个独立

56、的字符串和菜单资源分别由,IDR_MAINFRAME,和,IDR_EXnnTYPE,,前者代表只有空的主框架窗口时的资源,131,OnFileNew,函数,构造文档对象,但不载入数据,,构造子窗口对象,创建子窗口,但不显示,,构造视图对象,创建视图窗口,但不显示,,建立文档、子框架、视图对象之间的关联,,调用,OnNewDocument,,调用,OnInitialUpdate,,对子框架窗口调用,ActivateFrame,132,对已存在的文档,创建另外的视图,构造子窗口对象,创建子窗口,但不显示,,构造视图对象,创建视图窗口,但不显示,,建立文档、子框架、视图对象之间的关联,,调用,OnI

57、nitialUpdate,,对子框架窗口调用,ActivateFrame,133,第,六,章,,打印和打印予览,Windows,通过提供各种打印机的驱动程序和统一的编程接口简化了打印编程,对编程用户透明,,标准打印机对话框,,交互打印纸张选择,,打印时显示显示打印状态(张数,/,打印张数),134,打印机编程,MFC,框架为打印及打印予览完成了大部分功能,为此必须了解打印过程中函数调用序列及哪些函数要重写;,,打印需要的设备上下文由框架生成,并作为参数,,显示:,OnPaint->OnDraw,,显示设备上下文,,打印:,OnPrint->OnDraw,,打印机设备上下文,,OnPrint()

58、:,每打印一页,调用一次,可以添加打印特有的代码,或也可以选择不调用,OnDraw,,实现显示与打印完全独立;,,OnPrepareDC:,,可以设置不同的映射模式,在,OnPrint,之前调用;,,OnPreparePrinting:,是第一个调用的函数,可以设置页码等;,,OnBeginPrinting:OnEndPrinting,135,打印机编程,几个函数之间的关系:,,OnPreparePrinting:,设置页码,,OnBeginPrinting:,创建,GDI,对象,,OnPrepareDC:,设置映射模式,,OnPrint(),:具体完成打印,,OnEndPrinting:,删

59、除,GDI,对象,136,第五部分,MFC,程序设计的其他方面,,137,第,1,章 多线程程序设计,非抢占式多任务和抢占式多任务,,通过定,时器,实现的多任务,,多线程编程,,使用事件使线程同步,138,单线程程序消息处理,迄今为止所有实例为单线程,只有一个执行路径;,,消息处理过程如下:,,,MSG message;,,while (::GetMessage(&message, NULL, 0, 0)),,{ ::TranslateMessage(,,::DispatchMessage(,,},,,没有消息时程序挂起;消息到来,唤醒,获得消息、处理消息,139,W,in32,为,抢占式多任

60、务,,可以在计算量很大的函数中采用放弃控制权的方法避免死锁;,,一个使用定时器的实例,140,多线程编程,主要工作:,,定义全局或静态函数,其形式为:,,UINT FuncName(LPVOID pParam),,启动线程:,,CWinThread* pThread = AfxBeginThread(FuncName, pParam, THREAD_PRIORITY_NORMAL);,,线程间交互:,,全局变量,(::InterLockedIncrement()),,消息,141,线程同步的几种技术:,,事件、关键段、互斥、信号量,,使用事件使线程同步,,使用,CEvent,类,包含,afxm

61、t.h,;,,定义相应的,CEvent,对象,对象状态为有信号和无信号;,,使用,WaitForSingleObject,和,WaitForMultiObject,在线程中获取信号状态,达到控制线程的目的;,,142,第,2,章 动态连接库程序设计,Win32,动态连接库,,静态连接,MFC,的常规动态连接库,,共享连接,MFC,的常规动态连接库,,共享连接,MFC,的扩展动态连接库,143,Win32,动态连接库,在不使用,MFC,功能的情况下,,通过,AppWizard,生成,Win32 DLL,框架,,加入要输出的函数、变量、类,,__declspec(dllexport),指定作为输出

62、函数,,__declspec(dllimport),在引用程序中指定输入,144,Win32,动态连接库的引用,VC++,下引用,,需要库文件*.,lib,,需要头文件,,VB,下引用,,函数的调用格式是:_,stdcall(,或,WINAPI),,需要模块定义文件*.,def,,将函数名和顺序号成对映射,145,客户程序定位,DLL,顺序,包含,EXE,文件的目录,,进程的当前目录,,Windows,系统目录,,Windows,目录,,列在,Path,环境变量中的目录,146,静态连接,MFC,的常规动态连接库,可以适用于任意,Win32,编程环境(包括,VB),,DLL,的大小比共享连接,

63、MFC,时大,,*.,def,文件,,示例,147,共享连接,MFC,的常规动态连接库,可以适用于任意,Win32,编程环境(包括,VB),,要求目标机器上有合适的,MFC,动态连接库,,*.,def,文件,,示例,148,共享连接,MFC,的扩展动态连接库,能导出,C++,类,将宏,AFX_EXT_CLASS,加入到类声明中,如:,,class AFX_EXT_CLASS_CStudent:public Cobject,,扩展,DLL,资源的搜索顺序:,,EXE,需要资源时:(1),EXE (2),扩展,DLL (3)MFC,库,,扩展,DLL,需要资源时,: (1),扩展,DLL (2)M

64、FC DLL (3)EXE,,可以如下改变搜索顺序:,149,第,3,章,TCP/IP,网络程序设计,基于,Socket,的套接字编程实例。,150,建立基于,Socket,程序的步骤,Socket,程序分服务器端和客户端,2,部分,AppWizard,生成,2,个框架程序 在各自,InitInstance,()中执行,AfxSocketInit(),函数,框架初始化,Socket,套接字。 服务器端需要一个监听套接字和若干伙伴套接字(异步套接字对象) 客户端需要一个用于连接的套接字对象,151,服务器端流程,152,客户端流程,153,建立服务器端框架程序,154,建立客户端框架程序,155

65、,第,4,章 数据库程序设计,关系数据库基本概念,,表、列、记录、游标、事务,,SQL,语言:,,SELECT、INSERT、DELETE、UPDATE,,MFC,支持以下数据库接口,,ODBC(OPEN DATABASE CONNECTIVITY),,DAO(DATA ACCESS OBJECT),,OLE DB,,ADO(ACTIVEX DATA OBJECT),156,4.1 DAO,微软提供的针对,Microsoft Jet,数据库引擎的接口,,提供,CDaoWorkspace、CDaoDatabase、CDaoRecordset、CDaoTableDef、CDaoQueryDef,等

66、类,157,4.2 ODBC/MFC,ODBC,是访问不同数据库的通用接口,以,API,函数的形式提供,,MFC ODBC,是微软对通用,ODBC API,以类的形式进行了封装,,提供,CDatabase、CRecordSet、CRecordView,类,,必须覆盖的虚拟成员函数:,GetDefaultSQL(),GetDefaultConnect(),158,4.3 ADO,ADO,是以组,COM,组件,可以以不同方式使用,,VC++,下使用其,C++,接口,,提供,ADOConnection、ADORecordset、ADOCommand、ADOField、ADOProperty、ADOParameter,等类,159,ADO,编程步骤,包含相关头文件,,#,include ,,#include ,,#include ,,从,CADORecordBiding,类派生数据存取类,以将数据源的数据绑定到程序中,,调用,CoInitialize,初始化,COM,,调用,CoCreateInstance,创建,ADOConnection,和,ADOCommand,实例,160,ADO,编程

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

相关资源

更多
正为您匹配相似的精品文档
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

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

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


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