修改MDI主窗口的标题栏

当MDI子窗口最大化时,主窗口标题通常显示为'主窗口标题 - 子窗口标题'。要改变此行为,可在创建MDI主窗口时将其标题设置为NULL,并阻止MFC自动设置标题。此外,还需要响应WM_GETTEXT消息来定制标题内容。对于MFC,可以在PreCreateWindow()中设置标题并在DefWindowProc()中处理WM_GETTEXT;对于VCL,可在CreateParams()中设置Caption并处理WM_GETTEXT消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >





当MDI子窗口最大化后,其主窗口的标题会变成:
     主窗口标题 - [子窗口标题]

如何改变这一行为呢?
经观察发现,如果在创建窗口时设置其标题为NULL,则这个窗口在画它的标题栏时会调用 WM_GETTEXT,所以我们只需做两件事情:
    1. 创建窗口时设其标题为 NULL
          MFC:
          BOOL CMainFrame::PreCreateWindow( CREATESTRUCT& cs)
          {
                if (! CMDIFrameWnd::PreCreateWindow(cs))
                      return FALSE;
                cs.lpszName = NULL;
                return TRUE;
          }
          还要防止 MFC 自己设置主窗口的标题,这要去掉 OnUpdateFrameTitle()
          void CMainFrame::OnUpdateFrameTitle( BOOL)
          {}

          VCL:
          procedure TMainForm.CreateParams( var Params: TCreateParams); override;
          procedure TMainForm.CreateParams( var Params: TCreateParams);
          begin
                inherited;
                Params.Caption := nil;
          end;

    2. 响应 WM_GETTEXT
          MFC:
          LRESULT CMainFrame::DefWindowProc( UINT message, WPARAM wParam, LPARAM lParam)
          {
                if (message == WM_GETTEXT)
                {
                      LPCTSTR text = _T(" Hello");
                      lstrcpy(( LPTSTR)lParam, text);
                      return lstrlen(text);
                }
                return CMDIFrameWnd::DefWindowProc(message, wParam, lParam);
          }
         
          VCL:
          procedure WMGetText( var m: TWMGetText); message WM_GETTEXT;
          procedure WMGetText(var m: TWMGetText);
          const
             cap : String = ' Hello';
          begin
                strpcopy(m.text, cap);
                m.result := length(cap);
          end;

微软的网站上有对这一主题的讨论,但有一些谬误及不足:1.CFrameWnd::OnUpdateFrameTitle 不能解决这个问题;2. 在 InitializeComponent() 的最后,应该把 this.Text = "Form1" 这一行去掉(IDE 生成的代码会有这一行)。

Link:
    1. Parent and Child Window Captions


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值