装饰应用程序的外观教学.ppt
《装饰应用程序的外观教学.ppt》由会员分享,可在线阅读,更多相关《装饰应用程序的外观教学.ppt(136页珍藏版)》请在三一办公上搜索。
1、第四章 装饰应用程序的外观,创建友好,美观的用户界面是成功设计和编制一个 Windows 应用程序的重要组成部分,程序用户界面的设计编程工作包括菜单、控制栏(其中包括工具栏、状态栏、对话框栏等)创建和控制、对话框、帮助信息的制作和运行,以及框架、视图窗口的位置和大小控制等。其中对话框的制作和运行操作将在下一章中作详细的描述。在 AppWizard 创建的应用程序框架中,菜单,工具栏,状态栏和视图窗口均可以缺省隶属于主框架窗口,并由主框架窗口管理和控制。一个典型主框架窗口的组成以及与用户界面各个组成部分的关系如下图所示:,SDI 应用程序框架,标题栏,菜单栏,工具栏窗口,状态栏窗口,视图窗口,M
2、DI 应用程序框架,标题栏,菜单栏,工具栏窗口,状态栏窗口,标题栏,视图窗口,MFC AppWizard 所生成的应用程序主框架窗口可以选择拥有缺省的基本菜单、相应的工具栏、状态栏和由系统自动确定框架窗口位置和尺寸,但在实际编程中往往需要在此基础上修改和添加自定义的菜单、工具栏、状态栏以及由用户确定框架窗口位置和尺寸,使应用程序外观满足特定的程序功能、特定的用户和特定的使用环境的需要。MFC 为工具栏,状态栏,菜单,主框架窗口提供了相应的基类,以便实现对这些程序外观组成部分的创建和各种操作。这些类在 MFC 中的派生层次结构如下:,工具栏和状态栏分别由 CToolBar 和 CStatusBa
3、r 类描述,它们都是控制栏类 CControlBar 的派生类,而 CControlBar又是 CWnd 的派生类,因此,工具栏和状态栏本身也是一个能响 应消息的特定窗口,在主框架窗口中可以视为是子窗口。,CObject,菜单是由 CMenu 类描述,它是直接从 CObject 类派生的,因此该类的对象只能用于完 成菜单的创建、跟踪、修改、销毁和发送命令消息,而本身 不能响应消息;在主框架窗中可以视为用于发送命令消息的 一个特定区域。,CObject,主框架窗口是由 CFrameWnd(用于 SDI)或 CMDIFrameWnd 和 CMDIChildWnd(用于 MDI),它们都是 CWnd
4、 的直接或间接派 生类。,CObject,由 AppWizard 创建的文档视图结构的应用程序主框架窗口类对象中缺省的工具栏被定义成名为 m_wndToolBar 的 CToolBar 类对象成员,而状态栏被定义成名为 m_wndStatusBar 的 CStatusBar 类对象成员。创建和显示工具栏和状态栏的操作应在程序主框架窗类 CMainFrame 对象所关联的窗口已经创建完成(窗口句柄已有效)但还未显示时进行,即在窗口创建消息 WM_CREATE 的响应成员函数 OnCreate 被调用中完成的。因此,需要在 CMainFrame 类中重新定义 OnCreate 函数,以便在主框架窗
5、口显示之前添加任何需要附加的初始化工作,例如创建和显示工具栏和状态栏、创建其他子窗口等。,与其它 Windows 资源所对应的 MFC 类一样,CMenu 类也是将菜单的句柄和属性和对菜单属性的各种操作等封装了起来,并且只有当菜单句柄有效时,对菜单属性的操作才是合法的。通常情况下,菜单总是主框架窗口的一个区域,所以当主框架窗口的产生函数或 LoadFrame 函数被调用时,与菜单资源相关联的CMenu 对象作为框架窗口的保护成员被创建。因此,通常情况下,编程者只需要通过设计菜单的静态资源,而且无须通过 CMenu 类对象的调用对象的行为,就能满足程序对主菜单的一般设计编程需求。但在程序需要动态
6、创建新菜单或修改已有菜单时,则必须调用 CMenu 对象的行为。,如果你需要修改主框架窗口的菜单,你可能需要通过窗口类 CWnd 的成员函数 GetMenu 获取保护成员 CMenu 对象的指针,并通过该指针对该菜单对象进行各种需要的访问和操作,以便满足特殊的菜单设计编程需求,例如:动态切换不同菜单;动态隐藏和显示菜单;动态添加和删除菜单项;动态禁止和激活菜单项;动态为菜单项添加图形标签;动态创建浮动的弹出式环境菜单。,对框架和视图窗口的外观操作,就是对它们的位置、大小、状态的控制,称之为放置(Placement)操作。视图窗口是包含在框架窗口中的,它随着框架窗口的变化而变化,换句话说,对视图
7、窗口的放置操作是通过对框架窗口的放置操作实现的。虽然用户可以方便地通过框架窗口提供的最大化、最小化等窗口操作界面对框架和视图窗口的放置进行动态交互控制,但在不少情况下,还是需要在程序中通过代码对框架和视图窗口的放置进行定制操作。例如,希望程序在运行开始时能保持最近一次运行的框架和视图窗口的位置、大小、状态。实现这些放置操作是窗口创建过程中完成的,这对于 SDI 和 MDI 应用程序是不完全一样的,对于 MDI,不仅要考虑主框架窗口的放置,还要考虑子框架窗口的放置。,本章将通过 5 类实例程序分别讲述如何实现上述外观设计:第 1 类实例讲解工具栏和状态栏编程;第 2 类实例讲解 CDialogB
8、ar 编程;第 3 类实例讲解 CReBar 编程;第 4 类实例讲解菜单编程;第 5 类实例讲解具有持续特性的定制框架窗口类编程。,4.1 创建浮动工具栏4.1.1 利用 AppWizard 自动创建工具栏 在 MFC 中,工具栏资源和工具栏类 CToolBar 是实现工具栏的两个要素。创建工具栏对象的基本步骤为:创建工具栏资源;创建一个 CToolBar 对象;调用 CToolBar:Create 函数创建工具栏窗口;调用 CToolBar:LoadToolBar 载入工具栏资源。,在使用 AppWizard 生成的默认配置的应用程序框架中包括了能创建一个缺省工具栏的四步操作的所有代码,因
9、此修改工具栏中的按钮只需要修改缺省工具栏资源就可以实现。而如果需要创建缺省工具栏以外的工具栏,则必须在 AppWizard 生成的框架基础上,效仿上述缺省资源和代码添加相应的自定义资源和代码。为此,分析创建缺省工具栏的代码是十分必要的。创建一个 SDI 应用程序项目“Default”(使用 AppWizard 的缺省选择),查询所创建的应用程序框架的代码,可以发现与工具栏有关的资源和代码有:,1 在资源中添加了工具栏资源 IDR_MAINFRAME:2 在 CMainWnd 的定义中添加了定义工具栏对象成员的代码:CToolBar m_wndToolBar;3 在重新定义的 CMainWnd:
10、OnCreate 中添加了创建工具栏,装 载工具资源和初始化工具栏的缺省代码。分析 CMainWnd:OnCreate,该虚函数首先调用了基类中定义 的版本 CFrameWnd:OnCreate 进行基类部分的初始化工作,然后可以添加主框架窗口所需要的任何初始化代码,其中包 括了对工具栏的创建和初始化操作:,创建工具栏窗口 创建工具栏窗口的函数是 CToolBar:Create 或CToolBar:CreateEx 它们的原型分别为:BOOL Create(CWnd*pParentWnd,/父窗口指针DWORD dwStyle=WS_CHILD|WS_VISIBLE|CBRS_TOP,/风格U
11、INT 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 和 dwStyl
12、e 的设置是决定所创建的工具栏的外观 和状态的重要因素,可设置的样式值包括 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,
13、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 的。,设置工具栏停靠特性 实现设置
14、的函数为 CControlBar:EnableDocking,其原型为:void EnableDocking(DWORD dwStyle);参数为停靠样式,种类和取值参考 MSDN 中的相关部分。本例中实现设置的代码为:m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);参数 CBRS_ALIGN_ANY 所指示的停靠样式是允许工具栏停靠 到主框架窗口中的任何一边。,设置主框架窗口的工具栏停靠特性 实现该设置的函数为 CFrameWnd:EnableDocking,其原型:void EnableDocking(DWORD dwdocStyle);参数为停靠样式
15、,种类和取值参考 MSDN 中的相关部分。本例中实现设置的代码为:EnableDocking(CBRS_ALIGN_ANY);参数 CBRS_ALIGN_ANY 所指示的停靠样式是使框架窗口的任 何一边都可以停放控制栏。在拥有多个控制栏的框架窗口中 该函数只需调用一次。,把工具栏停靠在主框架窗口中的确定位置 实现停靠操作的函数为 CFrameWnd:DockControlBar,原型:void DockControlBar(CControlBar*pBar,UINT nDockBarID=0,LPCRECT lpRect=NULL);本例中实现停靠的代码为:DockControlBar(使工具
16、栏按照创建工具栏窗口时的默认位置(框架窗口工作 区的顶部),实现停靠操作。,4.1.2 添加自定义工具栏 创建一个名为 Tb 的 SDI 应用程序项目,参照由 AppWizard缺省创建的工具栏添加自定义工具栏。1 自定义工具栏资源 使用资源编辑器添加一个标识为 ID_TOOLBAR1 的工具栏资源 其中包括两个按钮:2.添加自定义工具栏的程序代码 在 CMainFrame 类中增加一个 CToolBar 类的保护成员对象:CToolBar m_wndToolBar1;在 CMainFrame:OnCreate 添加对应于 m_wndToolBar1 的创建、加载资源和初始化代码:,if(!m
17、_wndToolBar1.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)|!m_wndToolBar1.LoadToolBar(IDR_TOOLBAR1)TRACE0(Failed to create toolbarn);return-1;/fail to create m_wndToolBar1.EnableDocking(CBRS_ALIGN_ANY);DockControlBar(此时编译运行应用程序,可以看到新
18、增加的自定义工具栏,但工具栏中的按钮是灰色的,即不能对它进行任何操作。,4.1.3 自定义工具栏的命令响应及其用户界面更新在 CTbView 类中,添加工具栏按钮 ID_LINE 和 ID_CIRCLE 的命令消息和界面更新命令消息的响应。1 为 CTbView 类增加保护数据成员和枚举:int m_nDraw;/指示当前的绘图类别。enumLINE,CIRCLE;/定义可以使用的绘图类别。2 在 CTbView 的构造函数中对 m_nDraw 进行初始化:m_nDraw=LINE;3.使用 ClassWizard 为命令消息 ID_LINE 和 ID_CIRCLE 定义命令 响应函数和用户界
19、面更新函数。在类定义文件中添加了这些成员函数的原型:,afx_msg void OnLine();afx_msg void OnCircle();afx_msg void OnUpdateLine(CCmdUI*pCmdUI);afx_msg void OnUpdateCircle(CCmdUI*pCmdUI);在类实现文件中添加了上述成员函数的操作定义如下:void CTbView:OnLine()m_nDraw=LINE;,void CTbView:OnCircle()m_nDraw=CIRCLE;void CTbView:OnUpdateLine(CCmdUI*pCmdUI)pCmdUI
20、-SetCheck(m_nDraw=LINE);void CTbView:OnUpdateCircle(CCmdUI*pCmdUI)pCmdUI-SetCheck(m_nDraw=CIRCLE);4 编译运行 Tb,4.1.4 自定义工具栏的隐藏/显示 要使自定义的工具栏能像缺省工具栏那样具有隐藏和显示操作功能必须添加以下资源和代码:1 在主菜单 IDR_MAINFRAME 的“查看”弹出菜单中增加新的菜单 项 自定义工具栏,其标识值为 ID_VIEW_TOOLBAR12 在主框架窗口类 CMainFrame 中,为 ID_VIEW_TOOLBAR1 定义 命令响应函数和用户界面更新函数 在类
21、定义文件中添加这些成员函数的原型:afx_msg void OnViewToolbar1();afx_msg void OnUpdateViewToolbar1(CCmdUI*pCmdUI);,在类实现文件中添加上述成员函数的操作定义:void CMainFrame:OnViewToolbar1()ShowControlBar(3 编译运行Tb,4.1.5 动态删除和添加工具栏中按钮 如果希望通过程序动态地从已经创建的工具栏中删除一些按钮或向工具栏中添加一些按钮,则需要使用 CToolBar 类对象中的 CToolBarCtrl 类对象成员来实现,而这个对象成员可以通过调用 CToolBar:
22、GetToolBarCtrl 函数获得实例 Tb1 是在实例 Tb的基础上增加了通过程序代码对工具栏中的按钮进行动态删除和添加的功能:1 在 CMainFrame 类定义中增加下列保护数据成员:/for saving buttons of the m_wndToolBar TBBUTTON m_tbButtons11;/for saving the most and least count of buttons int m_nMost,m_nLeast;,2 在 CMainFrame:OnCreate 中增加下列初始化代码:/Save some TBBUTTONs for restoring
23、later m_nMost=m_wndToolBar.GetToolBarCtrl().GetButtonCount();/Save the most count of buttons for(int I=2;I m_nMost-1;i+)m_wndToolBar.GetToolBarCtrl().GetButton(i,3 为 CMainFrame 定义删除和恢复工具栏按钮的保护成员函数:在定义文件中增加这两个函数的原型声明:void RecoverTBButtons(int index,int count);void DeleteTBButtons(int index,int count)
24、;在实现文件中增加这两个函数的定义代码:void CMainFrame:DeleteTBButtons(int index,int count)for(int I=index;I index+count;i+)m_wndToolBar.GetToolBarCtrl().DeleteButton(index);/从工具栏中顺序删除索引为 index 的按钮。ShowControlBar(/重新显示变化后的工具栏。,void CMainFrame:RecoverTBButtons(int index,int count)for(int I=index;I index+count;i+)/将删除的按
25、钮顺序恢复插入到工具栏中。m_wndToolBar.GetToolBarCtrl().InsertButton(i,4 在主菜单资源 IDR_MAINFRAME 的“查看”菜单中增加菜单项:“删除工具栏中的按钮”和“恢复工具栏中的按钮”,它们的标识 为:ID_DELETE_BUTTONS 和 ID_RECOVER_BUTTONS。,5 使用 ClassWizard 在 CMainFrame 类中为 ID_DELETE_BUTTONS 和 ID_INSERT_BUTTONS 添加命令消息响应和用户界面更新函数。在类定义文件中增加了:afx_msg void OnDeleteButtons();a
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 装饰 应用程序 外观 教学
链接地址:https://www.31ppt.com/p-4948967.html