状态条、工具条和标题栏--MFC教程.ppt_第1页
状态条、工具条和标题栏--MFC教程.ppt_第2页
状态条、工具条和标题栏--MFC教程.ppt_第3页
状态条、工具条和标题栏--MFC教程.ppt_第4页
状态条、工具条和标题栏--MFC教程.ppt_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

1、第7章 状态条、工具条和标题栏 内容: 如何为一个工程添加状态条和工具条 状态条的编程 工具条的定制 动态图标的实现,第7章 状态条、工具条和标题栏 7.1状态条 状态条是一个包含信息的控制条,通常用于信息和状态提示。这里的信息是指有关菜单命令或工具命令的提示字符串以及其它提示/帮助信息,而状态用来指示Num Lock和Caps Lock等一些键的状态。状态条通常放在框架窗口的底部。状态条中的信息行能显示有关的程序状态或鼠标指向的工具按钮或菜单项的信息。 7.1.1创建状态条 MFC提供了类CStatusBar用于状态条的创建。和工具条一样,状态条对象也嵌在父框架窗口中。在创建父窗口时,状态条

2、自动创建。当父框架窗口销毁时,状态条也自动销毁。,在主框架类的实现文件中的OnCreate函数中有状态条创建的代码 if (!mStatusBar.Create(this) |!mStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT) TRACE0(Failed to create status barn); return -1; / fail to create ,在框架文件中,放置了数组indicators。该数组按从左到右的顺序,列出了状态条所有指示器的命令标识。 static UINT indicators

3、 = ID_SEPARATOR, /产生一个空格 ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, ; 状态条包括两类窗片:消息行和状态指示器。左边的窗片是消息行,其余的是状态指示器。AppWizard创建的状态条带一个消息行和三个状态指示器。ID_SEPARATOR标识符放在数组第一位,,这样状态条将在其左端有一个空指示器。状态条中的第一个指示器应该是空的,因为MFC自动在这个指示器内显示命令描述。 赋予indicators的其它三个标识符是由MFC定义的。MFC为具有这些标识符的指示器提供消息处理函数;这些函数显示Caps Lo

4、ck、 Num Lock和Scroll Lock键盘键的当前状态。数组中的第一个指示器被排在状态条的左边,其余的指示器排在右边。 7.1.2 应用举例 例:在第六章程序基础上增加我们需要的状态条,让状态条的第一个指示器内显示菜单命令描述,第二个指示器内显示Caps Lock键的状态,第三个指示器内显示鼠标的位置,第四个指示器内显示当前系统时间。,一、修改指示器数组indicators 将indicators数组修改为: static UINT indicators = ID_SEPARATOR, / status line indicator ID_INDICATOR_CAPS, ID_SEP

