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

时间:2013-01-12 01:24:05

标签: winapi mfc

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

2 个答案:

答案 0 :(得分:2)

重写OnUpdateFrameTitle并调用UpdateFrameTitleForDocument的自己的实现将不起作用。阿米特在发布之前就已经尝试了你的解决方案。

MFC甚至没有实现。 MFC不引入MDI窗口。 MDI框架窗口存在,因为我记得是Windows操作系统的一部分。

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

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

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

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

幸运的是,我发现改变这种行为非常简单,符合我的MEMC要求。

在主框架类中,覆盖DefWindowProcand,按如下所示更改代码:

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样式。

答案 1 :(得分:1)

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

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