MFC应用程序课件_第1页
MFC应用程序课件_第2页
MFC应用程序课件_第3页
MFC应用程序课件_第4页
MFC应用程序课件_第5页
已阅读5页,还剩171页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

主要内容2.1用MFC向导生成应用程序2.2应用程序框架分析2.3文档与视图2.4工具栏和状态栏2.5-2.7MFC新功能2.8应用程序框架类对象分析主要内容2.1用MFC向导生成应用程序12.1用MFC向导生成应用程序用AppWizard应用程序向导生成MFC应用程序。单文档应用程序多文档应用程序对话框应用程序用ClassWizard工具生成派生类、定义处理消息、管理对话框、定制MFC成员函数。2.1用MFC向导生成应用程序用AppWizard应用程序22.1用MFC向导生成应用程序演示MFC向导生成常用的三种应用程序。2.1用MFC向导生成应用程序演示MFC向导生成常用的三种32.1.2生成的应用程序类型基于对话框的应用程序CWinApp、CDialog类2.1.2生成的应用程序类型基于对话框的应用程序42.1.2生成的应用程序类型单文档应用程序CWinApp、CFrameWnd、CView、CDocument2.1.2生成的应用程序类型单文档应用程序52.1.2生成的应用程序类型多文档应用程序CWinApp、CMDIFrameWnd、CMDIChildWnd、CView、CDocument2.1.2生成的应用程序类型多文档应用程序62.1.3向导生成工程文件简介头文件与实现文件各个类的*.h和*.cppResource.h:定义工程中所有资源标识符,给资源ID分配一个整数值。StdAfx.h和StdAfx.cpp:用于建立一个预编译的头文件。资源文件*.rc和*.rc2:是程序所使用的所有Windows资源的列表。*.ico:应用程序的图标所使用的图标文件。*Doc.ico:应用程序的文档图标文件。文档图标一般显示在多文档程序界面上。Toolbar.bmp:工具栏按钮的位图文件。2.1.3向导生成工程文件简介头文件与实现文件72.1.3向导生成工程文件简介解决方案文件和工程文件*.sln:保存当前解决方案所包含的工程的信息。*.vcxproj:包含当前工程的设置、工程中的文件等信息。2.1.3向导生成工程文件简介解决方案文件和工程文件8MFC应用程序框架结构类的继承关系:2.2应用程序框架分析MFC应用程序框架结构类的继承关系:2.2应用程序框架分92.2.1框架简介1.CObject类CObject是MFC类库的根类,它几乎描述了所有MFC类的一些公共特性,并且给所有由它派生出的类提供了3种重要特性,即:串行化支持、运行时类信息支持以及诊断和调试支持。2.CCmdTarget类命令类CCmdTarget是CObject的子类,它是MFC库中所有具有消息映射属性的类的公共基类。从CCmdTarget派生的类能在程序运行时动态创建对象和处理命令消息。

2.2.1框架简介1.CObject类103.CWinApp类CObjectCCmdTargetCWinThreadCWinApp应用程序类在类族中的位置WinMain函数的函数体的封装支持线程管理2.2.1框架简介

应用程序类CWinApp是CWinThread的子类,封装了初始化、运行、终止应用程序的代码。可以由此派生自己的应用类。3.CWinApp类CObjectCCmdTargetCW11指向框架窗口的指针m_pMainWnd2.2.1框架简介指向框架窗口的指针m_pMainWnd2.2.1框架简介12CWinApp类中定义了三个可以重写的虚函数:InitInstance()--程序创建和显示窗口。程序设计时,必须以CWinApp类为基类派生自己的应用程序类,并根据情况重写InitInstance()。Run(),处理消息循环。ExitInstance()程序结束时做收尾工作。2.2.1框架简介CWinApp类中定义了三个可以重写的虚函数:2.2.1134.文档模板类CDocTemplateCObjectCCmdTargetCDocTemplateCSingleDocTemplateCMultiDocTemplate单一的文档指针2.2.1框架简介4.文档模板类CDocTemplateCObjectCCm14文档类链表查阅CPtrList类2.2.1框架简介文档类链表查阅CPtrList类2.2.1框架简介15RUNTIME_CLASS分别创建了doc、view和窗口框架类的对象2.2.1框架简介RUNTIME_CLASS分别创建了doc、view和窗口框165.CFrameWnd类

CFrameWnd类是CWnd类的派生类。它是所有其他框架窗口类的基类,主要用来管理一个窗口。

CFrameWnd类的对象是一个框架窗口,包括边框、标题栏、菜单、最大化按钮、最小化按钮和一个激活的视图。CFrameWnd类支持单文档界面,对于多文档界面,使用它的两个派生类CMDIFrameWnd和CMDIChildWnd。CMDIFrameWnd类用于MDI的主窗口,CMDIChildWnd类用于MDI的子窗口。2.2.1框架简介5.CFrameWnd类2.2.1框架简介176.CView类视图类CView是CWnd类的子类。视图类及其派生类用于管理框架窗口的客户区。

