MFC中如果隐藏/不显示工具条CMFCToolBar的标题栏和关闭按钮

问题背景

CMFCToolBar是可以停靠的工具条,当停靠时,不显示标题栏、标题以及关闭按钮,而当处于悬浮状态时,这些内容优又会显示出来,下面两张图分别是停靠和悬浮状态。

那如何实现悬浮状态下也不显示(隐藏/取消) 标题栏、标题、关闭按钮呢,这个问题还是有一些难度的。经过大量的网络搜索之后,虽然有找到明确的答案,但确实发现了一些灵感。通过反复的试验和修改,终于把这个问题解决了,主要代码整理如下。

解决方法

1、继承CPaneFrameWnd类


class CMyPaneFrameWnd : public CPaneFrameWnd
{
	DECLARE_SERIAL(CMyPaneFrameWnd)

public:
	CMyPaneFrameWnd();

	virtual void RecalcCaptionHeight() override;

};

CMyPaneFrameWnd::CMyPaneFrameWnd()
{
	m_nCaptionHeight = 2;
}

void CMyPaneFrameWnd::RecalcCaptionHeight()
{
	m_nCaptionHeight = GetSystemMetrics(SM_CYSMCAPTION) + CMFCVisualManager::GetInstance()->GetCaptionButtonExtraBorder().cy;
	m_nCaptionHeight = 2;
	m_sizeMinSize.cx = m_sizeMinSize.cy = m_nCaptionHeight + 15;
}

添加CMyPaneFrameWnd 类来继承CPaneFrameWnd,CPaneFrameWnd就是当CMFCToolBar浮动时背后的那个对话框,我们看到的标题栏也就是他的。

核心代码是

m_nCaptionHeight = 2;

顾名思义,将标题栏的高度改为2,接近为零,几乎不绘制了。如果再小,工具条边框宽度会上下不对称,如果再大,标题栏又出来了。

2、继承CMFCToolBar类

class CMyMFCToolBar : public CMFCToolBar
{
public:
	CMyMFCToolBar();
};

CMyMFCToolBar::CMyMFCToolBar()
{
	SetMiniFrameRTC(RUNTIME_CLASS(CMyPaneFrameWnd));

	SetPermament(TRUE);
}

其中,

SetMiniFrameRTC(RUNTIME_CLASS(CMyPaneFrameWnd));

用于告诉主框架,我要使用 CMyPaneFrameWnd作为工具条浮动时背后的窗口,从而可以控制标题栏的宽度。

SetPermament(TRUE);

用于设置不显示右上角的关闭按钮,其实是为了让CanBeClosed()虚函数返回false,从而不绘制关闭按钮。

3、不显示标题

CMyMFCToolBar  m_toolbar;

m_toolbar.SetWindowText("");

将标题设置为空,否则虽然标题栏很矮,但仍然会显示一点文字,很不美观。

结论

如果隐藏CMFCToolBar工具条的标题栏,网上没有明确的解决方案。

通过查看MFC源码和反复验证,实现了该特性。继承CPaneFrameWnd类,重写其RecalcCaptionHeight虚函数,控制标题栏高度。继承CMFCToolBar类,隐藏关闭按钮并使用继承CPaneFrameWnd的子类。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值