【MFC】 CControlBar如何实现横向/竖向控件条和动态摆放?

MFC 专栏收录该内容
16 篇文章 0 订阅

【MFC】CControlBar如何实现横向/竖向控件条和动态摆放?

前言

在设计对话框时,有时会需要引入工具栏(控件条),那么该如何让我们想要的控件条称为顶边工具栏或者侧边栏?这是我们本次要讨论的问题。

说明

类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_CXSCREENSM_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函数内创建的顺序,来依次摆放。

  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值