前言
在设计对话框时,有时会需要引入工具栏(控件条),那么该如何让我们想要的控件条称为顶边工具栏或者侧边栏?这是我们本次要讨论的问题。
说明
类CControlBar是所有控件条类(CStatusBar、CToolBar、CDialogBar、CReBar和COleResizeBar)的基类。
控件条一般是一个在框架窗口左边或右边的窗口。它可以包括子项,如基于HWND的控件(生成和响应消息的Windows窗口)和非基于HWND的控件(不是窗口,由应用代码或框架代码处理)。列表框和编辑控件就是基于HWND的,而状态条面板和位图按钮就不是基于HWND的。
控件条窗口通常是父框架窗口的子窗口,并属于框架窗口的客户视图区或MDI客户。CControlBar对象采用父窗口客户矩形区的参数来定位。它会通知父窗口客户区中还有多少未占用的空间。
实现
1、工具栏类的创建
创建一个子类继承自CControlBar类
class CToolBar:public CControlBar
{
public:
CToolBarPanel(void);
~CToolBarPanel(void);
public:
CSize m_sizeDefault; //窗口size的缺省值
public:
virtual CSize CalcFixedLayout(BOOL bStretch, BOOL bHorz);
};
CToolBar::CToolBarPanel(void)
{
//通过设定控件条x,y的尺寸来控制控件条的摆放方式
//垂直控件条
m_sizeDefault = CSize(GetSystemMetrics(SM_CXSCREEN), 40);
//水平控件条
m_sizeDefault = CSize(40, GetSystemMetrics(SM_CYSCREEN));
}
CToolBar::~CToolBarPanel(void)
{
}
CSize CToolBar::CalcFixedLayout(BOOL bStretch, BOOL bHorz)
{
return m_sizeDefault;
}
CalcFixedLayout(BOOL bStretch, BOOL bHorz):
这个函数常用来计算一个controlbar的水平尺寸
返回值是controlbar的尺寸,比方return CSize(200,200)表示Controlbar的尺寸是200X200
像素的大小;
两个参数表示controlbar在主框架内摆放方式;具体MSDN中有个表,有:横向摆放,横向扩展;纵向
摆放,纵向扩展;横向摆放,禁止扩展;纵向摆放,禁止扩展四种方式
GetSystemMetrics( __in intnIndex):
是一个计算机函数,该函数只有一个参数,称之为「索引」,这个索引有75个标识符,通过设置不同的标识符就可以获取系统分辨率、窗体显示区域的宽度和高度、滚动条的宽度和高度。
SM_CXSCREEN、SM_CYSCREEN 以像素为单位计算的屏幕尺寸(x、y轴)。
此处使用GetSystemMetrics函数是为了能够更灵活的定义控件条的尺寸,达到初始化时自适应摆放窗口大小的目的。
2、动态摆放
主函数内:
CToolBar m_ToolBar;
主函数的OnCreat函数内添加一下代码:
if (!m_ToolBar.Create(this))
{
TRACE0("未能创建工具栏\n");
return -1;
}
//在主窗口左边停靠
m_ToolBar.EnableDocking(CBRS_ALIGN_LEFT );
CControlBar::EnableDocking(DWORD dwStyle)
调用这个函数来启用一个控制栏是停靠。双方指定必须匹配一方支持对接在目的地框架窗口,或控制杆不能停靠,框架窗口。
功能:
使框架窗口中的可停靠控件条可用。
参数:
dwStyle 指明框架窗口的那一边作为控件条的停靠点。可选值如下:
参数 | 描述 |
---|---|
CBRS_ALIGN_TOP | 可停靠到用户区顶部 |
CBRS_ALIGN_BOTTOM | 可停靠到用户区底部 |
CBRS_ALIGN_LEFT | 可停靠到用户区左边 |
CBRS_ALIGN_RIGHT | 可停靠到用户区右边 |
CBRS_ALIGN_ANY | 可停靠到用户区任意一边 |
这样即可实现工具栏的动态摆放和创建。
另外,如果你需要使用多个工具栏组合时,按照上面的方法创建多个工具栏,编译器会根据工具栏在OnCreate函数内创建的顺序,来依次摆放。