我有一个使用 MDI 的 MFC 应用程序,类似于 MFC Scribble 示例/教程。当子窗口最大化时,主框架窗口的标题/标题会自动调整,以便附加子窗口的标题,如“Scribble - [Scribb1]”。当子窗口的标题很长时,会被截断。整个标题的长度似乎限制在 160 个字符左右。有没有办法增加这个限制并显示更多字符?我想覆盖 WM_NCPAINT 来重绘标题是一种方法,但如果有的话,我更喜欢其他简单的解决方案。我已经尝试覆盖 OnUpdateFrameTitle() 并且它似乎不适用于整个组合标题。
2 回答
覆盖 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 样式。
看看内部调用 CFrameWnd::UpdateFrameTitleForDocument() 方法的 CFrameWnd::OnUpdateFrameTitle。它会变魔术。它是一种虚拟方法。您可以在 CMainFrm 类中覆盖 OnUpdateFrameTitle 并根据需要设置窗口标题。
如果您不知道,MFC 库是完全随源提供的。CFrameWnd 源代码在 winfrm.cpp 中(搜索此文件,您将了解您的 PC 上 MFC 的源代码在哪里)