工具条的停靠控制

发表于:2007-07-14来源:作者:点击数: 标签:
----在VC5.0中 开发 大型应用程序时,工具条通常是程序中必不可少的功能因素,在整个窗口的停靠位置尤其关键,它直接影响到程序界面的外观形象。本文介绍各类工具条停靠位置的控制技巧,供参阅。 ----标准工具条的停靠控制 ----VC5.0应用程序向导生成的框架
----在VC5.0中开发大型应用程序时,工具条通常是程序中必不可少的功能因素,在整个窗口的停靠位置尤其关键,它直接影响到程序界面的外观形象。本文介绍各类工具条停靠位置的控制技巧,供参阅。

----标准工具条的停靠控制

----VC5.0应用程序向导生成的框架代码中,都具有普通工具条的控制方法。正常情况下工具条类CToolBar是控制条类CControlBar的派生类,其显示的初始停靠位置是通过调用继承的函数CControlBar::EnableDocking(DWORDdwStyle)来确定的,其参数dwStyle用来指定停靠的具体位置,与本文有关的格式如下(其余请参阅VC5.0的联机文档):

----CBRS-ALIGN-TOP停靠在框架窗口客户区域顶部;

----CBRS-ALIGN-BOTTOM停靠在框架窗口客户区域底部;

----CBRS-ALIGN-LEFT停靠在框架窗口客户区域左边;

----CBRS-ALIGN-RIGHT停靠在框架窗口客户区域右边;

----CBRS-ALIGN-ANY停靠在框架窗口客户区域任何位置。

----在利用应用程序向导AppWizard生成的应用程序中,其控制代码默认的停靠位置为CBRS-ALIGN-ANY,即允许停靠在框架窗口客户区域的任何边上。工具条在正常显示时停靠在窗口客户区域的顶部,控制指令为EnableDocking(CBRS_ALIGN_ANY)或m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY),注意在实际程序控制时前者必须处于所有其他控制代码的前面,否则浮动工具条或特殊工具条等部分代码可能无法奏效。具体控制方法请参考利用应用程序向导生成的任何一个程序实例框架代码部分中建立的函数ONCREATE()。

----应用程序的单文档和多文档的窗口框架类均由CFrameWnd::EnableDocking(DWORDdwDockStyle)来实现的,其可选的参数除上述五种之外,还增加了CBRS?FLOAT?MULTI参数,该参数主要是为设计浮动工具条而增加的,用来确定一个框架窗口中允许存在多个浮动工具条。同样利用应用程序向导AppWizard生成的应用程序,其默认的停靠位置也是CBRS-ALIGN-ANY,即允许工具条停靠在框架窗口的任何边上,其默认的初始位置为框架窗口的顶部,即EnableDocking(CBRS_ALIGN_ANY)或m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY)。

----浮动工具条的停靠控制

----当一个框架窗口中存在多个标准或浮动工具条时,则需要利用函数voidDockControlBar(CControlBar*pBar,UINTnDockBarID=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中增加如下成员函数定义:

----voidDockControlBarLeftOf(CToolBar*Bar,CToolBar*LeftOf);

----2.在实现文件MainFrm.cpp中增加如下成员函数:

----voidCMainFrame::DockControlBarLeftOf(CToolBar*Bar,CTooIBar*LeftOf)

----{//设置工具条并列停靠在同一条边上

----CRectrect;//矩形区域定义

----DWORDdw;

----UINTn=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:

----BOOLm_bDialogTop;

----并在构造函数中设置初始值;

----3.利用类向导ClassWizard为菜单项设置响应函数;

----4.在实现文件MainFrm.cpp中通过充分利用SetWindowPos()成员完善消息映射功能。


voidCMainFrame::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;//改变变量标志
}
voidCMainFrame::OnUpdateButtonDIgbartop(CCmdUI*pCmdUI)
{//设置菜单项检查状态更新函数
pCmdUI-SetCheck(m_bDialogTop);
}

----这样,就可利用菜单项来控制定制工具条的顶部停靠位置。

原文转自:http://www.ltesting.net