Delphi MDI应用程序和MDI Children的标题栏

时间:2008-08-12 12:10:15

标签: delphi forms mdi

我有一个用Delphi 2006编写的MDI应用程序,它使用默认主题运行XP。

有没有办法控制MDI儿童的外观,以避免每个窗口上的大型XP风格标题栏?

我已尝试将BorderStyle的{​​{1}}设置为MDIChildren,但仍会将其呈现为普通表单。

4 个答案:

答案 0 :(得分:5)

所有你需要的 - 重载程序CreateWindowHandle,如下所示:

unit CHILDWIN;
interface
uses Windows, Classes, Graphics, Forms, Controls, StdCtrls;

type
  TMDIChild = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
    procedure CreateWindowHandle(const Params: TCreateParams); override;
  end;

implementation

{$R *.dfm}
procedure TMDIChild.CreateWindowHandle(const Params: TCreateParams);
begin
  inherited CreateWindowHandle(Params);
  SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
end;
end.

答案 1 :(得分:1)

MDI的工作方式并不适合你想做的事情。

如果您需要“MDI”格式,则应考虑使用内置或commercial对接包,并使用对接设置来模仿MDI感觉。

在我的Delphi应用程序中,我经常使用TFrame并将它们作为主窗体的父级,并最大化它们以便它们占用客户区。这为您提供了类似于Outlook的外观。它有点像这样:

TMyForm = class(TForm)
private
  FCurrentModule : TFrame;
public
  property CurrentModule : TFrame read FModule write SetCurrentModule;
end;

procedure TMyForm.SetCurrentModule(ACurrentModule : TFrame);
begin
  if assigned(FCurrentModule) then
    FreeAndNil(FCurrentModule);  // You could cache this if you wanted
  FCurrentModule := ACurrentModule;
  if assigned(FCurrentModule) then
  begin
    FCurrentModule.Parent := Self;
    FCurrentModule.Align := alClient;
  end;
end;

要使用它,您只需执行此操作:

MyForm.CurrentModule := TSomeFrame.Create(nil);

有一个很好的论据,你应该使用你使用的接口(创建一个IModule接口或其他东西)。我经常这样做,但这比在这里解释这个概念要复杂得多。

HTH

答案 2 :(得分:0)

我不认为有;根据我的经验,Delphi中的MDI受到严格限制,并受其在VCL中的实现控制(也可能是由Windows API实现的?)。例如,不要试图隐藏一个MDI孩子(如果你尝试,你会得到一个例外,你将不得不跳过几个API箍来解决这个问题),或改变MDI孩子的主菜单的方式与主机表单合并。

考虑到这些限制,也许你应该重新考虑为什么你想首先拥有特殊的标题栏?我想也有很好的理由说明为什么这个MDI标准化了 - 你的用户可能会很感激它:)

(PS:很高兴看到这里的Delphi问题!)

答案 3 :(得分:0)

感谢onnodb

不幸的是,客户坚持使用MDI和较小的标题栏。

我已经找到了一种方法,即通过覆盖Windows CreateParams来隐藏标题栏,然后创建我自己的标题栏(带有一些鼠标处理的简单面板用于移动)。工作得很好,所以我想我可以由客户运行它,看它是否会...