VC中工具条的停靠控制技巧 在VC5.0中开发应用程序时，工具条是必不可少的功能因素，在整个窗口的停靠位置尤其重要，它直接影响到程序界面的外观形象。本文介绍各类工具条停靠位置的控制技巧，供大家参阅。 标准工具条的停靠控制 VC5.0应用程序向导生成的框架代码中，都具有普通工具条的控制方法。 正常情况下工具条类CToolBar是控制条类CControlBar的派生类，其显示的初始停靠位置是通过调用继承的函数CControlBar::EnableDocking(DWORD dwStyle)来确定的，其参数dwStyle用来指定停靠的具体位置，常用的格式如下：
CBRS－ALIGN-TOP：停靠在框架窗口客户区域顶部；
CBRS－ALIGN－BOTTOM：停靠在框架窗口客户区域底部；
CBRS－ALIGN－LEFT：停靠在框架窗口客户区域左边；
CBRS－ALIGN－RIGHT：停靠在框架窗口客户区域右边；
CBRS－ALIGN－ANY：停靠在框架窗口客户区域任何位置。
在利用应用程序向导AppWizard生成的应用程序中，其控制代码默认的停靠位置为CBRS－ALIGN－ANY。工具条在正常显示时停靠在窗口客户区域的顶部，控制指令为EnableDocking(CBRS_ALIGN_TOP)或m_wndToolBar.EnableDocking(CBRS_ALIGN_TOP)，注意在实际程序控制时前者必须处于所有其他控制代码的前面，否则浮动工具条或特殊工具条等部件的代码可能无法奏效。
应用程序的单文档和多文档的窗口框架类均由
CFrameWnd：：EnableDocking(DWORD dwDockStyle)来实现，其可选的参数除上述五种之外，还增加了CBRS.FLOAT.MULTI参数，该参数主要是为设计浮动工具条而增加的，用来确定一个框架窗口中允许存在多个浮动工具条。
同样在利用应用程序向导AppWizard生成的应用程序中，其默认的停靠位置也是CBRS－ALIGN－ANY，正常显示时停靠在框架窗口的顶部，即EnableDocking(CBRS_ALIGN_TOP)或m_wndToolBar.EnableDocking(CBRS_ALIGN_TOP)。
浮动工具条的停靠控制
当一个框架窗口中存在多个标准或浮动工具条时，则需要利用函数void DockControlBar(CControlBar * pBar，UINT nDockBarID=0，LPCRECTlpRect=NULL)来确定要控制停靠位置的工具条，它也是CFrameWnd类的成员函数。其中参数pBar用来指向被控制停靠位置的工具条对象指针，参数nDockBarID用来确定工具条停靠在框架窗口的哪条边上，其控制的具体取值为：
AFX－IDW－DOCKBAR－TOP：停靠在框架窗口的顶部；
AFX－IDW－DOCKBAR－BOTTOM：停靠在框架窗口的底部；
AFX－IDW－DOCKBAR－LEFT：停靠在框架窗口的左边；
AFX－IDW－DOCKBAR－RIGHT：停靠在框架窗口的右边。
当参数nDockBarID的取值为0时，工具条可停靠在框架窗口中的任何一个可停靠的边上，其默认的初始位置为窗口顶部。
并列工具条的停靠控制
很多大型应用程序中都存在将多个工具条同时并列停靠在某窗口的某一条边上的情况。对这种停靠方法，可利用上述工具条控制函数DockControlBar的lpRect参数，通过控制工具条的停靠矩形区域的方法来实现。实现的函数如下：
1.在实现文件MainFrm.h中增加如下成员函数：
void DockControlBarLeftOf(CToolBar ＊Bar，CToolBar
＊ LeftOf);
2.在实现文件MainFrm.cpp中增加如下成员函数：
void CMainFrame::DockControlBarLeftOf(CToolBar
＊Bar，CTooIBar ＊LeftOf)
{//设置工具条并列停靠在同一条边上
CRect rect; //矩形区域定义
DWORD dw;
UINT n=0;
RecalcLayout(); //重新显示
LeftOf －>GetWindowRect( ＆rect);
rect.Offset(1,0);//设置偏移植以停靠在同一边上
dw=LeftOf －>GetBarStyle();
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;
DockControlBar(Bar,n, ＆rect);
}
在这个函数中注意对RecalcLayout()函数和OffestRect()函数的调用，前者用来重新显示被调整的客户区和工具条，后者用来重新确定矩形区域，这相当于利用鼠标将第二个工具条窗口拖动到前一个工具条上然后释放。
3.修改应用程序，建立函数OnCreate()中的相应DockControlBar()函数为DockControlBarOf()函数，并正确设置工具条对象的指针。
EnableDocking(CBRS_ALIGN_ANY)；
//停靠位置必须在最前面
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
m_wndTestToolBar.EnableDocking(CBRS_ALIGN_ANY);
//工具条建立函数
DockControlBar( ＆m_wndToolBar,AFX_IDW_DOCKBAR_TOP);
//使两个工具条并列停靠
DockControlBarLeftOf( ＆m_wndTestToolBar, ＆m_wndToolBar);
工具条的顶部停靠控制
1.打开菜单资源增加顶部控制菜单项IDD_DLGBARTOP；
2.在实现文件MainFrm.h中增加成员控制变量
m_bDialogTop:BOOL m_bDialogTop;并在构造函数中设置初始值；
3.利用类向导ClassWizard为菜单项设置响应函数；
4.在实现文件MainFrm.cpp中通过利用SetWindowPos()成员完善消息映射功能。
void CMainFrame::OnButtonDIgbartop()
{//定制工具条顶部位置控制函数
if (m_bDialogTop)
m_wndDIgBar.SetWindowPos( ＆m_wndStatusBar，0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
//顶部工具条停靠在窗口边，左右工具条停靠其下
else
m_wndDIgBar.SetWindowPos( ＆wndTop,0,0,0,0,SWP
_NOSIZE|SWP_NOMOVE);// 停靠在最顶部
RecalcLayout();//重新显示窗口
m_bDialogTop=!m_bDialogTop;//改变变量标志
}
void CMainFrame::OnUpdateButtonDIgbartop(CCmdUI*pCmdUI)
{//设置菜单项检查状态更新函数
pCmdUI －SetCheck(m_bDialogTop);
}
这样，就可利用菜单项来控制定制工具条的顶部停靠位置了。
(张晓渝）