2014-10-02 119 views
2

我一直在环顾四周,我一直无法找到任何可行的解决方案。如何在MDI框架上显示和隐藏标题栏?

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

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丝带,因为它明显地改变了它的渲染方式。

+0

你是什么意思的“对飞”?你能展示你想要的东西吗? – rrirower 2014-10-03 12:44:12

+0

@rrirower:“在飞行中”,首先定义[here](http://idioms.thefreedictionary.com/on+the+fly)__同时某人或某人正在操作或移动。 *我将尽力捕捉数据* .__。一个图像?我想要一个MDI框架(MDI应用程序的主窗口)有一个标题栏,下一个没有标题栏。图像真的有必要吗? – Adrian 2014-10-03 14:58:01

+1

取决于您是否需要帮助。你想删除标题文本并保留框架样式,或者改变框架样式并删除文本?您的描述不清楚。至少,不是我...... – rrirower 2014-10-03 15:42:51

回答

1

我的答案是唯一有效的。 风格标记不影响色带条实施的主要原因是色带条绘制自己的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; 
} 

这导致的效果你想 enter image description here

+0

但是我可以随意打开和关闭吗?我怎样才能做到这一点? – Adrian 2014-10-06 14:12:28

+0

对不起,但简单的答案是:不!(据我所见)看看源代码(BCG + MFC),变量m_bReplaceFrameCaption被声明为const BOOL,所以它只能在构造时定义一次。因此,您可以在构建程序期间打开或关闭它...我从未试图摧毁已经构建好的色带栏并尝试重新创建它。这将是解决这个问题的唯一机会。另外功能IsReplaceFrameCaption是不是虚拟的,不可覆盖... – xMRi 2014-10-06 14:19:28

+0

Hrm。不管怎么说,还是要谢谢你。 :( – Adrian 2014-10-06 14:51:46

0

这会吗?以下代码将生成您在下图中看到的内容。我在子窗口中选择了一个事件来演示代码。如果您使用MFC功能条执行或执行BCG

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); 
    } 

,其结果是....

enter image description here

+0

不,不是。我根本不需要标题栏。不只是空白。 – Adrian 2014-10-03 20:22:58

+0

我想你可能会走运。修改其他样式往往会破坏窗口(例如,主菜单丢失)。 – rrirower 2014-10-03 20:24:10

+0

实际上,您可能可以尝试重新调整窗口矩形的大小以删除标题栏的空间。工作足够疯狂。 – rrirower 2014-10-03 20:26:00