00. 目录


文章目录


00. 目录01. 案例概述02. 开发环境03. 关键技术04. 程序设计05. 秘笈心法06. 源码下载07. 附录


01. 案例概述

Microsoft Visual C++中对话框资源控件的窗体就是浮动的工具栏,在PhotoShop、Flash、AI等软件中也能看到浮动的工具栏窗体。本案例实现的就是一个浮动的工具栏窗体,效果如下图所示。

【MFC】定制浮动工具栏_vs2019

02. 开发环境

系统环境:​Windows 10

开发环境:​Visual Studio 2019

03. 关键技术

通过MFC向导生成的单文档或多文档应用程序,只要将工具拦向客户区拖动,就可以使工具栏浮动,本实例通过Create方法创建一个工具栏,然后通过FloatControlBar方法控制工具为浮动的工具栏。

CToolBar类的Create方法用于创建一个工具栏

BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE 
| CBRS_TOP, UINT nID = AFX_IDW_TOOLBAR );
参数说明:
upParentWnd:父窗体指针。
dwStyle:窗体的样式,默认情况下取值是WS_CHILD,WS_VISIBLE,CBRS_TOP3个,还有如下取值:
q CBRS_TOP:控制工具栏在顶部。
q CBRS_BOTTOM:控制工具栏在底部。
q CBRS_NOALIGN:控制工具栏不对齐。
q CBRS_TOOLTIPS:工具栏具有提示条。
q CBRS_SIZE_DYNAMIC:工具栏的大小可以改变。
q CBRS_SIZE_FIXED:工具栏的大小固定。
q CBRS_FLOATING:工具栏浮动。
q CBRS_FLYBY:工具栏平坦样式。
q CBRS_HIDE_INPLACE:工具栏不显示。

nID:工具栏在工程中的资源ID,可以使用默认ID值AFX_IDW_TOOLBAR。

CFrameWnd类的FloatControlBar方法用于控制工具栏显示的位置及样式,语法如下:

CFrameWnd* FloatControlBar( CControlBar * pBar, CPoint point, DWORD dwStyle = CBRS_ALIGN_TOP );

参数说明:
upBar:控制栏指针。
point:工具栏所在的控制栏左顶点的显示位置。
dwStyle:工具栏显示样式。

04. 程序设计

(1)新建基于单文档视图MFC的应用程序。

(2)在函数OnCreate中将原有的工具栏设置成浮动工具栏:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;

//创建工具栏
//CBRS_FLOATING为浮动样式
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_FLOATING) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("未能创建工具栏\n");
return -1; // 未能创建
}

//创建状态栏
if (!m_wndStatusBar.Create(this))
{
TRACE0("未能创建状态栏\n");
return -1; // 未能创建
}
m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));

//取消工具栏的停靠方式
m_wndToolBar.EnableDocking(0);
EnableDocking(0);

CRect rect;
//获取窗体区域
GetWindowRect(&rect);
//计算工具栏显示的坐标
CPoint point(rect.left + 100, rect.top + 100);
//将工具栏浮动显示
FloatControlBar(&m_wndToolBar, point, CBRS_ALIGN_LEFT);


// TODO: 如果不需要可停靠工具栏,则删除这三行 必须注释这几行 否则达不到对应的效果
//m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
//EnableDocking(CBRS_ALIGN_ANY);
//DockControlBar(&m_wndToolBar);


return 0;
}

05. 秘笈心法

工具栏的位置


MFC类库中对工具栏的位置进行了宏定义,通过MFC类库函数很容易控制工具栏的位置。用户在用鼠标拖动工具栏的过程中,可以根据鼠标的坐标在窗体区域中的位置来进行工具栏停靠位置的判断,进而实现窗体吸附效果。


06. 源码下载

下载:定制浮动工具栏.rar

07. 附录