7.CDocument类文档类CDocument负责装载和维护文档。文档包括应用程序的工作成果或环境设置数据等,可以是程序需要保存的任何内容。2.2.1框架简介6.CView类2.2.1框架简介18为应用程序框架提供客户区,承担用户数据的显示(同时替代窗口框架接收外界的输入。因此,该类是程序员编码最多的地方。派生关系与文档类的联系纽带用户区的绘制,注意:谁来触发1)自动重绘;2)手动视图更新2.2.1框架简介为应用程序框架提供客户区,承担用户数据的显示(同时替代窗口框19应用程序的文档类由CDocument派生Serialize()函数:文件操作时响应

ReaddatafromfileWritedatatofile序列化/串行化Serialization2.2.1框架简介应用程序的文档类由CDocument派生Serialize(20各对象之间的关系2.2.1框架简介各对象之间的关系2.2.1框架简介21CWinApptheApp;theApp.InitInstance系统应用程序对象文档模板文档对象窗口框架对象视图对象1.应用程序各对象的创建顺序2.2.2MFC应用程序运行流程CWinApptheApp;theApp.InitInst222.2.2MFC应用程序运行流程2.应用程序的执行过程启动:创建应用程序对象theApp、调用应用程序类的构造函数初始化对象theApp。应用程序框架调用MFC提供的AfxWinMain()主函数。AfxWinMain()主函数,首先通过调用全局函数AfxGetApp()来获取theApp的指针pApp;然后通过该指针调用theApp的成员函数InitInstance()来初始化应用程序。2.2.2MFC应用程序运行流程2.应用程序的执行过程23

在应用程序的初始化过程InitInstance中,同时还构造了文档模板,产生最初的文档、视图和主框架窗口,并生成工具栏和状态栏。2.2.2MFC应用程序运行流程当InitInstance()函数执行完毕后,AfxWinMain()函数将调用成员函数

Run(),进入消息处理循环;函数Run()收到WM_QUIT消息。MFC首先调用CWinApp类的成员函数ExitInstance();然后调用静态对象的析构函数;退出应用程序,将控制权交给操作系统。在应用程序的初始化过程InitInstance中,同24WinMain->AfxWinMain应用程序初始化消息循环C:\ProgramFiles\MicrosoftVisualStudio10.0\vc\atlmfc\src\winmain.cpp2.2.2MFC应用程序运行流程WinMain->AfxWinMain应用程序初始化消息252.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消息机制与消息循环302).控件消息控件消息是指控件或其他子窗口向父窗口发送的消息。与其他标准的Windows消息一样,控件消息也应该在视图类、窗口类中进行处理。但是,如果用户单击按钮控件时,发出的控件通知消息BN_CLICKED将作为命令消息来处理。2.2.4消息机制与消息循环2).控件消息2.2.4消息机制与消息循环313).命令消息命令消息是由菜单项、工具栏按钮、快捷键等用户界面对象发出的WM_COMMAND消息。命令消息与其他消息不同,它可被更广泛的对象如文档、文档模板、应用程序对象、窗口和视图等处理。3).命令消息322.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消息机制与消息循环34BEGIN_MESSAGE_MAP(MyClass,MybaseClass)//{{AFX_MSG_MAP(MyClass)//ClassWizard维护消息映射宏的标记

ON_... //MFC预定义消息映射宏

ON_MESSAGE(message,memberFun)//用户自定义消息映射宏

//}}AFX_MSG_MAPEND_MESSAGE_MAP()其中,MyClass是拥有消息映射的派生类名,MybaseClass是其基类名。2.2.4消息机制与消息循环BEGIN_MESSAGE_MAP(MyClass,Myb352.2.4消息机制与消息循环2.2.4消息机制与消息循环363自定义消息处理自定义消息处理:定义消息名、分配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语句直接定义自己的消息,如下所示:

#defineWM_HIDEWM_USER+3//自定义消息WM_USER

也可以调用窗口消息注册函数RegisterWindowMessage()来定义一个Windows消息,由系统分配消息一个整数值。该函数原型为:

UINTRegisterWindowMessage(LPCTSTRlpString);

其中参数lpString是要定义的消息名,调用成功后将返回该消息的ID值。2.2.4消息机制与消息循环常量WM_USER(为0x0400)与第382.2.4消息机制与消息循环自定义消息方法的步骤:1、:定义消息

#defineWM_HIDEWM_USER+101

2、在类头文件的AFX_MSG块中声明消息处理函数:

classCMainFrame:publicCFrameWnd{

protected:

//{{AFX_MSG(CMainFrame)

afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);

afx_msgvoidOnTimer(UINTnIDEvent);

afx_msgLRESULTOnHide(WPARAMwParam,LPARAMlParam);

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

2.2.4消息机制与消息循环自定义消息方法的步骤:392.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_MAP

END_MESSAGE_MAP()

2.2.4消息机制与消息循环3、在类的实现文件中,使用ON402.2.4消息机制与消息循环4、实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LRESULT。

LRESULTCMainFrame::OnHide(WPARAMwParam,LPARAMlParam){

MessageBox(_T("我的消息"));return0;

}

