资源描述
Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,Click to edit Master title style,LOGO,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,Click to edit Master title style,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,主要内容,2.1用MFC向导生成应用程序,2.2 应用程序框架分析,2.3 文档与视图,2.4 工具栏和状态栏,2.5-2.7MFC新功能,2.8 应用程序框架类对象分析,主要内容2.1用MFC向导生成应用程序,1,2.1 用MFC向导生成应用程序,用AppWizard应用程序向导生成MFC应用程序。,单文档,应用程序,多文档,应用程序,对话框,应用程序,用ClassWizard工具生成派生类、定义处理消息、管理对话框、定制MFC成员函数。,2.1 用MFC向导生成应用程序用AppWizard应用程序,2,2.1 用MFC向导生成应用程序,演示MFC向导生成常用的三种应用程序。,2.1 用MFC向导生成应用程序演示MFC向导生成常用的三种,3,2.1.2 生成的应用程序类型,基于对话框的应用程序,CWinApp、CDialog类,2.1.2 生成的应用程序类型基于对话框的应用程序,4,2.1.2 生成的应用程序类型,单文档应用程序,CWinApp、CFrameWnd、CView、CDocument,2.1.2 生成的应用程序类型单文档应用程序,5,2.1.2 生成的应用程序类型,多文档应用程序,CWinApp、CMDIFrameWnd、 CMDIChildWnd、CView、CDocument,2.1.2 生成的应用程序类型多文档应用程序,6,2.1.3 向导生成工程文件简介,头文件与实现文件,各个类的*.h和*.cpp,Resource.h:定义工程中所有资源标识符,给资源ID分配一个整数值。,StdAfx.h和StdAfx.cpp:用于建立一个预编译的头文件。,资源文件,*.rc和*.rc2:是程序所使用的所有Windows资源的列表。,*.ico:应用程序的图标所使用的图标文件。,*Doc.ico:应用程序的文档图标文件。文档图标一般显示在多文档程序界面上。,Toolbar.bmp:工具栏按钮的位图文件。,2.1.3 向导生成工程文件简介头文件与实现文件,7,2.1.3 向导生成工程文件简介,解决方案文件和工程文件,*.sln:保存当前解决方案所包含的工程的信息。,*. vcxproj:包含当前工程的设置、工程中的文件等信息。,2.1.3 向导生成工程文件简介 解决方案文件和工程文件,8,MFC,应用程序框架结构类的继承关系:,2.2,应用程序框架分析,MFC应用程序框架结构类的继承关系: 2.2 应用程序框架分,9,2.2.1,框架简介,1.,CObject类,CObject是MFC类库的根类,它几乎描述了所有MFC类的一些公共特性,并且给所有由它派生出的类提供了3种重要特性,即:串行化支持、运行时类信息支持以及诊断和调试支持。,2.CCmdTarget类,命令类CCmdTarget是CObject的子类,它是MFC库中所有具有消息映射属性的类的公共基类。从CCmdTarget派生的类能在程序运行时动态创建对象和处理命令消息。,2.2.1 框架简介 1.CObject类,10,3. CWinApp,类,CObject,CCmdTarget,CWinThread,CWinApp,应用程序类在类族中的位置,WinMain,函数的函数体的封装,支持线程管理,2.2.1,框架简介,应用程序类,CWinApp,是,CWinThread,的子类,封装了初始化、运行、终止应用程序的代码。可以由此派生自己的应用类。,3. CWinApp类CObjectCCmdTargetCW,11,指向框架窗口的指针,m_pMainWnd,2.2.1,框架简介,指向框架窗口的指针m_pMainWnd2.2.1 框架简介,12,CWinApp类中定义了三个可以重写的虚函数:,InitInstance () -,程序创建和显示窗口。,程序设计时,必须以CWinApp类为基类派生自己的应用程序类,并根据情况重写InitInstance () 。,Run(),处理消息循环。,ExitInstance()程序结束时做收尾工作。,2.2.1 框架简介,CWinApp类中定义了三个可以重写的虚函数:2.2.1,13,4.,文档模板类,CDocTemplate,CObject,CCmdTarget,CDocTemplate,CSingleDocTemplate,CMultiDocTemplate,单一的文档指针,2.2.1,框架简介,4. 文档模板类CDocTemplateCObjectCCm,14,文档类链表,查阅,CPtrList,类,2.2.1,框架简介,文档类链表查阅CPtrList类2.2.1 框架简介,15,RUNTIME_CLASS,分别创建了,doc,、,view,和窗口框架类的对象,2.2.1,框架简介,RUNTIME_CLASS分别创建了doc、view和窗口框,16,5.CFrameWnd,类,CFrameWnd,类是,CWnd,类的派生类。它是所有其他框架窗口类的基类,主要用来管理一个窗口。,CFrameWnd,类的对象是一个框架窗口,包括边框、标题栏、菜单、最大化按钮、最小化按钮和一个激活的视图。,CFrameWnd,类支持单文档界面,对于多文档界面,使用它的两个派生类,CMDIFrameWnd,和,CMDIChildWnd,。,CMDIFrameWnd,类用于,MDI,的主窗口,,CMDIChildWnd,类用于,MDI,的子窗口。,2.2.1,框架简介,5.CFrameWnd类2.2.1 框架简介,17,6.CView,类,视图类,CView,是,CWnd,类的子类。视图类及其派生类用于管理框架窗口的客户区。,7.CDocument,类,文档类,CDocument,负责装载和维护文档。文档包括应用程序的工作成果或环境设置数据等,可以是程序需要保存的任何内容。,2.2.1,框架简介,6.CView类2.2.1 框架简介,18,为应用程序框架提供客户区,承担用户数据的显示(同时替代窗口框架接收外界的输入。因此,,该类是程序员编码最多的地方,。,派生关系,与文档类的联系纽带,用户区的绘制,注意:谁来触发,1),自动重绘,; 2),手动视图更新,2.2.1,框架简介,为应用程序框架提供客户区,承担用户数据的显示(同时替代窗口框,19,应用程序的文档类由,CDocument,派生,Serialize(),函数:,文件操作时响应,Read data from file,Write data to file,序列化,/,串行化,Serialization,2.2.1,框架简介,应用程序的文档类由CDocument派生Serialize(,20,各对象之间的关系,2.2.1 框架简介,各对象之间的关系2.2.1 框架简介,21,CWinApp theApp,;,theApp.InitInstance,系统,应用程序对象,文档模板,文档对象,窗口框架对象,视图对象,1.,应用程序各对象的创建顺序,2.2.2 MFC,应用程序运行流程,CWinApp theApp;theApp.InitInst,22,2.2.2 MFC应用程序运行流程,2.应用程序的执行过程,启动:创建应用程序对象theApp、调用应用程序类的构造函数初始化对象theApp。,应用程序框架调用MFC提供的AfxWinMain( )主函数。,AfxWinMain( )主函数,首先通过调用全局函数AfxGetApp( )来获取theApp的指针pApp;,然后通过该指针调用theApp的成员函数InitInstance( )来初始化应用程序。,2.2.2 MFC应用程序运行流程2.应用程序的执行过程,23,在应用程序的初始化过程,InitInstance,中,同时还构造了文档模板,产生最初的文档、视图和主框架窗口,并生成工具栏和状态栏。,2.2.2 MFC应用程序运行流程,当InitInstance( )函数执行完毕后,AfxWinMain( )函数将调用成员函数Run( ),进入消息处理循环;,函数Run( )收到WM_QUIT消息。,MFC首先调用CWinApp类的成员函数ExitInstance( );,然后调用静态对象的析构函数;,退出应用程序,将控制权交给操作系统。,在应用程序的初始化过程InitInstance中,同,24,WinMain - AfxWinMain,应用程序初始化,消息循环,C:Program FilesMicrosoft Visual Studio 10.0vcatlmfcsrcwinmain.cpp,2.2.2 MFC,应用程序运行流程,WinMain - AfxWinMain应用程序初始化消息,25,2.2.3 应用程序窗口,重叠窗口,弹出窗口,子窗口,2.2.3 应用程序窗口重叠窗口,26,Windows,消息主要有,3,种类型,:,标准,Windows,消息、控件消息和命令消息。,1,),标准,Windows,消息,除,WM_COMMAND,以外,所有以,“,WM_,”,为前缀的消息都是标准,Windows,消息,;,由窗口类或视图类处理,;,都有默认的处理函数,它们在,CWnd,类中进行了预定义。,1 .,消息的类别及其描述,2.2.4 消息机制与消息循环,Windows消息主要有3种类型:标准Windows消,27,标准的,Windows,消息又分为,3,类:,键盘消息、鼠标消息和窗口消息。,(1),键盘消息,键盘消息与键盘某个键的动作相关联。常见的键盘消息有以下几种。,WM_KEYDOWN,、,WM_KEYUP,:按下、释放键产生的消息。,WM_CHAR,:输入字符时产生的消息。,2.2.4 消息机制与消息循环,标准的Windows消息又分为3类:2.2.4 消息机制与消,28,(2),鼠标消息,鼠标消息涉及到鼠标的单击、双击、拖动等。常用的鼠标消息有以下几种。,WM_MOUSEMOVE,:鼠标移动时产生的消息。,WM_RBUTTONDOWN,:鼠标右键按下时产生的消息。,WM_LBUTTONDOWN,:鼠标左键按下时产生的消息。,WM_LBUTTONDBLCLICK,:鼠标双击时产生的消息。,2.2.4 消息机制与消息循环,(2) 鼠标消息2.2.4 消息机制与消息循环,29,(3),窗口消息,窗口消息一般与创建窗口、绘制窗口、移动窗口和销毁窗口等动作有关。,在,MFC,应用程序中,窗口消息是由视图类、窗口类及它们的派生类处理的。,2.2.4 消息机制与消息循环,(3) 窗口消息2.2.4 消息机制与消息循环,30,2).,控件消息,控件消息是指控件或其他子窗口向父窗口发送的消息。,与其他标准的,Windows,消息一样,控件消息也应该在视图类、窗口类中进行处理。但是,如果用户单击按钮控件时,发出的控件通知消息,BN_CLICKED,将作为命令消息来处理。,2.2.4 消息机制与消息循环,2).控件消息2.2.4 消息机制与消息循环,31,3).,命令消息,命令消息是由菜单项、工具栏按钮、快捷键等用户界面对象发出的,WM_COMMAND,消息。,命令消息与其他消息不同,它可被更广泛的对象如文档、文档模板、应用程序对象、窗口和视图等处理。,3).命令消息,32,2. MFC,消息映射机制,MFC,采用消息映射来处理消息;,消息映射机制包括一组消息映射宏,用于把一个,Windows,消息和其消息处理函数联系起来。,所有从,CCmdTarget,类派生出来的类都能够拥有自己的消息映射。,与,MFC,消息映射机制有关的宏有以下,3,个:,DECLARE_MESSAGE_MAP( ),BEGIN_MESSAGE_MAP(MyClass, MybaseClass),END_MESSAGE_MAP( ),2.2.4 消息机制与消息循环,2. MFC消息映射机制 MFC采用消息映射来处理消息;,33,为了使用消息映射宏:,首先在类定义的结尾用,DECLARE_MESSAGE_MAP( ),宏来声明使用消息映射,该宏表示在为各个处理函数所写的类声明之后存在消息映射条目,这些函数是该类的成员函数。,然后在类的实现源文件中用,BEGIN_MESSAGE_MAP( ),和,END_MESSAGE_MAP( ),宏来定义消息映射。,MFC,应用程序,MESSAG_MAP,消息映射的形式如下:,2.2.4 消息机制与消息循环,为了使用消息映射宏:2.2.4 消息机制与消息循环,34,BEGIN_MESSAGE_MAP(,MyClass,MybaseClass,),/ AFX_MSG_MAP (,MyClass,) /ClassWizard,维护消息映射宏的标记,ON_. /MFC,预定义消息映射宏,ON_,MESSAGE,(,message,memberFun,)/,用户自定义消息映射宏,/ AFX_MSG_MAP,END_MESSAGE_MAP(),其中,,MyClass,是拥有消息映射的派生类名,,MybaseClass,是其基类名。,2.2.4 消息机制与消息循环,BEGIN_MESSAGE_MAP(MyClass, Myb,35,2.2.4,消息机制与消息循环,2.2.4 消息机制与消息循环,36,3,自定义消息处理,自定义消息处理,:,定义消息名、分配,ID,值及完成消息映射。,Windows,将所有的消息值分为,4,段:,0x0000,0x03FF,段,:,用于,Windows,系统消息,0x0400,0x7FFF,段,:,用于用户自定义的窗口消息,0x8000,0xBFFF,段,:,为,Windows,保留值,0xC000,0xFFFF,段,:,用于应用程序的字符串消息。,2.2.4 消息机制与消息循环,3 自定义消息处理 自定义消息处理:定义消息名、分配ID值,37,常量,WM_USER(,为,0x0400),与第一个自定义消息值相对应,用户必须为自己的消息定义相对于,WM_USER,的偏移值,利用,#define,语句直接定义自己的消息,如下所示:,#define WM_HIDE WM_USER+3 /,自定义消息,WM_USER,也可以调用窗口消息注册函数,RegisterWindowMessage( ),来定义一个,Windows,消息,由系统分配消息一个整数值。该函数原型为:,UINT RegisterWindowMessage(LPCTSTR lpString),;,其中参数,lpString,是要定义的消息名,调用成功后将返回该消息的,ID,值。,2.2.4 消息机制与消息循环,常量WM_USER(为0x0400)与第,38,2.2.4 消息机制与消息循环,自定义消息方法的步骤:,1、:定义消息,#define WM_HIDE WM_USER+101,2、在类头文件的AFX_MSG块中声明消息处理函数:class CMainFrame:public CFrameWndprotected:/AFX_MSG(CMainFrame)afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnTimer(UINT nIDEvent);,afx_msg LRESULT OnHide(WPARAM wParam, LPARAM lParam);,/AFX_MSGDECLARE_MESSAGE_MAP(),2.2.4 消息机制与消息循环自定义消息方法的步骤:,39,2.2.4 消息机制与消息循环,3、在类的实现文件中,使用,ON_MESSAGE宏,指令将消息映射到消息处理表中。BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)/AFX_MSG_MAP(CMainFrame)ON_WM_CREATE()ON_WM_TIMER(),ON_MESSAGE(WM_HIDE, OnProgress)/注意这条语句的后面没有分号,/AFX_MSG_MAPEND_MESSAGE_MAP(),2.2.4 消息机制与消息循环3、在类的实现文件中,使用ON,40,2.2.4 消息机制与消息循环,4、实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LRESULT。,LRESULT CMainFrame:OnHide(WPARAM wParam,LPARAM lParam),MessageBox(_T(我的消息);,return 0;,2.2.4 消息机制与消息循环4、实现消息处理函数。该函数使,41,2.2.4 消息机制与消息循环,5、在适当的时候发送自定义消息,进行消息处理。需要注意使用SendMessage还是PostMessage进行处理:SendMessage是消息处理完毕后再返回;而PostMessage则是把消息放到消息队列后立即返回。,SendMessage(theApp.GetMainWnd()-GetSafeHwnd(),WM_PROGRESS,0L,0L);,如果用户需要整个系统唯一的消息,可以调用SDK函数RegisterWindowMessage并使用ON_REGISTER_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步骤同上 。,2.2.4 消息机制与消息循环5、在适当的时候发送自定义消息,42,2.2.4 消息机制与消息循环,SendMessage 函数原型,LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam),hWnd:其窗口程序将接收消息的窗口的句柄。,Msg:指定被发送的消息号。,wParam:指定附加的消息特定信息。,lParam:指定附加的消息特定信息。,返回值:返回值指定消息处理的结果,依赖于所发送的消息。,2.2.4 消息机制与消息循环SendMessage 函数原,43,2.2.4 消息机制与消息循环,演示并编写一个自定义消息应用程序,添加WM_PROGRESS消息。当程序运行时,则调用自定义消息处理函数,输出文本“自定义消息处理函数被调用!”。,2.2.4 消息机制与消息循环演示并编写一个自定义消息应用程,44,消息传递,标准Windows消息传递,直线上溯,命令消息传递,迂回上溯,消息传递标准Windows消息传递,45,第2章-MFC应用程序课件,46,消息传递,对于,WM_COMMAND,消息。框架窗口实际上是大多数,WM_COMMAND,消息的接受者,但,WM_COMMAND,消息还可以在视图、文档,甚至应用程序类中被处理。,消息传递对于WM_COMMAND消息。框架窗口实际上是大多数,47,文档视图体系结构是,MFC,应用程序框架结构的基石,它定义了,一种程序结构,,这种结构利用文档对象保存应用程序的数据,依靠视图对象控制视图显示数据,文档与视图的关系是一对多的关系,也就是说,文档中的数据可以以不同的方式显示。,2.3 文档与视图,文档视图体系结构是MFC应用程序框架结构的基石,它,48,2.3 文档与视图,文档负责数据读取、存取以及其它的操作。,CDocument类本身只是一个空壳,我们需要从它派生一个数据自已的类,并在类中声明我们需要的变量,用以承载数据。,CDocument类已经为我们做好了一些重要的函数,其中包括与View类的”沟通”函数、文档存取等函数。,2.3 文档与视图文档负责数据读取、存取以及其它的操作。,49,表 主要的,CDocument,操作,2.3,文档与视图,表 主要的CDocument操作2.3 文档与视图,50,表 主要的,CDocument,可覆盖函数,2.3,文档与视图,表 主要的CDocument可覆盖函数2.3 文档与视图,51,用户可通过函数,GetFirstViewPosition(),和,GetNextView(),得到和文档关联的视图的指针,代码如下:,POSITION pos = GetFirstViewPosition(); /,得到视图列表头的位置,While(pos != NULL), CView *pView = GetNextView(pos);/,获得视图列表中的视图指针,2.3 文档与视图,用户可通过函数GetFirstViewPos,52,2.3,文档与视图,视图类有两个用途:,提供文档的可视化表示,将用户输入(特别是鼠标和键盘消息)转换为操作文档数据的命令。,MFC还包含了一组CView类的派生类,用来完成不同功能的视图。,2.3 文档与视图视图类有两个用途:,53,CEditView,:简单的文本编辑器,类似,Notepad,CListView,:基于列表的视图,类似文件夹浏览,CTreeView,:基于树状控件的视图,类似文件浏览左侧的树状结构,CRichEditView,:支持多种字体、,OLE,和,RTF,格式的高级编辑器,CScrollView,:支持滚动条的视图,CFormView,:窗体视图,支持在上边使用对话框控件,CRecordView,:连接到,ODBC,数据库的视图,CDaoRecordView,:连接到,DAO,数据库的视图,CView,的子类,2.3,文档与视图,CEditView:简单的文本编辑器,类似NotepadCV,54,2.3 文档与视图,一个文档可以具有与其联系的多个视图,而一个视图只能属于一个文档。,CView类保存了m_pDocument数据成员,并将该指针提供给视图的GetDocument成员函数使用,用以标识出视图类所属的文档。,AppWizard为视图类生成源代码时,它覆盖了基类的GetDocument函数。其强制转换了m_pDocument为派生类指针。,2.3 文档与视图一个文档可以具有与其联系的多个视图,而一个,55,2.3 文档与视图,表 主要的,CView,可覆盖函数,2.3 文档与视图表 主要的CView可覆盖函数,56,2.3 文档与视图,OnInitialUpdate与OnUpdate,在SDI中,视图与文档一样,只构造一次,重复使用。,在SDI中,每当文档被打开或创建时,都要调用视图的OnInitialUpdate(),OnInitialUpdate()默认要调用OnUpdate(),OnUpdate()的默认操作是使视图客户区无效并执行重绘。,在CView类的派生类中,如果重写了OnInitialUpdate(),需要要调用CView:OnInitialUpdate(),否则新文档被打开或创建时不会被更新。,2.3 文档与视图 OnInitialUpdate与OnUp,57,2.3 文档与视图,CView:OnDraw何时调用:,在WM_PAINT到来时(当视窗显示区域的一部分显示内容或者全部变为无效,以致于必须更新画面时,将由这个讯息通知程式。),在文档被打印时,什么是CDC,DC:Device Context,设备描述表。,在WM_PAINT到来时,DC指向屏幕设备,在文档被打印时,DC指向打印机设备,2.3 文档与视图 CView:OnDraw何时调用:,58,2.3 文档与视图,OnPaint()与OnDraw,WM_PAINT到来时会调用OnPaint()函数,此函数在CView中被定义。,WM_PRINT到来时会调用OnPrint()函数,此函数在CView中被定义。,两个函数都调用了OnDraw(),并传送不同的DC,分别代表屏幕设备与打印设备。,2.3 文档与视图OnPaint()与OnDraw,59,2.4 工具栏与状态栏,2.4 工具栏与状态栏,60,2.4 工具栏与状态栏,工具栏简介,工具栏对象是一种窗口,工具栏中的所有按钮的图形被存储在一个位图中,而该位图被定义在应用程序的资源文件中。,工具栏按钮与菜单选项是类似的。单击工具栏按钮将产生相应的命令,应用程序通过提供消息处理函数来处理产生的命令。如果工具栏的某个按钮没有COMMAND或UPDATE_COMMAND_UI处理函数,那么框架自动使该按钮无效。,工具栏和状态栏一般作为框架窗口类的成员变量声明,在创建框架窗口时自动创建它们,在销毁框架窗口时自动销毁所创建的控件栏对象。,使用AppWizard创建应用程序基本框架时,可以得到初始的工具栏和状态栏。,2.4 工具栏与状态栏工具栏简介,61,2.4.1 工具栏,系统默认生成的工具栏资源为IDR_MAINFRAME,可以在此基础上设计自己的工具栏,删除或添加一些按钮。需要为工具栏按钮提供ID号,一般取某个菜单项的ID。,2.4.1 工具栏系统默认生成的工具栏资源为IDR_MAIN,62,2.4.1 工具栏,工具栏的创建:,(1)创建工具栏资源,(2)构造CToolBar对象,即在边框窗口类的声明中添加类似以下的声明:,CToolBar m_wndToolBar;,(3)调用Create或CreateEx创建工具栏,然后调用LoadToolBar装载工具栏资源。,2.4.1 工具栏工具栏的创建:,63,工具栏的创建,int CMainFrame:OnCreate(,LPCREATESTRUCT lpCreateStruct),if (!,m_wndToolBar.,CreateEx(,this, TBSTYLE_FLAT,WS_CHILD | WS_VISIBLE | CBRS_TOP,| CBRS_GRIPPER | CBRS_TOOLTIPS,| CBRS_FLYBY | CBRS_SIZE_DYNAMIC,),|,!m_wndToolBar.,LoadToolBar,(,IDR_MAINFRAME),),TRACE0(Failed to create toolbarn);,return -1; / fail to create,CToolBar,m_wndToolBar;,工具栏的创建int CMainFrame:OnCreate,64,工具栏的停靠,int CMainFrame:OnCreate(,LPCREATESTRUCT lpCreateStruct),m_wndToolBar.EnableDocking,(,CBRS_ALIGN_ANY);,EnableDocking,(CBRS_ALIGN_ANY);,DockControlBar(,工具栏的停靠int CMainFrame:OnCreate,65,调用Create时还可以指定工具栏的风格,默认风格是WS_CHILD|WS_VISIBLE|CBRS_TOP。,CBRS_TOP 工具栏在边框窗口顶部,CBRS_BOTTOM 工具栏在边框窗口底部,CBRS_NOALIGN 边框窗口改变大小时,工具栏不重定位,CBRS_TOOLTIPS 使工具提示有效。,CBRS_SIZE_DYNAMIC 工具栏尺寸可变。,CBRS_SIZE_FIXED 工具栏尺寸固定。,CBRS_FLOATLNG 工具栏是浮动的。,CBRS_FLYBY 在状态栏中显示按钮的有关信息。,CBRS_HIDE_INPLANE 不显示工具栏。,工具栏的创建,调用Create时还可以指定工具栏的风格,默认风格是WS_C,66,停靠方式,CToolBar的,EnableDocking,:设置工具栏能停靠在何处?,CBRS_ALIGN_ANY,CBRS_ALIGN_TOP、CBRS_ALIGN_LEFT,CBRS_ALIGN_RIGHT、,CBRS_ALIGN_BOTTOM,CMainFrame,类的,EnableDocking,:设置能让工具栏停靠在何处?,调用DockControlBar,完成工具栏停靠,具体效果由上面的两个EnableDocking共同决定。,停靠方式CToolBar的EnableDocking:设置工,67,2.4.1 工具栏,演示在系统提供的工具栏上添加并编辑新的工具栏按钮,产生消息响应。,2.4.1 工具栏演示在系统提供的工具栏上添加并编辑新的工具,68,2.4.1 工具栏,创建新工具栏资源,定义工具栏对象MainFrm.h中,protected:,CStatusBar m_wndStatusBar;,CToolBar m_wndToolBar;,CToolBar m_wndTool1;,系统的工具栏,第二个工具栏,2.4.1 工具栏创建新工具栏资源系统的工具栏第二个工具栏,69,多工具栏实现创建,int CMainFrame:OnCreate(),if (!,m_wndToolBar.CreateEx(),|,!,m_wndToolBar.LoadToolBar(IDR_MAINFRAME),),TRACE0(Failed to create toolbarn);,return -1;,if (!,m_wndTool1.CreateEx(),|,!,m_wndTool1.LoadToolBar(IDR_TOOL),),TRACE0(Failed to create toolbarn);,return -1; / fail to create,多工具栏实现创建int CMainFrame:OnCre,70,多工具栏实现停靠,int CMainFrame:OnCreate(),m_wndToolBar.EnableDocking(,CBRS_ALIGN_ANY);,m_wndTool1,.EnableDocking(,CBRS_ALIGN_ANY);,EnableDocking(CBRS_ALIGN_ANY);,DockControlBar(,DockControlBar(&,m_wndTool1,);,return 0;,只需调用一次,多工具栏实现停靠int CMainFrame:OnCre,71,隐藏和显示工具栏,ShowControlBar,(&m_wndTool1,true,false);,ShowControlBar,(&m_wndToolBar,false,false);,true,显示,false,隐藏,是否立即显示,,false,立即显示,隐藏和显示工具栏ShowControlBar(&m_wndT,72,2.4.2 状态栏,状态栏可以显示与上下文有关的工具栏按钮和菜单项的帮助信息。在Windows中已经变的非常普遍。,2.4.2 状态栏状态栏可以显示与上下文有关的工具栏按钮和,73,2.4.2 状态栏,状态栏的定义,用AppWizard创建的SDI或MDI应用程序框架中,有一个静态的indicator数组,它是在MainFrm.cpp文件中定义的,被MFC用作状态栏的定义。,Static UINT indicators=,ID_SEPARATOR,ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,indicators,数组的定义,2.4.2 状态栏 状态栏的定义 Static UINT,74,2.4.2 状态栏,提示符从左到右水平排列在状态栏中,往数组中添加更多的标识符就可以在状态栏增加更多的提示符,可以根据需要动态改变提示符的大小,通过增加ID_SEPARATOR元素还可增加分隔符。最左边的提示符(位置0)通常用作消息区,可以在其中显示命令提示之类的文本字符串。,创建状态栏,创建状态栏的步骤:,(1)构造CStatusBar对象。,(2)调用Create创建状态栏并将其与CStatusBar对象联结。,(3)调用成员函数SetIndicators,设置指示符的标识符为数组中相应元素指定的值,装载每个标识符指定的字符串资源并将字符串设为提示符文本。,2.4.2 状态栏提示符从左到右水平排列在状态栏中,往数组,75,状态栏的创建,int CMainFrame:OnCreate(,LPCREATESTRUCT lpCreateStruct),if (,!m_wndStatusBar.Create(this),|,!m_wndStatusBar.,SetIndicators,(,indicators,sizeof(indicators)/sizeof(UINT),),TRACE0(Failed to create status barn);,return -1; / fail to create,CStatusBar,m_wndStatusBar;,状态栏的创建int CMainFrame:OnCreate,76,3、自定义状态栏窗格,每个窗格指定一个ID号,同时还要创建一个相同ID号的字符串资源。窗格的初始大小等于关联字符串的长度。,3、自定义状态栏窗格每个窗格指定一个ID号,同时还要创建一个,77,显示鼠标位置-插入窗格,static UINT indicators =,ID_SEPARATOR,IDS_MOUSEXY,ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,;,插入窗格的,ID,显示鼠标位置-插入窗格static UINT ind,78,显示鼠标位置-输出内容,映射WM_MOUSEMOVE到视图类,CString str;,CMainFrame* pFrame=(CMainFrame*),AfxGetApp()-m_pMainWnd;,CMFCStatusBar,* pStatus=,&pFrame-,m_wndStatusBar,;,if (pStatus),str.Format(X=%d, Y=%d,point.x, point.y);,pStatus-SetPaneText(1,str);,将该成员修改为,public,修饰,显示鼠标位置-输出内容映射WM_MOUSEMOVE到,79,CStatusBar:Create()函数,用于创建一个Windows状态栏(子窗口),并将其连接到CStatusBar对象上,同时设置初始字体和状态栏的高度。,该函数原型为:,BOOL Create(CWnd*pParentWnd,DWORD dwStyle=WS_CHILD|WS_VISIBLE|,CBRS_BOTTOM,UINT nID =,AFX_IDW_STATUS_BAR);,其中,参数pParentWnd,为指向父窗口CWnd对象的指针;,dwStyle,指定状态栏的风格,除了标准的Windows风格外,还可以是CBRS_TOP(状态栏位于框架窗口的顶部)、CBRS_BOTTOM(状态栏位于框架窗口的底部)、CBRS_NOALIGN(当父窗口改变时,状态栏不被重新定位);,参数nID,表示该状态栏的子窗口ID。如果函数调用成功,则返回一个非0值,否则返回0。,CStatusBar,常用成员,CStatusBar:Create()函数CStatus,80,SetIndIcators()函数,函数SetIndIcators()用于设置指示器的ID,并装入由每个ID指定的字符串资源,然后将指示器的文字设置为该字符串,该函数的原型为:,BOOL SetIndIcators(const UINT*lpIDArray,int nIDCount);,参数,lpIDArray,为指向ID数组的指针,,nIDCount,为lpIDArray所指向的数组元素的个数。该函数按照数组lpIDArray中的对应元素的值设定标识符ID的值,加载由每个ID所指定的字符串资源,并把字符串设置为标识符的文字。如果该函数操作成功,在返回一个非0值,否则返回0。,CStatusBar,常用成员,SetIndIcators()函数CStatusBar常用成,81,SetPaneInfo()函数,函数SetPaneInfo()用于设置给定索引值的指示器ID、风格和宽度。它的原型为:,void SetPaneInfo(int nIndex,UINT nID,UINT nStyle, int cxWidth);,该函数给标识符栏设置一个新的ID、风格和宽度。可供选择的标识符风格有:,CStatusBar,常用成员,SetPaneInfo()函数CStatusBar常用成员,82,SetPaneText()函数,函数SetPaneText()用于设置给定索引值的指示器的文本。它的原型为:,BOOL SetPaneText(int nIndex,LPCTSTR,lpszNewText,BOOL bUpdate=TRUE);,该函数用lpszNewText所指向的字符串来设置状态栏的文字。,CStatusBar,常用成员,SetPaneText()函数CStatusBar常用成员,83,2.5-2.7 MFC新功能,边演示边讲解,2.5-2.7 MFC新功能边演示边讲解,84,当前位置被访问的位置访问方法,文档视图,GetFirstViewPosition,GetNextView,文档模板,GetDocTemplate,视图文档,GetDocument,视图框架,GetParentFrame,框架视图,GetActiveView,框架文档,GetActiveDocument,MDI,主框架,MDI,子框架,MDIGetActive,MDI,子框架,MDI,主框架,GetParentFrame,任何位置应用程序,AfxGetApp,任何位置主框架,AfxGetMainWnd,Doc/View,结构的五个基本成员经常需要互相访问,假设某个视图想要获得文档,或某个框架需要获得活动视图,可以通过此表提供的方法进行解决,2.8 应用程序框架类对象分析,当前位置被访问的位置访问方法Doc/View结构的五个基,85,第2章-MFC应用程序课件,86,谢谢!,87,谢谢!87,88,88,
展开阅读全文