MFC - 当最大化子窗口的标题很长时,MDI 主框架标题被截断

Posted

技术标签:

【中文标题】MFC - 当最大化子窗口的标题很长时,MDI 主框架标题被截断【英文标题】:MFC - MDI main frame title is truncated when maximized child window has very long title 【发布时间】:2013-01-12 01:24:05 【问题描述】:

我有一个使用 MDI 的 MFC 应用程序,类似于 MFC Scribble 示例/教程。当子窗口最大化时,主框架窗口的标题/标题会自动调整,以便附加子窗口的标题,如“Scribble - [Scribb1]”。当子窗口的标题很长时,会被截断。整个标题的长度似乎限制在 160 个字符左右。有没有办法增加这个限制并显示更多字符?我想覆盖 WM_NCPAINT 以重绘标题是一种方法,但如果有的话,我更喜欢其他简单的解决方案。我已经尝试覆盖 OnUpdateFrameTitle(),但它似乎不适用于整个组合标题。

【问题讨论】:

【参考方案1】:

重写 OnUpdateFrameTitle 并调用自己的 UpdateFrameTitleForDocument 实现将不起作用。 Amit 在发布之前就已经尝试过您的解决方案。

这甚至没有被 MFC 实现。 MFC 没有引入 MDI 窗口。自从我记得作为 Windows 操作系统的一部分以来,MDI 框架窗口就存在了。

MFC 内部的默认 MFC 实现根据需要调用定义为 DefFrameProc 的特殊 MDI 窗口过程。

Windows 实现出于某种神秘原因将窗口文本(显示在 MDI 框架的标题栏上)截断为 160 个字符,包括在处理 WM_SETTEXT 消息时终止 0。这可能是旧计算机的残余,没有太多内存可浪费,所有缓冲区大小都保持在最低限度。

这可能是旧计算机的残余物,没有太多内存可浪费,所有缓冲区大小都保持在最低限度,文件名总共 8.3 个 12 个字符。

要满足您的要求并显示全文,您必须进行一些更改。

幸运的是,我找到了改变这种行为的非常简单的方法,符合我的 MEMC 要求。

在您的主框架类中重写 DefWindowProcan 并更改代码如下:

LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)

    if(WM_SETTEXT == message)
    
        // if set text (called from UpdateFrameTitleForDocument)
        // do not call DefWindowProc
        return CWnd::DefWindowProc(message, wParam, lParam);
    

    // otherwise call DefWindowProc that in turn calls DefFrameProc
    return CMDIFrameWndEx::DefWindowProc(message, wParam, lParam);

现在构建并运行。

这适用于 MFC 应用的 classinc 和 Visual Studio 样式。

【讨论】:

非常感谢您的解决方案!它使我可以灵活地相应地更改/设置文本。我已经尝试过了,它可以很好地满足我的需要。 如果您仍然感兴趣,还有另一种可能的解决方案here【参考方案2】:

看看 CFrameWnd::OnUpdateFrameTitle 内部调用 CFrameWnd::UpdateFrameTitleForDocument() 方法。它会变魔术。它是一种虚拟方法。您可以在 CMainFrm 类中覆盖 OnUpdateFrameTitle 并根据需要设置窗口标题。

如果您不知道,MFC 库是完全随源提供的。 CFrameWnd 源在 winfrm.cpp 中(搜索此文件,您将了解 PC 上 MFC 的源)

【讨论】:

以上是关于MFC - 当最大化子窗口的标题很长时,MDI 主框架标题被截断的主要内容,如果未能解决你的问题,请参考以下文章

使用具有多个***窗口的 MFC MDI

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

混合 mfc 对话框和 mdi 项目的调试构建崩溃

mfc中MDI模式下实现单文档多视图多窗口

MFC:将 CSplitterWnd 应用到我的 CChildFrame 后,主窗口标题不再更新

在 MFC MDI 程序中拆分子窗口