2.2.4消息机制与消息循环4、实现消息处理函数。该函数使412.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、在适当的时候发送自定义消息422.2.4消息机制与消息循环SendMessage函数原型LRESULTSendMessage(HWNDhWnd,UINTMsg,WPARAMwParam,LPARAMlParam)hWnd:其窗口程序将接收消息的窗口的句柄。Msg:指定被发送的消息号。wParam:指定附加的消息特定信息。lParam:指定附加的消息特定信息。返回值:返回值指定消息处理的结果,依赖于所发送的消息。2.2.4消息机制与消息循环SendMessage函数原432.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应用程序框架结构的基石,它482.3文档与视图文档负责数据读取、存取以及其它的操作。CDocument类本身只是一个空壳,我们需要从它派生一个数据自已的类,并在类中声明我们需要的变量,用以承载数据。CDocument类已经为我们做好了一些重要的函数,其中包括与View类的”沟通”函数、文档存取等函数。2.3文档与视图文档负责数据读取、存取以及其它的操作。49表主要的CDocument操作2.3文档与视图表主要的CDocument操作2.3文档与视图50表主要的CDocument可覆盖函数2.3文档与视图表主要的CDocument可覆盖函数2.3文档与视图51

用户可通过函数GetFirstViewPosition()和GetNextView()得到和文档关联的视图的指针,代码如下:POSITIONpos=GetFirstViewPosition();//得到视图列表头的位置While(pos!=NULL){CView*pView=GetNextView(pos); //获得视图列表中的视图指针

…}

2.3文档与视图用户可通过函数GetFirstViewPos522.3文档与视图视图类有两个用途:提供文档的可视化表示将用户输入(特别是鼠标和键盘消息)转换为操作文档数据的命令。MFC还包含了一组CView类的派生类,用来完成不同功能的视图。2.3文档与视图视图类有两个用途:53CEditView:简单的文本编辑器,类似NotepadCListView:基于列表的视图,类似文件夹浏览CTreeView:基于树状控件的视图,类似文件浏览左侧的树状结构CRichEditView:支持多种字体、OLE和RTF格式的高级编辑器CScrollView:支持滚动条的视图CFormView:窗体视图,支持在上边使用对话框控件CRecordView:连接到ODBC数据库的视图CDaoRecordView:连接到DAO数据库的视图CView的子类2.3文档与视图CEditView:简单的文本编辑器,类似NotepadCV542.3文档与视图一个文档可以具有与其联系的多个视图,而一个视图只能属于一个文档。CView类保存了m_pDocument数据成员,并将该指针提供给视图的GetDocument成员函数使用,用以标识出视图类所属的文档。AppWizard为视图类生成源代码时,它覆盖了基类的GetDocument函数。其强制转换了m_pDocument为派生类指针。2.3文档与视图一个文档可以具有与其联系的多个视图,而一个552.3文档与视图表主要的CView可覆盖函数2.3文档与视图表主要的CView可覆盖函数562.3文档与视图

OnInitialUpdate与OnUpdate在SDI中,视图与文档一样,只构造一次,重复使用。在SDI中,每当文档被打开或创建时,都要调用视图的OnInitialUpdate()OnInitialUpdate()默认要调用OnUpdate()OnUpdate()的默认操作是使视图客户区无效并执行重绘。在CView类的派生类中,如果重写了OnInitialUpdate(),需要要调用CView::OnInitialUpdate(),否则新文档被打开或创建时不会被更新。2.3文档与视图OnInitialUpdate与OnUp572.3文档与视图CView::OnDraw何时调用:在WM_PAINT到来时(当视窗显示区域的一部分显示内容或者全部变为「无效」,以致于必须「更新画面」时,将由这个讯息通知程式。)在文档被打印时什么是CDCDC:DeviceContext,设备描述表。在WM_PAINT到来时,DC指向屏幕设备在文档被打印时,DC指向打印机设备2.3文档与视图CView::OnDraw何时调用:582.3文档与视图OnPaint()与OnDrawWM_PAINT到来时会调用OnPaint()函数,此函数在CView中被定义。WM_PRINT到来时会调用OnPrint()函数,此函数在CView中被定义。两个函数都调用了OnDraw(),并传送不同的DC,分别代表屏幕设备与打印设备。2.3文档与视图OnPaint()与OnDraw592.4工具栏与状态栏2.4工具栏与状态栏602.4工具栏与状态栏工具栏简介工具栏对象是一种窗口,工具栏中的所有按钮的图形被存储在一个位图中,而该位图被定义在应用程序的资源文件中。工具栏按钮与菜单选项是类似的。单击工具栏按钮将产生相应的命令,应用程序通过提供消息处理函数来处理产生的命令。如果工具栏的某个按钮没有COMMAND或UPDATE_COMMAND_UI处理函数,那么框架自动使该按钮无效。工具栏和状态栏一般作为框架窗口类的成员变量声明,在创建框架窗口时自动创建它们,在销毁框架窗口时自动销毁所创建的控件栏对象。使用AppWizard创建应用程序基本框架时,可以得到初始的工具栏和状态栏。2.4工具栏与状态栏工具栏简介612.4.1工具栏系统默认生成的工具栏资源为IDR_MAINFRAME,可以在此基础上设计自己的工具栏,删除或添加一些按钮。需要为工具栏按钮提供ID号,一般取某个菜单项的ID。2.4.1工具栏系统默认生成的工具栏资源为IDR_MAIN622.4.1工具栏工具栏的创建:(1)创建工具栏资源(2)构造CToolBar对象,即在边框窗口类的声明中添加类似以下的声明:CToolBarm_wndToolBar;(3)调用Create或CreateEx创建工具栏,然后调用LoadToolBar装载工具栏资源。2.4.1工具栏工具栏的创建:63工具栏的创建intCMainFrame::OnCreate( LPCREATESTRUCTlpCreateStruct){ …… 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("Failedtocreatetoolbar\n"); return-1;//failtocreate }CToolBarm_wndToolBar;工具栏的创建intCMainFrame::OnCreate64工具栏的停靠intCMainFrame::OnCreate( LPCREATESTRUCTlpCreateStruct){ ……

m_wndToolBar.EnableDocking( CBRS_ALIGN_ANY);

EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar);}工具栏的停靠intCMainFrame::OnCreate65调用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_C66停靠方式CToolBar的EnableDocking:设置工具栏能停靠在何处?CBRS_ALIGN_ANYCBRS_ALIGN_TOP、CBRS_ALIGN_LEFTCBRS_ALIGN_RIGHT、CBRS_ALIGN_BOTTOMCMainFrame类的EnableDocking:设置能让工具栏停靠在何处?调用DockControlBar,完成工具栏停靠,具体效果由上面的两个EnableDocking共同决定。停靠方式CToolBar的EnableDocking:设置工672.4.1工具栏演示在系统提供的工具栏上添加并编辑新的工具栏按钮,产生消息响应。2.4.1工具栏演示在系统提供的工具栏上添加并编辑新的工具682.4.1工具栏创建新工具栏资源定义工具栏对象MainFrm.h中protected:

