如何在 MDI 框架的运行中显示和隐藏标题栏?

Posted

技术标签:

【中文标题】如何在 MDI 框架的运行中显示和隐藏标题栏?【英文标题】:How to show and hide the titlebar on the fly of an MDI frame? 【发布时间】:2014-10-02 20:13:26 【问题描述】:

我一直在四处寻找,但找不到任何可行的解决方案。

我尝试使用所有这些都没有成功:

GetMDIFrame()->ModifyStyle(WS_CAPTION, 0);
GetMDIFrame()->ModifyStyle(WS_CAPTION, 0, SWP_DRAWFRAME|SWP_FRAMECHANGED);
SetWindowLong(hwnd, GWL_STYLE, ::GetWindowLong(hwnd, GWL_STYLE) & ~(WS_BORDER | WS_DLGFRAME | WS_THICKFRAME));
SetWindowLong(hwnd, GWL_EXSTYLE, ::GetWindowLong(hwnd, GWL_EXSTYLE) & ~WS_EX_DLGMODALFRAME)

有谁知道如何去掉 MDI 框架的标题栏?没有文本或栏(这包括没有最小化、最大化和关闭按钮),只有一个粗边框可以调整它的大小。

我也碰巧在使用 BCG 功能区,因为这显然会影响它的呈现方式。

【问题讨论】:

“即时”是什么意思?你能展示一张你想要的图片吗? @rrirower:“在飞行中”,第一个定义here 当某物或某人正在操作或移动时。 我将尝试即时捕获数据。一个图像?我想要一个 MDI 框架(MDI 应用程序的主窗口)有一个标题栏,然后没有标题栏。图片真的有必要吗? 取决于您是否需要帮助。您要删除标题文本并保留框架样式,还是更改框架样式并删除文本?你的描述不清楚。至少,对我来说不是…… @rrrower,哦,我明白了。我想保留框架样式,但丢失标题栏。没有文本或栏(这包括没有最小化、最大化和关闭按钮),只有一个粗边框可以调整它的大小。谢谢。 【参考方案1】:

我的回答只有在您使用 MFC Ribbon Bar 实现或 BCG 实现时才有效。 样式标志不影响功能区栏实现的主要原因是功能区栏绘制了自己的 NC 区域。实际上没有“窗口标题”。

您需要初始化您的 CMFCRibbonBar,并将 bReplaceFrameCaption 设置为 FALSE。

CMainFrame::CMainFrame()
     : m_wndRibbonBar(FALSE)

覆盖 CMainFrame:PreCreateWindow 并设置您想要的样式。

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

  if( !CBCGPMDIFrameWnd::PreCreateWindow(cs) )
    return FALSE;

  cs.style = WS_POPUPWINDOW;

  return TRUE;

这会产生你想要的效果

【讨论】:

但是我可以随意开关吗?我该怎么做? 很抱歉,但简单的答案是:不! (据我所见)查看源代码(BCG + MFC),变量 m_bReplaceFrameCaption 被声明为 const BOOL ,因此它只能在构造时定义一次。因此,您可以在构建程序的过程中打开或关闭它……我从未尝试破坏已经构建的功能区并尝试重新创建它。这将是解决这个问题的唯一机会。此外,函数 IsReplaceFrameCaption 不是虚拟的,也不是可覆盖的...... 人力资源部。不管怎么说,还是要谢谢你。 :( 等等!这可以为孩子做吗? IE。我可以以类似的方式删除孩子的标题栏吗? 孩子?你说什么孩子。该框架在 CMainFrame 窗口的非客户端区域中显示。【参考方案2】:

这样可以吗?以下代码生成您在下图中看到的内容。我在子窗口中选择了一个事件来演示代码。

void CChildFrame::OnSysCommand(UINT nID, LPARAM lParam)
    
    // TODO: Add your message handler code here and/or call default

    CMDIChildWnd::OnSysCommand(nID, lParam);

    CMDIFrameWnd* pFrame = GetMDIFrame();
    pFrame->SetWindowTextW(_T(""));
    pFrame->ModifyStyle(WS_MAXIMIZEBOX, 0);
    pFrame->ModifyStyle(WS_MINIMIZEBOX, 0);
    pFrame->ModifyStyle(WS_SYSMENU, 0);
    

结果是……

【讨论】:

不,不是。我根本不想要标题栏。不只是空白。 我认为你可能不走运。修改其他样式往往会损坏窗口(例如,主菜单丢失)。 实际上,您可以尝试重新调整窗口矩形的大小以删除标题栏的空间。工作简直太疯狂了。 其实我不在乎菜单。我正在使用丝带,无论如何主丝带都必须消失。 嗯,重新调整窗口矩形的大小是什么意思?您能解释一下或举例说明吗?

以上是关于如何在 MDI 框架的运行中显示和隐藏标题栏?的主要内容,如果未能解决你的问题,请参考以下文章

如何在离子框架中动态隐藏/显示导航栏?

如何让您的 MDI MFC 应用程序在任务栏中显示一个实例?

如何使用 MFC 分别创建两个窗口?

winform mdi子窗口不显示标题栏

如何以编程方式在 iOS 13 中隐藏和显示状态栏?

如何在我的 Access 2016 数据库中隐藏菜单栏并仅显示正在运行的表单