< meta http-equiv="description" content="当Windows将程序中默认的工具条精确定位后,还要得到该默认工具条的尺寸和风格,得到它的尺寸是为了确定自定义工具条的停靠区域,本实例的解决办法是在用CWnd::GetWindowRect()函数的到默认工具条的尺寸后"/>

C++制作并列/浮动状态的工具条

[来源] 达内    [编辑] 达内   [时间]2013-02-18

当Windows将程序中默认的工具条精确定位后,还要得到该默认工具条的尺寸和风格,得到它的尺寸是为了确定自定义工具条的停靠区域,本实例的解决办法是在用CWnd::GetWindowRect()函数的到默认工具条的尺寸后

  一、实现方法

  一般情况Visual C++(C++培训 )++生成的程序中会自动处理一个默认的工具条IDR_MAINFRAME,所以开发人员要作的工作是处理一个自定义的工具条。首先调用CframeWnd::RecalcLayout()函数来让Windows重新调整计算界面中各个工具条的尺寸大小,该函数原型如下:

  virtual void RecalcLayout( BOOL bNotify = TRUE );

  函数中的参数bNotify为TRUE时,Windows会向在活动控件发出外观尺寸变化的通知消息,否则就不会发出该通知消息。

  当Windows将程序中默认的工具条精确定位后,还要得到该默认工具条的尺寸和风格,得到它的尺寸是为了确定自定义工具条的停靠区域,本实例的解决办法是在用CWnd::GetWindowRect()函数的到默认工具条的尺寸后,将该尺寸右移 一个像素,这样以来在确定自定义工具条的显示过程中Windows会根据此尺寸自动调整显示区域。判断默认工具条的风格是为了得到它的停靠信息,如停靠在顶端、底端、左侧或右側等,这样自定义工具条好根据该信息确定同样的停靠位置。这里面有一个小技巧,使用CToolBar::GetBarStyle()得到的工具属性很多,需要屏蔽掉其它属性,而只留下停靠属性,为此,使用了如下代码:

  dw=LeftOf->GetBarStyle();

  n = 0;

  n = (dw&CBRS_ALIGN_TOP) ? AFX_IDW_DOCKBAR_TOP : n;

  n = (dw&CBRS_ALIGN_BOTTOM && n==0) ? AFX_IDW_DOCKBAR_BOTTOM : n;

  n = (dw&CBRS_ALIGN_LEFT && n==0) ? AFX_IDW_DOCKBAR_LEFT : n;

  n = (dw&CBRS_ALIGN_RIGHT && n==0) ? AFX_IDW_DOCKBAR_RIGHT : n;

  上面的代码首先判断工具条是否是停靠在顶端,如是,n等于AFX_IDW_DOCKBAR_TOP,否则n等与初始值0,然后继续进行停靠属性的判断。

  最后,调用DockControlBar()函数来停靠字定义工具条,该函数的原型如下:

  void DockControlBar( CControlBar * pBar, UINT nDockBarID = 0, LPCRECT lpRect = NULL );

  函数中参数pBar代表要停靠的工具条,参数nDockBarID为工具条要停靠的风格,参数lpRect为工具条要停靠的区域,注意该区域的坐标要设置为窗口的坐标。

  1、启动Visual C++6.0,选择默认选项生一个多文档(MDI)应用程序,命名为\"DockTbars\";

  2、在应用程序的CMainFrame 类中添加DockControlBarLeftOf()方法以及变量CToolBar m_wndToolBar1; m_wndToolBar2;

  3、在程序中定义工具条IDR_MAINFRAME、IDR_WINDOW资源;

  4、添加代码,编译运行程序。

  三、程序代码

  //////////////////////////////////////////////////////////////////////////////

  void CMainFrame::DockControlBarLeftOf(CToolBar* Bar, CToolBar* LeftOf)

  {

  CRect rect;

  DWORD dw;

  UINT n;

  // get MFC to adjust the dimensions of all docked ToolBars

  // so that GetWindowRect will be accurate

  RecalcLayout(TRUE);

  LeftOf->GetWindowRect(&rect);

  rect.OffsetRect(1,0);

  dw=LeftOf->GetBarStyle();

  n = 0;

  n = (dw&CBRS_ALIGN_TOP) ? AFX_IDW_DOCKBAR_TOP : n;

  n = (dw&CBRS_ALIGN_BOTTOM && n==0) ? AFX_IDW_DOCKBAR_BOTTOM : n; [Page]

  n = (dw&CBRS_ALIGN_LEFT && n==0) ? AFX_IDW_DOCKBAR_LEFT : n;

  n = (dw&CBRS_ALIGN_RIGHT && n==0) ? AFX_IDW_DOCKBAR_RIGHT : n;

  DockControlBar(Bar,n,&rect);

  }

  int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

  {

  if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)

  return -1;

  if (!m_wndToolBar1.CreateEx(this, TBSTYLE_FLAT | TBSTYLE_LIST, WS_CHILD |

  WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY |

  CBRS_SIZE_DYNAMIC) ||!m_wndToolBar1.LoadToolBar(IDR_MAINFRAME))

  {

  TRACE0(\"Failed to create toolbar\\n\");

  return -1; // fail to create

  }

  if (!m_wndToolBar2.CreateEx(this, TBSTYLE_FLAT | TBSTYLE_LIST, WS_CHILD |

  WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY |

  CBRS_SIZE_DYNAMIC) ||!m_wndToolBar2.LoadToolBar(IDR_WINDOW))

  {

  TRACE0(\"Failed to create toolbar\\n\");

  return -1; // fail to create

  }

  if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators,

  sizeof(indicators)/sizeof(UINT)))

  {

  TRACE0(\"Failed to create status bar\\n\");

  return -1; // fail to create

  }

  // TODO: Delete these three lines if you don’t want the toolbar to be dockable

  m_wndToolBar1.EnableDocking(CBRS_ALIGN_ANY);

  [NextPage]

  m_wndToolBar2.EnableDocking(CBRS_ALIGN_ANY);

  EnableDocking(CBRS_ALIGN_ANY);

  DockControlBar(&m_wndToolBar1);

  DockControlBarLeftOf(&m_wndToolBar2,&m_wndToolBar1);

  return 0;

  }

资源下载