zoukankan      html  css  js  c++  java
  • (转载)VS2010/MFC编程入门之三十七(工具栏:工具栏的创建、停靠与使用)

    鸡啄米在上一节教程中讲了工具栏资源及CToolBar类,本节继续讲解工具栏的相关知识,主要内容包括工具栏的创建、停靠与使用。

           工具栏的使用

           上一节中鸡啄米提到过,一般情况下工具栏中的按钮在菜单栏中都有对应的菜单项,两者实现的功能相同,要想实现这种效果,只需要将工具栏按钮的ID与对应的菜单栏中菜单项的ID设置为相同值即可。

           在实际使用工具栏时,除了前面讲的资源编辑外,其他使用与菜单类似。例如,对COMMAND消息和UPDATE_COMMAND_UI消息,可以像VS2010/MFC编程入门之三十五(菜单:菜单及CMenu类的使用)中的菜单应用实例那样为工具栏按钮添加消息处理函数。

           如果工具栏按钮对应的菜单项已经添加了消息处理函数,那么就不必再为它添加了,因为它的ID与菜单项相同,所以会调用同样的消息处理函数。这样点击工具栏按钮与点击相应菜单项执行相同的功能,在菜单项为选中、激活或禁用等状态时,工具栏按钮会有一样的状态。

           工具栏的创建

           大家在第三十四讲创建的Example34工程的CMainFrame类中看到,它创建工具栏所使用的类并不是常用的CToolBar类,而是CMFCToolBar类。CMFCToolBar类是自VS2008以来MFC提供的类,它与CToolBar类有些类似,但功能更丰富。这里要注意,CMFCToolBar类与CToolBar类并没有任何派生关系。

           鸡啄米这里就以CMFCToolBar类来讲讲工具栏的创建步骤:

           1. 创建工具栏资源。

           2. 构造CMFCToolBar类的对象。

           3. 调用CMFCToolBar类的Create或CreateEx成员函数创建工具栏。

           4. 调用LoadToolBar成员函数加载工具栏资源。

           大家可以对应着看看Example34的CMainFrame类自动生成的代码中创建工具栏的过程。

           工具栏IDR_MAINFRAME的资源已经自动创建好。在MainFrm.h文件对CMainFrame类的声明中,定义了CMFCToolBar类的对象作为成员对象:CMFCToolBar  m_wndToolBar;。然后在CMainFrame::OnCreate函数的实现中可以看到工具栏的创建以及加载工具栏资源的代码,如下:

    C++代码
    1. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)   
    2. {   
    3.     if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)   
    4.         return -1;   
    5.          ......略   
    6.   
    7.     // 调用CreateEx函数创建工具栏,并调用LoadToolBar函数加载工具栏资源   
    8.     if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||   
    9.         !m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))   
    10.     {   
    11.         TRACE0("Failed to create toolbar ");   
    12.         return -1;      // fail to create   
    13.     }   
    14.   
    15.     ......略   
    16.   
    17.     return 0;   
    18. }  

           因为创建框架窗口时需要调OnCreate函数,所以工具栏的创建也是在OnCreate中完成的。

           工具栏的停靠

           在创建好工具栏后,如果想要停靠工具栏,也需要添加相应的停靠代码。工具栏停靠的步骤及需要调用的函数如下(前两个步骤可以颠倒顺序):

           1. 在框架窗口中启用停靠。

               若要将工具栏停靠到某个框架窗口,则必须启用该框架窗口(或目标)以允许停靠。可以在CFrameWndEx类中调用下面的成员函数来实现:

               BOOL EnableDocking(DWORD dwDockStyle);

               该函数采用一个DWORD参数,用来指定框架窗口的哪个边可以接受停靠,可以有四种取值:CBRS_ALIGN_TOP(顶部)、CBRS_ALIGN_BOTTOM(底部)、CBRS_ALIGN_LEFT(左侧)、CBRS_ALIGN_RIGHT(右侧)。如果希望能够将控制条停靠在任意位置,将CBRS_ALIGN_ANY作为参数传递给EnableDocking。

           2. 工具栏启用停靠。

               框架窗口启用停靠准备好后,必须以相似的方式准备工具栏。为想要停靠的每一个工具栏CMFCToolBar对象调用下面的函数:

               virtual void EnableDocking(DWORD dwAlignment);

               允许工具栏停靠到框架窗口,并指定工具栏应停靠的目标边。此函数指定的目标边必须与框架窗口中启用停靠的边匹配,否则工具栏无法停靠,为浮动状态。

           3. 停靠工具栏。

               当用户试图将工具栏放置在允许停靠的框架窗口某一边时,需要框架CFrameWndEx类调用以下函数:

               void DockPane(CBasePane* pBar,UINT nDockBarID=0,LPCRECT lpRect=NULL);

               参数pBar为要停靠的控制条的指针,参数nDockBarID为要停靠的框架窗口某条边的ID,可以是以下四种取值:AFX_IDW_DOCKBAR_TOP、AFX_IDW_DOCKBAR_BOTTOM、AFX_IDW_DOCKBAR_LEFT、AFX_IDW_DOCKBAR_RIGHT。

            下面我们接着看Example34的CMainFrame类的OnCreate函数实现中,工具栏的停靠过程:

    C++代码
    1. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)   
    2. {   
    3.     if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)   
    4.         return -1;   
    5.   
    6.     ......略   
    7.   
    8.     // 调用CreateEx函数创建工具栏,并调用LoadToolBar函数加载工具栏资源  
    9.     if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||   
    10.         !m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))   
    11.     {   
    12.         TRACE0("Failed to create toolbar ");   
    13.         return -1;      // fail to create   
    14.     }   
    15.   
    16.          ......略   
    17.   
    18.     // TODO: Delete these five lines if you don't want the toolbar and menubar to be dockable   
    19.     m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);   
    20.          // 为m_wndToolBar启用停靠   
    21.     m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);   
    22.          // 为框架窗口启用停靠   
    23.     EnableDocking(CBRS_ALIGN_ANY);   
    24.     DockPane(&m_wndMenuBar);   
    25.          // 停靠工具栏   
    26.     DockPane(&m_wndToolBar);   
    27.     
    28.          ......略   
    29.   
    30.     return 0;   
    31. }  

           关于工具栏的知识就讲到这里了。鸡啄米感谢大家长期以来的支持。

    原文地址:http://www.jizhuomi.com/software/217.html

  • 相关阅读:
    bzoj 2969: 矩形粉刷 概率期望+快速幂
    loj #6191. 「美团 CodeM 复赛」配对游戏 期望dp
    CF446C DZY Loves Fibonacci Numbers 线段树 + 数学
    CF696B Puzzles 概率期望
    bzoj 3566: [SHOI2014]概率充电器 数学期望+换根dp
    loj #6342. 跳一跳 期望dp
    CF316G3 Good Substrings 广义后缀自动机
    bzoj 3829: [Poi2014]FarmCraft 树形dp+贪心
    bzoj 2131: 免费的馅饼
    CF19D Points 平衡树
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/6758540.html
Copyright © 2011-2022 走看看