CStatusBarm_wndStatusBar;

CToolBarm_wndToolBar;

CToolBarm_wndTool1;系统的工具栏第二个工具栏2.4.1工具栏创建新工具栏资源系统的工具栏第二个工具栏69多工具栏实现-创建intCMainFrame::OnCreate(……){ ……

if(!m_wndToolBar.CreateEx(……)|| !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("Failedtocreatetoolbar\n"); return-1; } if(!m_wndTool1.CreateEx(……)|| !m_wndTool1.LoadToolBar(IDR_TOOL)) { TRACE0("Failedtocreatetoolbar\n"); return-1;//failtocreate }……多工具栏实现-创建intCMainFrame::OnCre70多工具栏实现-停靠intCMainFrame::OnCreate(……){ ……

m_wndToolBar.EnableDocking( CBRS_ALIGN_ANY);

m_wndTool1.EnableDocking( CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY);

DockControlBar(&m_wndToolBar); DockControlBar(&m_wndTool1); return0;}只需调用一次多工具栏实现-停靠intCMainFrame::OnCre71隐藏和显示工具栏ShowControlBar(&m_wndTool1,

true,false);ShowControlBar(&m_wndToolBar, false,false);true显示false隐藏是否立即显示,false立即显示隐藏和显示工具栏ShowControlBar(&m_wndT722.4.2状态栏状态栏可以显示与上下文有关的工具栏按钮和菜单项的帮助信息。在Windows中已经变的非常普遍。2.4.2状态栏状态栏可以显示与上下文有关的工具栏按钮和732.4.2状态栏

状态栏的定义用AppWizard创建的SDI或MDI应用程序框架中,有一个静态的indicator数组,它是在MainFrm.cpp文件中定义的,被MFC用作状态栏的定义。StaticUINTindicators[]={ID_SEPARATOR,ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,}indicators数组的定义2.4.2状态栏状态栏的定义StaticUINT742.4.2状态栏提示符从左到右水平排列在状态栏中,往数组中添加更多的标识符就可以在状态栏增加更多的提示符,可以根据需要动态改变提示符的大小,通过增加ID_SEPARATOR元素还可增加分隔符。最左边的提示符(位置0)通常用作消息区,可以在其中显示命令提示之类的文本字符串。创建状态栏创建状态栏的步骤:(1)构造CStatusBar对象。(2)调用Create创建状态栏并将其与CStatusBar对象联结。(3)调用成员函数SetIndicators,设置指示符的标识符为数组中相应元素指定的值,装载每个标识符指定的字符串资源并将字符串设为提示符文本。2.4.2状态栏提示符从左到右水平排列在状态栏中,往数组75状态栏的创建intCMainFrame::OnCreate( LPCREATESTRUCTlpCreateStruct){ …… if(!m_wndStatusBar.Create(this)|| !m_wndStatusBar.SetIndicators(indicators,

sizeof(indicators)/sizeof(UINT))) { TRACE0("Failedtocreatestatusbar\n"); return-1;//failtocreate }CStatusBarm_wndStatusBar;状态栏的创建intCMainFrame::OnCreate763、自定义状态栏窗格每个窗格指定一个ID号,同时还要创建一个相同ID号的字符串资源。窗格的初始大小等于关联字符串的长度。3、自定义状态栏窗格每个窗格指定一个ID号,同时还要创建一个77显示鼠标位置-----插入窗格staticUINTindicators[]={ ID_SEPARATOR,

IDS_MOUSEXY, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL,};插入窗格的ID显示鼠标位置-----插入窗格staticUINTind78显示鼠标位置-----输出内容映射WM_MOUSEMOVE到视图类 CStringstr;

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到79CStatusBar::Create()函数用于创建一个Windows状态栏(子窗口),并将其连接到CStatusBar对象上,同时设置初始字体和状态栏的高度。该函数原型为:

BOOLCreate(CWnd*pParentWnd,DWORDdwStyle=WS_CHILD|WS_VISIBLE|CBRS_BOTTOM,UINTnID=AFX_IDW_STATUS_BAR);其中参数pParentWnd为指向父窗口CWnd对象的指针;dwStyle指定状态栏的风格,除了标准的Windows风格外,还可以是CBRS_TOP(状态栏位于框架窗口的顶部)、CBRS_BOTTOM(状态栏位于框架窗口的底部)、CBRS_NOALIGN(当父窗口改变时,状态栏不被重新定位);参数nID表示该状态栏的子窗口ID。如果函数调用成功,则返回一个非0值,否则返回0。CStatusBar常用成员CStatusBar::Create()函数CStatus80SetIndIcators()函数函数SetIndIcators()用于设置指示器的ID,并装入由每个ID指定的字符串资源,然后将指示器的文字设置为该字符串,该函数的原型为:BOOLSetIndIcators(constUINT*lpIDArray,intnIDCount);参数lpIDArray为指向ID数组的指针,nIDCount为lpIDArray所指向的数组元素的个数。该函数按照数组lpIDArray中的对应元素的值设定标识符ID的值,加载由每个ID所指定的字符串资源,并把字符串设置为标识符的文字。如果该函数操作成功,在返回一个非0值,否则返回0。CStatusBar常用成员SetIndIcators()函数CStatusBar常用成81SetPaneInfo()函数函数SetPaneInfo()用于设置给定索引值的指示器ID、风格和宽度。它的原型为:voidSetPaneInfo(intnIndex,UINTnID,UINTnStyle,intcxWidth);该函数给标识符栏设置一个新的ID、风格和宽度。可供选择的标识符风格有:

CStatusBar常用成员SetPaneInfo()函数CStatusBar常用成员82SetPaneText()函数函数SetPaneText()用于设置给定索引值的指示器的文本。它的原型为:BOOLSetPaneText(intnIndex,LPCTSTRlpszNewText,BOOLbUpdate=TRUE);该函数用lpszNewText所指向的字符串来设置状态栏的文字。CStatusBar常用成员SetPaneText()函数CStatusBar常用成员832.5-2.7MFC新功能边演示边讲解2.5-2.7MFC新功能边演示边讲解84当前位置 被访问的位置 访问方法文档 视图 GetFirstViewPosition GetNextView文档 模板 GetDocTemplate视图 文档 GetDocument视图 框架 GetParentFrame框架 视图 GetActiveView框架 文档 GetActiveDocumentMDI主框架 MDI子框架 MDIGetActiveMDI子框架 MDI主框架 GetParentFrame任何位置 应用程序 AfxGetApp任何位置 主框架 AfxGetMainWndDoc/View结构的五个基本成员经常需要互相访问,假设某个视图想要获得文档,或某个框架需要获得活动视图,可以通过此表提供的方法进行解决

2.8应用程序框架类对象分析当前位置 被访问的位置 访问方法Doc/View结构的五个基85第2章MFC应用程序课件86谢谢!87谢谢!878888主要内容2.1用MFC向导生成应用程序2.2应用程序框架分析2.3文档与视图2.4工具栏和状态栏2.5-2.7MFC新功能2.8应用程序框架类对象分析主要内容2.1用MFC向导生成应用程序892.1用MFC向导生成应用程序用AppWizard应用程序向导生成MFC应用程序。单文档应用程序多文档应用程序对话框应用程序用ClassWizard工具生成派生类、定义处理消息、管理对话框、定制MFC成员函数。2.1用MFC向导生成应用程序用AppWizard应用程序902.1用MFC向导生成应用程序演示MFC向导生成常用的三种应用程序。2.1用MFC向导生成应用程序演示MFC向导生成常用的三种912.1.2生成的应用程序类型基于对话框的应用程序CWinApp、CDialog类2.1.2生成的应用程序类型基于对话框的应用程序922.1.2生成的应用程序类型单文档应用程序CWinApp、CFrameWnd、CView、CDocument2.1.2生成的应用程序类型单文档应用程序932.1.2生成的应用程序类型多文档应用程序CWinApp、CMDIFrameWnd、CMDIChildWnd、CView、CDocument2.1.2生成的应用程序类型多文档应用程序942.1.3向导生成工程文件简介头文件与实现文件各个类的*.h和*.cppResource.h:定义工程中所有资源标识符,给资源ID分配一个整数值。StdAfx.h和StdAfx.cpp:用于建立一个预编译的头文件。资源文件*.rc和*.rc2:是程序所使用的所有Windows资源的列表。*.ico:应用程序的图标所使用的图标文件。*Doc.ico:应用程序的文档图标文件。文档图标一般显示在多文档程序界面上。Toolbar.bmp:工具栏按钮的位图文件。2.1.3向导生成工程文件简介头文件与实现文件952.1.3向导生成工程文件简介解决方案文件和工程文件*.sln:保存当前解决方案所包含的工程的信息。*.vcxproj:包含当前工程的设置、工程中的文件等信息。2.1.3向导生成工程文件简介解决方案文件和工程文件96MFC应用程序框架结构类的继承关系:2.2应用程序框架分析MFC应用程序框架结构类的继承关系:2.2应用程序框架分972.2.1框架简介1.CObject类CObject是MFC类库的根类,它几乎描述了所有MFC类的一些公共特性,并且给所有由它派生出的类提供了3种重要特性,即:串行化支持、运行时类信息支持以及诊断和调试支持。2.CCmdTarget类命令类CCmdTarget是CObject的子类,它是MFC库中所有具有消息映射属性的类的公共基类。从CCmdTarget派生的类能在程序运行时动态创建对象和处理命令消息。

2.2.1框架简介1.CObject类983.CWinApp类CObjectCCmdTargetCWinThreadCWinApp应用程序类在类族中的位置WinMain函数的函数体的封装支持线程管理2.2.1框架简介

应用程序类CWinApp是CWinThread的子类,封装了初始化、运行、终止应用程序的代码。可以由此派生自己的应用类。3.CWinApp类CObjectCCmdTargetCW99指向框架窗口的指针m_pMainWnd2.2.1框架简介指向框架窗口的指针m_pMainWnd2.2.1框架简介100CWinApp类中定义了三个可以重写的虚函数:InitInstance()--程序创建和显示窗口。程序设计时,必须以CWinApp类为基类派生自己的应用程序类,并根据情况重写InitInstance()。Run(),处理消息循环。ExitInstance()程序结束时做收尾工作。2.2.1框架简介CWinApp类中定义了三个可以重写的虚函数:2.2.11014.文档模板类CDocTemplateCObjectCCmdTargetCDocTemplateCSingleDocTemplateCMultiDocTemplate单一的文档指针2.2.1框架简介4.文档模板类CDocTemplateCObjectCCm102文档类链表查阅CPtrList类2.2.1框架简介文档类链表查阅CPtrList类2.2.1框架简介103RUNTIME_CLASS分别创建了doc、view和窗口框架类的对象2.2.1框架简介RUNTIME_CLASS分别创建了doc、view和窗口框1045.CFrameWnd类

CFrameWnd类是CWnd类的派生类。它是所有其他框架窗口类的基类,主要用来管理一个窗口。

CFrameWnd类的对象是一个框架窗口,包括边框、标题栏、菜单、最大化按钮、最小化按钮和一个激活的视图。CFrameWnd类支持单文档界面,对于多文档界面,使用它的两个派生类CMDIFrameWnd和CMDIChildWnd。CMDIFrameWnd类用于MDI的主窗口,CMDIChildWnd类用于MDI的子窗口。2.2.1框架简介5.CFrameWnd类2.2.1框架简介1056.CView类视图类CView是CWnd类的子类。视图类及其派生类用于管理框架窗口的客户区。

7.CDocument类文档类CDocument负责装载和维护文档。文档包括应用程序的工作成果或环境设置数据等,可以是程序需要保存的任何内容。2.2.1框架简介6.CView类2.2.1框架简介106为应用程序框架提供客户区,承担用户数据的显示(同时替代窗口框架接收外界的输入。因此,该类是程序员编码最多的地方。派生关系与文档类的联系纽带用户区的绘制,注意:谁来触发1)自动重绘;2)手动视图更新2.2.1框架简介为应用程序框架提供客户区,承担用户数据的显示(同时替代窗口框107应用程序的文档类由CDocument派生Serialize()函数:文件操作时响应

ReaddatafromfileWritedatatofile序列化/串行化Serialization2.2.1框架简介应用程序的文档类由CDocument派生Serialize(108各对象之间的关系2.2.1框架简介各对象之间的关系2.2.1框架简介109CWinApptheApp;theApp.InitInstance系统应用程序对象文档模板文档对象窗口框架对象视图对象1.应用程序各对象的创建顺序2.2.2MFC应用程序运行流程CWinApptheApp;theApp.InitInst1102.2.2MFC应用程序运行流程2.应用程序的执行过程启动:创建应用程序对象theApp、调用应用程序类的构造函数初始化对象theApp。应用程序框架调用MFC提供的AfxWinMain()主函数。AfxWinMain()主函数,首先通过调用全局函数AfxGetApp()来获取theApp的指针pApp;然后通过该指针调用theApp的成员函数InitInstance()来初始化应用程序。2.2.2MFC应用程序运行流程2.应用程序的执行过程111

在应用程序的初始化过程InitInstance中,同时还构造了文档模板,产生最初的文档、视图和主框架窗口,并生成工具栏和状态栏。2.2.2MFC应用程序运行流程当InitInstance()函数执行完毕后,AfxWinMain()函数将调用成员函数

Run(),进入消息处理循环;函数Run()收到WM_QUIT消息。MFC首先调用CWinApp类的成员函数ExitInstance();然后调用静态对象的析构函数;退出应用程序,将控制权交给操作系统。在应用程序的初始化过程InitInstance中,同112WinMain->AfxWinMain应用程序初始化消息循环C:\ProgramFiles\MicrosoftVisualStudio10.0\vc\atlmfc\src\winmain.cpp2.2.2MFC应用程序运行流程WinMain->AfxWinMain应用程序初始化消息1132.2.3应用程序窗口重叠窗口弹出窗口子窗口2.2.3应用程序窗口重叠窗口114

Windows消息主要有3种类型:标准Windows消息、控件消息和命令消息。1).标准Windows消息除WM_COMMAND以外,所有以“WM_”为前缀的消息都是标准Windows消息;由窗口类或视图类处理;都有默认的处理函数,它们在CWnd类中进行了预定义。1.消息的类别及其描述2.2.4消息机制与消息循环Windows消息主要有3种类型:标准Windows消115标准的Windows消息又分为3类:键盘消息、鼠标消息和窗口消息。(1)键盘消息键盘消息与键盘某个键的动作相关联。常见的键盘消息有以下几种。WM_KEYDOWN、WM_KEYUP:按下、释放键产生的消息。WM_CHAR:输入字符时产生的消息。2.2.4消息机制与消息循环标准的Windows消息又分为3类:2.2.4消息机制与消116(2)鼠标消息鼠标消息涉及到鼠标的单击、双击、拖动等。常用的鼠标消息有以下几种。

WM_MOUSEMOVE:鼠标移动时产生的消息。

WM_RBUTTONDOWN:鼠标右键按下时产生的消息。

WM_LBUTTONDOWN:鼠标左键按下时产生的消息。

WM_LBUTTONDBLCLICK:鼠标双击时产生的消息。2.2.4消息机制与消息循环(2)鼠标消息2.2.4消息机制与消息循环117(3)窗口消息窗口消息一般与创建窗口、绘制窗口、移动窗口和销毁窗口等动作有关。在MFC应用程序中,窗口消息是由视图类、窗口类及它们的派生类处理的。2.2.4消息机制与消息循环(3)窗口消息2.2.4消息机制与消息循环1182).控件消息控件消息是指控件或其他子窗口向父窗口发送的消息。与其他标准的Windows消息一样,控件消息也应该在视图类、窗口类中进行处理。但是,如果用户单击按钮控件时,发出的控件通知消息BN_CLICKED将作为命令消息来处理。2.2.4消息机制与消息循环2).控件消息2.2.4消息机制与消息循环1193).命令消息命令消息是由菜单项、工具栏按钮、快捷键等用户界面对象发出的WM_COMMAND消息。命令消息与其他消息不同,它可被更广泛的对象如文档、文档模板、应用程序对象、窗口和视图等处理。3).命令消息1202.MFC消息映射机制MFC采用消息映射来处理消息;消息映射机制包括一组消息映射宏,用于把一个Windows消息和其消息处理函数联系起来。所有从CCmdTarget类派生出来的类都能够拥有自己的消息映射。与MFC消息映射机制有关的宏有以下3个:DECLARE_MESSAGE_MAP()BEGIN_MESSAGE_MAP(MyClass,MybaseClass)END_MESSAGE_MAP()2.2.4消息机制与消息循环2.MFC消息映射机制MFC采用消息映射来处理消息;121为了使用消息映射宏:首先在类定义的结尾用DECLARE_MESSAGE_MAP()宏来声明使用消息映射,该宏表示在为各个处理函数所写的类声明之后存在消息映射条目,这些函数是该类的成员函数。然后在类的实现源文件中用BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()宏来定义消息映射。MFC应用程序MESSAG_MAP消息映射的形式如下:2.2.4消息机制与消息循环为了使用消息映射宏:2.2.4消息机制与消息循环122BEGIN_MESSAGE_MAP(MyClass,MybaseClass)//{{AFX_MSG_MAP(MyClass)//ClassWizard维护消息映射宏的标记

