当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