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

被折叠的 条评论
为什么被折叠?