ON_... //MFC预定义消息映射宏

ON_MESSAGE(message,memberFun)//用户自定义消息映射宏

//}}AFX_MSG_MAPEND_MESSAGE_MAP()其中,MyClass是拥有消息映射的派生类名,MybaseClass是其基类名。2.2.4消息机制与消息循环BEGIN_MESSAGE_MAP(MyClass,Myb1232.2.4消息机制与消息循环2.2.4消息机制与消息循环1243自定义消息处理自定义消息处理:定义消息名、分配ID值及完成消息映射。Windows将所有的消息值分为4段:0x0000~0x03FF段:用于Windows系统消息0x0400~0x7FFF段:用于用户自定义的窗口消息0x8000~0xBFFF段:为Windows保留值0xC000~0xFFFF段:用于应用程序的字符串消息。2.2.4消息机制与消息循环3自定义消息处理自定义消息处理:定义消息名、分配ID值125

常量WM_USER(为0x0400)与第一个自定义消息值相对应,用户必须为自己的消息定义相对于WM_USER的偏移值,利用#define语句直接定义自己的消息,如下所示:

#defineWM_HIDEWM_USER+3//自定义消息WM_USER

也可以调用窗口消息注册函数RegisterWindowMessage()来定义一个Windows消息,由系统分配消息一个整数值。该函数原型为:

