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

有没有办法控制 MDI 子项的外观以避免每个窗口上出现 XP 风格的大标题栏?

我尝试过设置 BorderStyleMDIChildrenbsSizeToolWin 但它们仍然呈现为普通表单。

有帮助吗?

解决方案

您所需要的一切 - 重载过程 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.

其他提示

MDI 的工作方式与您想要做的事情并不相符。

如果您需要“MDI”格式,您应该考虑使用内置或 商业的 对接包,并使用对接设置来模仿 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 接口或其他东西)。我经常这样做,但它比在这里解释这个概念所需的要复杂。

华泰

我认为不存在;根据我的经验,Delphi 中的 MDI 受到其在 VCL 中的实现(也许还受 Windows API?)的严格限制和控制。例如,不要尝试隐藏 MDI 子项(如果尝试,您将遇到异常,并且必须跳过几个 API 环才能解决该问题),或者更改 MDI 子项主菜单的方式与主机表单合并。

考虑到这些限制,也许您应该重新考虑为什么您首先想要有特殊的标题栏?我想这个 MDI 东西被标准化也是有充分理由的 --- 你的用户可能会喜欢它:)

(附:很高兴在这里看到德尔福问题!)

感谢 onnodb

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top