状态栏总在CDialogBar上方的问题解决方法

状态栏总在CDialogBar上方的问题解决方法


场景: 一个VC单文档工程中在文档底部创建一个CDialogBar, 并且要求CDialogBar不能被拖放停靠, 

这就是要实现如图的效果:

状态栏总在CDialogBar上方的问题解决方法_第1张图片


按照步骤创建CDialogBar, 发现状态栏在CDialogBar的上方. 如图所示

状态栏总在CDialogBar上方的问题解决方法_第2张图片


解决方法如下:

1. CMainFrame::OnCreate中创建代码

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_TOOLTIPS) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	// RightBar的创建 注意创建风格
	if (!m_RightBar.Create(this, CRightBar::IDD, 
		CBRS_RIGHT | CBRS_TOOLTIPS | CBRS_HIDE_INPLACE | CBRS_FLYBY | CBRS_FLOATING, CRightBar::IDD))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}
	// BottomBar的创建 注意创建风格
	if (!m_BottomBar.Create(this, CBottomBar::IDD, 
		CBRS_BOTTOM | CBRS_TOOLTIPS | CBRS_HIDE_INPLACE | CBRS_FLYBY | CBRS_FLOATING, CBottomBar::IDD))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	if (!m_wndStatusBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_BOTTOM) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}

	//////////////////////////////////////////////////////////////////////////////////////
	// 这下面两段代码就是使ControlBar停靠在状态栏上方的代码
	// 如果不添加这两段代码, 状态栏就会乱跑.. 但是, 上面的创建代码创建ControlBar的属性
	// 是不可拖放停靠的, 如果加了下面两段代码, ControlBar却变成了可以拖
	// 放停靠, 可以悬浮出来.
	// 现在的解决办法就是重载ControlBar的鼠标左键单击消息和鼠标左键双击消息.
	m_RightBar.EnableDocking(CBRS_ALIGN_RIGHT);
	EnableDocking(CBRS_ALIGN_RIGHT);
	DockControlBar(&m_RightBar);

	m_dlgBottomBar.EnableDocking(CBRS_ALIGN_BOTTOM);
	EnableDocking(CBRS_ALIGN_BOTTOM);
	DockControlBar(&m_BottomBar);
	//////////////////////////////////////////////////////////////////////////////////////
	// TODO: Delete these three lines if you don't want the toolbar to be dockable
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar);
	return 0;
}

1. 重载ControlBar的鼠标左键单击消息和鼠标左键双击消息.

void CRightBar::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	// 屏蔽掉父类的OnLButtonDown
	//CDialogBar::OnLButtonDown(nFlags, point);
}

void CRightBar::OnLButtonDblClk(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	// 屏蔽掉父类的OnLButtonDblClk
	//CDialogBar::OnLButtonDblClk(nFlags, point);
}

void CBottomBar::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	// 屏蔽掉父类的OnLButtonDown
	//CDialogBar::OnLButtonDown(nFlags, point);
}

void CBottomBar::OnLButtonDblClk(UINT nFlags, CPoint point)
{
	// TODO: Add your message handler code here and/or call default
	// 屏蔽掉父类的OnLButtonDblClk
	//CDialogBar::OnLButtonDblClk(nFlags, point);
}

其实原理就是, 工具栏或者ControlBar的拖放停靠功能需要鼠标点击或者双击消息来处理的, 把它们拦截掉就行了. 

  如果拖放停靠有快捷键的话, 那就还要拦截快捷键


现在还没有找到治本的方法.


参考:(收到这篇文章的启发的)

http://www.vckbase.com/index.php/wv/359


你可能感兴趣的:(状态栏总在CDialogBar上方的问题解决方法)