UINTRegisterWindowMessage(LPCTSTRlpString);

其中参数lpString是要定义的消息名,调用成功后将返回该消息的ID值。2.2.4消息机制与消息循环常量WM_USER(为0x0400)与第1262.2.4消息机制与消息循环自定义消息方法的步骤:1、:定义消息

#defineWM_HIDEWM_USER+101

2、在类头文件的AFX_MSG块中声明消息处理函数:

classCMainFrame:publicCFrameWnd{

protected:

//{{AFX_MSG(CMainFrame)

afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);

afx_msgvoidOnTimer(UINTnIDEvent);

afx_msgLRESULTOnHide(WPARAMwParam,LPARAMlParam);

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

2.2.4消息机制与消息循环自定义消息方法的步骤:1272.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_MAP

END_MESSAGE_MAP()

2.2.4消息机制与消息循环3、在类的实现文件中,使用ON1282.2.4消息机制与消息循环4、实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LRESULT。

LRESULTCMainFrame::OnHide(WPARAMwParam,LPARAMlParam){

MessageBox(_T("我的消息"));return0;

}

2.2.4消息机制与消息循环4、实现消息处理函数。该函数使1292.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、在适当的时候发送自定义消息1302.2.4消息机制与消息循环SendMessage函数原型LRESULTSendMessage(HWNDhWnd,UINTMsg,WPARAMwParam,LPARAMlParam)hWnd:其窗口程序将接收消息的窗口的句柄。Msg:指定被发送的消息号。wParam:指定附加的消息特定信息。lParam:指定附加的消息特定信息。返回值:返回值指定消息处理的结果,依赖于所发送的消息。2.2.4消息机制与消息循环SendMessage函数原1312.2.4消息机制与消息循环演示并编写一个自定义消息应用程序,添加WM_PROGRESS消息。当程序运行时,则调用自定义消息处理函数,输出文本“自定义消息处理函数被调用!”。2.2.4消息机制与消息循环演示并编写一个自定义消息应用程132消息传递标准Windows消息传递直线上溯命令消息传递迂回上溯消息传递标准Windows消息传递133第2章MFC应用程序课件134消息传递对于WM_COMMAND消息。框架窗口实际上是大多数WM_COMMAND消息的接受者,但WM_COMMAND消息还可以在视图、文档,甚至应用程序类中被处理。消息传递对于WM_COMMAND消息。框架窗口实际上是大多数135

