资源预览内容
第1页 / 共136页
第2页 / 共136页
第3页 / 共136页
第4页 / 共136页
第5页 / 共136页
第6页 / 共136页
第7页 / 共136页
第8页 / 共136页
第9页 / 共136页
第10页 / 共136页
亲,该文档总共136页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第四章 装饰应用程序的外观,创建友好, 美观的用户界面是成功设计和编制一个 Windows 应 用程序的重要组成部分,程序用户界面的设计编程工作包括菜单、控制栏( 其中包括工具栏、状态栏、对话框栏等) 创建和控制、对话框、帮助信息的制作和运行,以及框架、视图窗口的位置和大小控制等。其中对话框的制作和运行操作将在下一 章中作详细的描述。 在 AppWizard 创建的应用程序框架中,菜单,工具栏, 状态栏 和视图窗口均可以缺省隶属于主框架窗口,并由主框架窗口管 理和控制。一个典型主框架窗口的组成以及与用户界面各个组 成部分的关系如下图所示:, SDI 应用程序框架,标题栏,菜单栏,工具栏窗口,状态栏窗口,视图窗口, MDI 应用程序框架,标题栏,菜单栏,工具栏窗口,状态栏窗口,标题栏,视图窗口,工具栏和状态栏分别由 CToolBar 和 CStatusBar 类描述, 它们都是控制栏类 CControlBar 的派生类,而 CControlBar又是 CWnd 的派生类,因此,工具栏和状态栏本身也是一个能响 应消息的特定窗口,在主框架窗口中可以视为是子窗口。,CObject,菜单是由 CMenu 类描述, 它是直接从 CObject 类派生的,因此该类的对象只能用于完 成菜单的创建、跟踪、修改、销毁和发送命令消息,而本身 不能响应消息;在主框架窗中可以视为用于发送命令消息的 一个特定区域。,CObject,主框架窗口是由 CFrameWnd(用于 SDI)或 CMDIFrameWnd 和 CMDIChildWnd(用于 MDI),它们都是 CWnd 的直接或间接派 生类。,CObject,由 AppWizard 创建的文档视图结构的应用程序主框架窗口类 对象中缺省的工具栏被定义成名为 m_wndToolBar 的 CToolBar 类 对象成员,而状态栏被定义成名为 m_wndStatusBar 的 CStatusBar 类对象成员 。创建和显示工具栏和状态栏的操作应在程序主框 架窗类 CMainFrame 对象所关联的窗口已经创建完成(窗口句柄已有效) 但还未显示时进行,即在窗口创建消息 WM_CREATE 的响应成员函数 OnCreate 被调用中完成的。因此,需要在 CMainFrame 类中重新定义 OnCreate 函数,以便在主框架窗口显 示之前添加任何需要附加的初始化工作,例如创建和显示工具 栏和状态栏、创建其他子窗口等。,与其它 Windows 资源所对应的 MFC 类一样,CMenu 类也是将菜 单的句柄和属性和对菜单属性的各种操作等封装了起来,并且 只有当菜单句柄有效时,对菜单属性的操作才是合法的。通常 情况下,菜单总是主框架窗口的一个区域,所以当主框架窗口 的产生函数或 LoadFrame 函数被调用时,与菜单资源相关联的 CMenu 对象作为框架窗口的保护成员被创建。 因此,通常情况下,编程者只需要通过设计菜单的静态资 源,而且无须通过 CMenu 类对象的调用对象的行为,就能满足 程序对主菜单的一般设计编程需求。但在程序需要动态创建新 菜单或修改已有菜单时,则必须调用 CMenu 对象的行为。,如果你需要修改主框架窗口的菜单,你可能需要通过窗口类 CWnd 的成员函数 GetMenu 获取保护成员 CMenu 对象的指针, 并通过该指针对该菜单对象进行各种需要的访问和操作,以便 满足特殊的菜单设计编程需求,例如: 动态切换不同菜单; 动态隐藏和显示菜单; 动态添加和删除菜单项; 动态禁止和激活菜单项; 动态为菜单项添加图形标签; 动态创建浮动的弹出式环境菜单。,对框架和视图窗口的外观操作,就是对它们的位置、大小、状 态的控制,称之为放置(Placement)操作。视图窗口是包含在 框架窗口中的,它随着框架窗口的变化而变化,换句话说,对 视图窗口的放置操作是通过对框架窗口的放置操作实现的。虽 然用户可以方便地通过框架窗口提供的最大化、最小化等窗口 操作界面对框架和视图窗口的放置进行动态交互控制,但在不 少情况下,还是需要在程序中通过代码对框架和视图窗口的放 置进行定制操作。例如,希望程序在运行开始时能保持最近一 次运行的框架和视图窗口的位置、大小、状态。实现这些放置 操作是窗口创建过程中完成的,这对于 SDI 和 MDI 应用程序是 不完全一样的,对于 MDI ,不仅要考虑主框架窗口的放置,还 要考虑子框架窗口的放置。,本章将通过 5 类实例程序分别讲述如何实现上述外观设计: 第 1 类实例讲解工具栏和状态栏编程; 第 2 类实例讲解 CDialogBar 编程; 第 3 类实例讲解 CReBar 编程; 第 4 类实例讲解菜单编程; 第 5 类实例讲解具有持续特性的定制框架窗口类编程。,4.1 创建浮动工具栏 4.1.1 利用 AppWizard 自动创建工具栏 在 MFC 中,工具栏资源和工具栏类 CToolBar 是实现工具栏的 两个要素。创建工具栏对象的基本步骤为: 创建工具栏资源; 创建一个 CToolBar 对象; 调用 CToolBar:Create 函数创建工具栏窗口; 调用 CToolBar:LoadToolBar 载入工具栏资源。,在使用 AppWizard 生成的默认配置的应用程序框架中包括了 能创建一个缺省工具栏的四步操作的所有代码,因此修改工具 栏中的按钮只需要修改缺省工具栏资源就可以实现。而如果需 要创建缺省工具栏以外的工具栏,则必须在 AppWizard 生成的框 架基础上,效仿上述缺省资源和代码添加相应的自定义资源和 代码。为此,分析创建缺省工具栏的代码是十分必要的。 创建一个 SDI 应用程序项目 “Default” (使用 AppWizard 的缺 省选择),查询所创建的应用程序框架的代码,可以发现与工 具栏有关的资源和代码有:,1 在资源中添加了工具栏资源 IDR_MAINFRAME : 2 在 CMainWnd 的定义中添加了定义工具栏对象成员的代码: CToolBar m_wndToolBar; 3 在重新定义的 CMainWnd:OnCreate 中添加了创建工具栏, 装 载工具资源和初始化工具栏的缺省代码。 分析 CMainWnd:OnCreate ,该虚函数首先调用了基类中定义 的版本 CFrameWnd:OnCreate 进行基类部分的初始化工作, 然后可以添加主框架窗口所需要的任何初始化代码,其中包 括了对工具栏的创建和初始化操作:, 创建工具栏窗口 创建工具栏窗口的函数是 CToolBar:Create 或CToolBar:CreateEx 它们的原型分别为: BOOL Create( CWnd *pParentWnd,/ 父窗口指针 DWORD dwStyle = WS_CHILD| WS_VISIBLE|CBRS_TOP, / 风格 UINT nID=AFX_IDW_TOOLBAR/* 工具栏子窗口 ID */ ); BOOL CreateEx(CWnd* pParentWnd,/父窗口指针 DWORD dwCtrlStyle = TBSTYLE_FLAT,/ 工具栏控件风格 DWORD dwStyle = WS_CHILD| WS_VISIBLE|CBRS_ALIGN_TOP, CRect rcBorders=CRect(0,0,0,0),/ 工具栏的矩形边界 UINT nID=AFX_IDW_TOOLBAR/* 工具栏子窗口 ID */ );,其中: pParentWnd 是指向工具栏的父窗口,即主框架窗口对象的 指针。 dwCtrlStyle 和 dwStyle 的设置是决定所创建的工具栏的外观 和状态的重要因素,可设置的样式值包括 CWnd 的样式和 CToolBar 的样式两部分(祥见 MSDN 的有关部分)。 如果创建成功,返回真实的;否则返回错误的。 例如,在本例中实现创建工具栏窗口的缺省代码为: m_wndToolBar.CreateEx( this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE| CBRS_TOP|CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY|CBRS_SIZE_DYNAMIC ); 注意,该调用中第 4 参数 rcBorders 和第 5 参数 nID 使用了缺省 值 CRect(0,0,0,0) 和 AFX_IDW_TOOLBAR 。, 加载工具栏资源 为工具栏对象加载资源的函数为 CToolBar:LoadToolBar ,其 原型为: BOOL LoadToolBar ( LPCTSTR lpszResourceName /*资源名 */ ); BOOL LoadToolBar ( UINT nIDResource /* 资源 ID */ ); 本例中实现加载工具栏资源的代码为: m_wndToolBar.LoadToolBar ( IDR_MAINFRAME ); IDR_MAINFRAME 是工具栏资源的 ID 。如果资源加载成功,则 返回 TRUE 的;否则返回 FALSE 的。, 设置工具栏停靠特性 实现设置的函数为 CControlBar:EnableDocking ,其原型为: void EnableDocking ( DWORD dwStyle ); 参数为停靠样式,种类和取值参考 MSDN 中的相关部分。 本例中实现设置的代码为: m_wndToolBar.EnableDocking ( CBRS_ALIGN_ANY ); 参数 CBRS_ALIGN_ANY 所指示的停靠样式是允许工具栏停靠 到主框架窗口中的任何一边。, 设置主框架窗口的工具栏停靠特性 实现该设置的函数为 CFrameWnd:EnableDocking ,其原型: void EnableDocking ( DWORD dwdocStyle ); 参数为停靠样式,种类和取值参考 MSDN 中的相关部分。 本例中实现设置的代码为: EnableDocking ( CBRS_ALIGN_ANY ); 参数 CBRS_ALIGN_ANY 所指示的停靠样式是使框架窗口的任 何一边都可以停放控制栏。在拥有多个控制栏的框架窗口中 该函数只需调用一次。, 把工具栏停靠在主框架窗口中的确定位置 实现停靠操作的函数为 CFrameWnd:DockControlBar ,原型: void DockControlBar ( CControlBar*pBar, UINT nDockBarID=0, LPCRECT lpRect=NULL ); 本例中实现停靠的代码为: DockControlBar ( 使工具栏按照创建工具栏窗口时的默认位置(框架窗口工作 区的顶部),实现停靠操作。,4.1.2 添加自定义工具栏 创建一个名为 Tb 的 SDI 应用程序项目,参照由 AppWizard 缺省创建的工具栏添加自定义工具栏。 1 自定义工具栏资源 使用资源编辑器添加一个标识为 ID_TOOLBAR1 的工具栏资源 其中包括两个按钮: 2. 添加自定义工具栏的程序代码 在 CMainFrame 类中增加一个 CToolBar 类的保护成员对象: CToolBar m_wndToolBar1; 在 CMainFrame:OnCreate 添加对应于 m_wndToolBar1 的创建、 加载资源和初始化代码:, if ( !m_wndToolBar1.CreateEx ( this,TBSTYLE_FLAT,WS_CHILD | WS_VISIBLE | CBRS_TOP|CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) |
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号