180 likes | 334 Views
MFC 应用程序设计. 王建兴. MFC 应用程序运行机制. 一个基于 MFC 的应用程序由四个对象相互作用构成。. 1 、应用程序对象:表示整个程序 (基类为 CWinApp). 2 、窗口框架对象应用程序对象:表示整个窗体。 (基类为 CWnd CFrameWnd. 3 、视图对象:表示可视区域,一般是程序操作的区域。 (基类为 CWnd CView 等). 4 、文档对象:用于与视图对象等交换数据。基类为 CDocument. 应用程序类的主要内容. 创建全局对象 theApp 。用于获得程序的控制权
E N D
MFC应用程序设计 王建兴
MFC应用程序运行机制 一个基于MFC的应用程序由四个对象相互作用构成。 1、应用程序对象:表示整个程序 (基类为CWinApp) 2、窗口框架对象应用程序对象:表示整个窗体。 (基类为CWnd CFrameWnd 3、视图对象:表示可视区域,一般是程序操作的区域。 (基类为CWnd CView等) 4、文档对象:用于与视图对象等交换数据。基类为CDocument
应用程序类的主要内容 • 创建全局对象theApp。用于获得程序的控制权 • 使用InitInstance()用于初始化工作。包括创建文档模板、文档、视图、窗口等工作。详见程序代码。 • 在Run()函数中进入消息循环。
主框架类的主要内容 • PreCreateWindow()函数用于处理主窗口创建之前的初始化工作。 • OnCreate()函数用于窗口创建的工作。是系统发出WM_CREATE消息时的处理函数。 • 定义了工具栏对象和状态栏对象 CStatusBar m_wndStatusBar; CToolBar m_wndToolBar; • CToolBar::LoadToolBar()函数用于装载工具栏资源 CToolBar::CreateEx()函数负责工具栏的创建。 • CStatusBar::Create()函数负责状态栏的创建 CStatusBar::SetIndicators()函数负责设置状态栏上的窗格 窗格定义数组为indicators数组。
视图类的主要内容 • GetDocument()方法得到所要显示的文档类内容对象的指针。 • OnDraw()是WM_PAINT默认处理函数,用于打印、预览、屏幕输出等操作。 • OnUpdate()函数用于当文档对象内容变化后的更新显示。
文档类的主要内容 • OnNewDocument()函数用于初始化一个文档 • Serialize()函数用于文档序列化 • UpdateAllView()用于更新对文档类对象关联的所有视图 • SetModifiedFlag()函数用于设置文档内容是否发生变化。 • IsModified()函数用于判定文档内容是否已变化 • 其它
3.4消息映射--3.4.1消息的类别及其描述 • 在MFC应用程序中,消息分为窗口消息、命令消息和控件消息三种类型。 • 1.窗口消息 • 系统可以产生窗口消息,与窗口交互也能产生窗口消息。窗口消息只能被窗口或者窗口对象处理。在MFC应用程序中,CView和CFrame及其派生类、自定义窗口类能够处理窗口消息。 • 窗口消息的字段格式为: (1)message WM_XXX (2)wParam和lParam随WM XXX而变 要关闭一个窗口,只需要发给它消息包(WM_CLOSE,0L,0L)即可。
3.4.1消息的类别及其描述 • 2.命令消息 • 选择菜单项、单击工具按钮、按加速键及程序中的命令等都可以产生命令消息。在MFC应用程序中,凡是从基类CCmdTarget派生的类都能处理命令消息。 • 命令消息的字段格式如下: (1)message WM_COMMAND (2)wParam 低16位为命令ID,高16位为0 (3)1Param 0L
3.4.1消息的类别及其描述 • 3.控件消息 • 当控件事件发生时,如改变文本框控件的内容、选择列表框控件中的某一选项等,都会产生控件消息。 • 控件消息的字段格式如下: (1)message CONTROL CONTROL表示一个包含通知码前缀的名称,其实质仍然是向包含的窗口发送WM_COMMAND消息。 (2)wParam 底16位为控件ID,高16位为控件通知码 (3)1Param 控件窗口句柄
3.4.1消息的类别及其描述 • 常用控件的控件通知码前缀: ·BN——表示按钮控件消息。 ·CB——表示组合框控件消息。 ·DM——表示默认下压式按钮控件消息。 ·EN——表示编辑控件消息。 ·LB——表示列表框控件消息。 ·SBM——表示滚动条控件消息。
3.4.2消息处理机制 • 消息处理机制包含 : • 声明消息的映射 在类的定义文件(*.h文件)中添加消息处理函数的声明,一般形式为: Afx_msg void ClassMethod(); 另外,一个DECLARE_MESSAGE_MAP()宏,主要工作是到消息映射表中收集和处理消息的消息映射项。
3.4.2消息处理机制 • 消息处理机制包含 : 2.定义消息的映射 在类的实现文件(.cpp文件)中,向消息映射表中加入与定义文件中消息处理函数声明相对应的映射宏。 BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd) ON_WM_CREATE() ON_COMMAND(ID_EDIT_COPY, OnEditCopy) ON_WM_CLOSE() END_MESSAGE_MAP()
3.4.2消息处理机制 • 消息映射表中加入消息映射项的宏也可以分为4类,分别是:窗口消息映射项、命令消息映射项、控件通知消息映射项和用户交互对象更新消息映射项。 • 1)窗口消息映射项:ON_WM_XXX() 除WM_COMMAND消息之外,例如WM_PAINT、WM_MOUSEMOVE等消息 • 2)命令消息映射项 ON_COMMAND(ID,ClassMethod) • 3)控件通知消息映射项 通用控件消息映射项的格式: ON_CONTROL(wNotifyCode,ID,ClassMethod)
3.4.2消息处理机制 • 3)控件通知消息映射项 常用控件的控件通知消息映射项: ON_BN_EVENT(ID,ClassMethod) //BN为按钮控件通知码 ON_CBN_EVENT(ID,C1assMethod) //CBN为组合框控件通知码 ON_EN_EVENT(ID,C1assMethod) //EN为编辑控件通知码 ON_LBN_EVENT(ID,C1assMethod) //LBN为列表框控件通知码 • 4)用户交互对象更新消息映射项 ON_UPDATE_COMMAND_UI(ID,ClassMethod)
3.4.2消息处理机制 • 添加自定义消息 (1)定义自己的消息名 define WM_MYMESSAGE (WM_USER+1) (2)添加消息映射 BEGIN_MESSAGE_MAP(CMyWnd,CMyParentWndClass) ON_MESSAGE (WM_MYMESSAGE,OnMyMessage) END_MESSAGE_MAP() • 添加自定义消息 (3)在类的.h文件中加入消息处理函数的原型声明如下: afx_msg LRESULT OnMyMessage(WPARAM,LPARAM); (4)在类的.cpp文件中编辑对应消息的处理函数
3.4.3消息的发送 • Windows提供了三个API函数用于发送消息,这三个函数是:SendMessage、PostMessage和SendDlgItemMessage。
3.4.4消息的传递 • 命令消息只要是从基类CCmdTarget派生的类都能处理,而窗口消息只能被窗口类或视图类处理。 • 单文档应用程序中对象处理命令的优先级: 视图一>文档一>主框架一>应用程序 • 多文档应用程序中对象处理命令的优先级: 视图一>文档一>子框架一>主框架一>应用程序