文档/视图体系结构是MFC应用程序框架结构的基石,它定义了一种程序结构,这种结构利用文档对象保存应用程序的数据,依靠视图对象控制视图显示数据,文档与视图的关系是一对多的关系,也就是说,文档中的数据可以以不同的方式显示。2.3文档与视图文档/视图体系结构是MFC应用程序框架结构的基石,它1362.3文档与视图文档负责数据读取、存取以及其它的操作。CDocument类本身只是一个空壳,我们需要从它派生一个数据自已的类,并在类中声明我们需要的变量,用以承载数据。CDocument类已经为我们做好了一些重要的函数,其中包括与View类的”沟通”函数、文档存取等函数。2.3文档与视图文档负责数据读取、存取以及其它的操作。137表主要的CDocument操作2.3文档与视图表主要的CDocument操作2.3文档与视图138表主要的CDocument可覆盖函数2.3文档与视图表主要的CDocument可覆盖函数2.3文档与视图139

用户可通过函数GetFirstViewPosition()和GetNextView()得到和文档关联的视图的指针,代码如下:POSITIONpos=GetFirstViewPosition();//得到视图列表头的位置While(pos!=NULL){CView*pView=GetNextView(pos); //获得视图列表中的视图指针

…}

2.3文档与视图用户可通过函数GetFirstViewPos1402.3文档与视图视图类有两个用途:提供文档的可视化表示将用户输入(特别是鼠标和键盘消息)转换为操作文档数据的命令。MFC还包含了一组CView类的派生类,用来完成不同功能的视图。2.3文档与视图视图类有两个用途:141CEditView:简单的文本编辑器,类似NotepadCListView:基于列表的视图,类似文件夹浏览CTreeView:基于树状控件的视图,类似文件浏览左侧的树状结构CRichEditView:支持多种字体、OLE和RTF格式的高级编辑器CScrollView:支持滚动条的视图CFormView:窗体视图,支持在上边使用对话框控件CRecordView:连接到ODBC数据库的视图CDaoRecordView:连接到DAO数据库的视图CView的子类2.3文档与视图CEditView:简单的文本编辑器,类似NotepadCV1422.3文档与视图一个文档可以具有与其联系的多个视图,而一个视图只能属于一个文档。CView类保存了m_pDocument数据成员,并将该指针提供给视图的GetDocument成员函数使用,用以标识出视图类所属的文档。AppWizard为视图类生成源代码时,它覆盖了基类的GetDocument函数。其强制转换了m_pDocument为派生类指针。2.3文档与视图一个文档可以具有与其联系的多个视图,而一个1432.3文档与视图表主要的CView可覆盖函数2.3文档与视图表主要的CView可覆盖函数1442.3文档与视图