5、ARATOR, ID_SEPARATOR ; 此时运行该程序,则第二个指示器的宽度不变,而第三个、第四个指示器的宽度是变化的。可以通过定制状态条来改变指示器的宽度和风格。,二、定制状态条 在框架类实现文件中的OnCreate函数内设置第三个和第四个指示器的宽度和风格 int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) if (!mStatusBar.Create(this) | !mStatusBar.SetIndicators (indicators, sizeof(indicators)/sizeof(UINT) TRACE0(Fa

6、iled to create status barn); return -1; / fail to create ,mStatusBar.SetPaneInfo(2,ID_SEPARATOR,SBPS_NORMAL,60); mStatusBar.SetPaneInfo(3,ID_SEPARATOR,SBPS_NORMAL,80); return 0; 消息行的位置为0。 三、增加代码 1、在第3个指示器内显示当前鼠标位置。 在OnMouseMove 内加入下面的代码 void CMINIDRAWView:OnMouseMove(UINT nFlags, CPoint point) if(mD

7、ragging) ,char StrMsg50; CStatusBar *pStatus; PStatus=(CStatusBar*)AfxGetApp()-m_pMainWnd- GetDescendantWindow(AFX_IDW_STATUS_BAR); sprintf(StrMsg,(%d,%d),point.x,point.y); pStatus-SetPaneText(2,StrMsg); CScrollView:OnMouseMove(nFlags, point); 因为状态条是用户窗口的兄弟窗口,所以只有调用函数AfxGetApp获取指向应用程序的指针 ,而通过该指针可以获得

8、对该应用程序数据成员m_pMainWnd的存取权。AfxGetApp()-m_pMainWnd返回指向框架窗口的指针,然后通过该指针调用函数GetDescendantWindow获得状态条的地址,最后通过函数SetPaneText往指定的指示器内显示内容。,2、在第四个指示器内显示当前系统时间 首先在视图类的OnCreate函数内要设置定时器,然后在定时器的消息处理函数内要放置时间到需做的代码,最后在视图窗口结束时要销毁定时器。 首先用ClassWizard为视图类加入消息WM_CREATE、WM_TIMER和WM_DESTORY。 然后,在三个消息处理函数内加入如下代码: int CMINI

9、DRAWView:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CScrollView:OnCreate(lpCreateStruct) = -1) return -1; SetTimer(1,1000,NULL); return 0; ,void CMINIDRAWView:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call default char strMsg50; CstatusBar *pStatus; pStatus =(CStatusB

10、ar *)AfxGetApp()-m_pMainWnd -GetDescendantWindow(AFX_IDW_STATUS_BAR); CTime time=CTime:GetCurrentTime(); sprintf(strMsg,%02d:%02d:%02d, time.GetHour(),time.GetMinute(),time.GetSecond(); pStatus-SetPaneText(3,strMsg); CScrollView:OnTimer(nIDEvent); ,当时间间隔到时,调用OnTimer函数。该函数要得到当前系统时间,首先通过CTimer类的GetCur

11、rentTimer函数把系统时间存放类CTimer的对象中,然后通过类CTimer的成员函数分解出小时、分、秒再格式化成显示的字符串,最后通过函数CStatusBar:SetPaneText在第四个指示器内显示该内容。 void CMINIDRAWView:OnDestroy() CScrollView:OnDestroy(); / TODO: Add your message handler code here KillTimer(1); /销毁定时器 ,7.2工具条 7.2.1工具条的创建 工具条由MFC的类CToolBar提供支持,利用CToolBar及其派生类CToolBarCtrl,

12、用户可以对缺省的工具条进行编辑,包括工具条按钮、工具条尺寸及属性的设置等。 一、构造CToolBar对象 创建工程时,在AppWizard Step的第4步窗口中,选中Dockable Toolbar项,则随着工程的创建,用户就获得一缺省工具条。 这时,用户可以使用工具条编辑器对自动生成的标准工具条进行编辑,如增加、删除以及重新排列工具条按钮等。,工具条中的按钮通常对应于常用的菜单项命令,如果在程序中提供了相应的处理函数,它们两者都是产生命令的用户界面对象。但是在应用中,用户必须将按钮与菜单项连接起来,也就是将按钮属性对话框中的ID设置为对应菜单的ID值,只有这样,工具条按钮和菜单项命令才能执

13、行同一代码段。 创建工具条对象时,用户必须新建一个位图资源,以便加入按钮的图象。工具条的所有按钮图象都存储在同一位图中,而且是一幅接着一副存放。通常,工具条中的按钮具有相同的尺寸,缺省为2424个象素,按钮上的图象也具有相同的尺寸,缺省为1615个象素。,二、创建工具条代码 工具条对象是用户主框架类中的一个数据成员,也就是说,工具条对象嵌入在主框架对象中。这意味着,当创建主框架窗口时,同时也创建了工具条;销毁主框架窗口时,也销毁了工具条。 class CMainFrame : public CFrameWnd protected: / control bar embedded members

14、CStatusBar m_wndStatusBar; CToolBar m_wndToolBar; ,实际上,工具条和状态条的创建都是在CMainFrame:OnCreate中发生的。当系统创建了Windows框架窗口,而在显示框架窗口前,MFC调用AppWizard产生的缺省函数OnCreate实现如下一些功能 1、调用类CToolBar的成员函数CreateEx创建一基本的CToolBarCtrl对象 2、调用成员函数LoadToolBar将工具条资源信息装入OnCreate函数中 3、调用相应的函数实现工具条的泊位、漂浮或工具提示等m_wndToolBar.EnableDocking(C

15、BRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(,7.2.2工具条的泊位和漂浮 MFC支持可泊位的工具条,也就是说工具条可以泊位到父窗口的任一边,或漂浮在自己的小框架窗口内。 在缺省情况下,为实现工具条可泊位,在应用程序中自动生成以 下四步操作代码: 在框架窗口中使能泊位。要把工具条泊位到框架窗口,首先要 求框架窗口必须允许泊位。通常MFC调用函数 CFrameWnd:EnableDocking来决定工具条在框架窗口中的泊位位 置。此函数有一DWORD型的参数,用以指定工具条在框架窗口 中的泊位点,该参数值可以是下列组

16、合:CBRS_ALLIGN_TOP( 顶部)、 CBRS_ALLIGN_BOTTOM(底部)、 CBRS_ALLIGN_LEFT(左边)、 CBRS_ALLIGN_RIGHT(右边 ) CBRS_ALLIGN_ANY(任意一边)。,对工具条使能泊位。准备好泊位的目标后,还必须以同样的方 式准备泊位源,也就是说对工具条使能泊位。这时MFC为每一个 泊位工具条调用CControlBar:EnableDocking函数,指定工具条的泊位点。如果CControlBar:EnableDocking指定的泊位点于框架中指定的点不匹配,则该工具条不能泊位,只能漂浮。如果用户需要一永久漂浮的工具条,可相继调用

17、参数为0的EnableDocking函数和CFrameWnd:FloatControlBar函数,该工具条将保持永久漂浮状态,不再泊位到任何地方。 泊位工具条。准备好上两步后,调用函数 CFrameWnd:DockControlBar,使工具条泊位到框架窗口上。 漂浮工具条。从框架窗口中分离可泊位的工具条称为“漂浮”工 具条。通常,当用户拖动工具条到不能用于泊位的位置时,框架 调用函数CFrameWnd:FloatControlBar。,7.2.3工具提示 当用户把鼠标停放在工具条按钮上时,将弹出一个小型窗口,其中包含了有关该按钮用途的一段描述。这就是工具提示。 设置工具提示风格。为了使工具条

18、在激活时具有工具提示功能,在CToolBar:CreateEx函数中将参数dwStyle设置为CBRS_TOOLTIPS或其它风格的组合,如WS_CHILD、WS_VISIBLE等。 添加工具提示文字。在工具条编辑器中,打开工具条按钮属性框,然后在工具条提示框中输入工具按钮提示文字即可。工具提示文字用字符n分割。字符串资源共享工具条按钮的ID,7.2.4应用举例 例:往第六章生成的程序中添加二个工具条(图2)。工具条(a)有十个按键。用户可以用前七个键画某一形状选择工具,用后三个键选择画图所用的线的粗细。添加与按键相关的菜单命令,从而使用户可以用一个按键或一个菜单命令选择一个作图工具或线的粗细

19、。工具条(b)有两个按键,分别用来抹除最后画的图形以及删除视窗中所有的图形,同时为每个工具条设置标题。,一、添加新的菜单命令 1、在已有的Edit菜单的右边,插入一个Tools弹出菜单,并往这个菜单中添加表1中的项。 标识符ID 标题Caption 提示Prompt ID_TOOLS_LINE int mCurrentThickness; UINT mCurrentTools;,往应用类的构造函数中添加下面的代码 CMINIDRAWApp:CMINIDRAWApp() mCurrentThickness=1; mCurrentTool=ID_TOOLS_LINE; 往由ClassWizard定

20、义的20个消息处理函数中添加代码,只需往每个函数中添加一条语句即可。 void CMINIDRAWApp:OnLineDouble() / TODO: Add your command handler code here mCurrentThickness=2; ,void CMINIDRAWApp:OnUpdateLineDouble(CCmdUI* pCmdUI) / TODO: Add your command update UI handler code here pCmdUI-SetCheck(mCurrentThickness=2?1:0); void CMINIDRAWApp:O

21、nToolsRectangle() / TODO: Add your command handler code here mCurrentTool=ID_TOOLS_RECTANGLE; void CMINIDRAWApp:OnUpdateToolsRectangle(CCmdUI* pCmdUI) / TODO: Add your command update UI handler code here pCmdUI-SetCheck(mCurrentTool=ID_TOOLS_RECTANGLE?1:0); ,这些函数是如何工作的?以OnLineDouble为例。每当用户掀工具条上的双线按键

22、或选择Line菜单上的Double命令时,这个函数接受控制。在其中任一情况下,它只是把mCurrentThickness数据成员的值设为2。 在数据成员已被设为2后,工具条上的双线按键被选择而且检查(即打对号)Double菜单。这样,用户可容易地看见正使用哪种粗细的线。这个工作是由OnUpdateLineDouble完成的。程序一空闲,OnUpdateLineDouble就被调用,并在下一次用户打开Line弹出菜单时再调用。在其中任一情况下,指向一个CCmdUI对象的指针被传递给OnUpdateLineDouble,且它只调用成员函数SetCheck,把一个非零值传递给SetCheck。如果在

23、空闲时调用OnUpdateLineDouble,则CCmdUI对象和工具条按键有关,且调用SetCheck选择这个按键。如果,OnUpdateLineDouble是由于用户打开Line菜单而调用,则CCmdUI对象与菜单命令有关,且调用SetCheck检查这个命令,这样,根据用户接口对象的类型完成相同的动作。 在空闲时间和下一次用户打开Line菜单时,OnUpdateLineSingle和OnUpdateLineTriple函数也被调用。其中每个函数把0传递给SetCheck,从而去掉按键选择(如果这个按键已被选择的话),或者去掉菜单命令的对号(如果打了对号)。因此,选择(或对号)从前面选择的

24、项移到当前选择的项。 此时编译并运行,虽然能选择10个按键,但程序实现的仍是画直线。,7.3 标题栏 标题栏也属于框架窗口,用来显示主框架窗口的图标、项目名及控制菜单项等。标题栏中有一个系统默认的图标,缺省ID为IDR_MAINFRAME,它是一个静止图标,如果是多文档程序,还有一个子框架窗口的图标,其ID为IDR_XXTYPE(XX为应用程序名或应用程序名的前几个字母)。 以文本方式打开MINIDRAW.RC文件,找到行 IDR_MAINFRAME ICON DISCARDABLE resMINIDRAW.ico 则标题栏显示的就是res子目录下的MINIDRAW.ico文件所保存的图标。要

25、修改标题栏显示的图标,则可以自己创建一个图标文件,如MYICON.ico,然后将MINIDRAW.ico文件换成MYICON.ico文件即可。 本节通过在上一节程序基础上实现动画图标和修改菜单为例介绍标题栏的操作。,7.3.1 动画图标的实现 一、函数介绍 在进行操作之前,首先介绍几个函数 1、原型:DWORD GetClassLong( HWND hWnd, int nIndex ) 其中hWnd是窗口句柄,nIndex为指定返回值的类型,见下表 从指定的窗口(由hWnd确定)的WNDCLASS结构中返回一个32位的值。,2、SetClassLong 函数原型:DWORD SetClassL

26、ong( HWND hWnd, int nIndex, LONG dwNewLong ); 其中参数hWnd和nIndex的说明见1, dwNewLong 为要用作替换的新值。 功能:该函数在nIndex指定处设置一个新的32位值,并将它传递给与hWnd指定窗口相联系的WNDCLASS结构。 二、实现动画图标 1、打开MINIDRAW工程 2、创建图标资源 在Resource View中,右键单击Icon,在出现的菜单中选择Import,选中5个变脸图标文件Faceo1.icoFace05.ico,按Import按钮,则将这5个图标文件加入到了本程序中,这五个文件分别对应的图标资源名为IDI_

27、ICON1到IDI_ICON5。,3、为框架类增加自定义成员函数 (1)在MainFrame.h中增加函数声明 public: void LoadNewIcon(UINT nIConID); (2)在MainFrame.cpp中增加函数定义,用来装载新图标,代码如下 void CMainFrame:LoadNewIcon(UINT nIconID) HICON hNew,hOld; hNew=AfxGetApp()-LoadIcon (nIconID); /装载图标 hOld=(HICON)GetClassLong(m_hWnd,GCL_HICON); /原来在标题栏上的图标 if(hNew!=hOld) /如果要装载的图标和标题

温馨提示

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

评论

0/150

提交评论