OnInitialUpdate与OnUpdate在SDI中,视图与文档一样,只构造一次,重复使用。在SDI中,每当文档被打开或创建时,都要调用视图的OnInitialUpdate()OnInitialUpdate()默认要调用OnUpdate()OnUpdate()的默认操作是使视图客户区无效并执行重绘。在CView类的派生类中,如果重写了OnInitialUpdate(),需要要调用CView::OnInitialUpdate(),否则新文档被打开或创建时不会被更新。2.3文档与视图OnInitialUpdate与OnUp1452.3文档与视图CView::OnDraw何时调用:在WM_PAINT到来时(当视窗显示区域的一部分显示内容或者全部变为「无效」,以致于必须「更新画面」时,将由这个讯息通知程式。)在文档被打印时什么是CDCDC:DeviceContext,设备描述表。在WM_PAINT到来时,DC指向屏幕设备在文档被打印时,DC指向打印机设备2.3文档与视图CView::OnDraw何时调用:1462.3文档与视图OnPaint()与OnDrawWM_PAINT到来时会调用OnPaint()函数,此函数在CView中被定义。WM_PRINT到来时会调用OnPrint()函数,此函数在CView中被定义。两个函数都调用了OnDraw(),并传送不同的DC,分别代表屏幕设备与打印设备。2.3文档与视图OnPaint()与OnDraw1472.4工具栏与状态栏2.4工具栏与状态栏1482.4工具栏与状态栏工具栏简介工具栏对象是一种窗口,工具栏中

温馨提示

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

评论

0/150

提交评论