4

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

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

我已经尝试将 to 设置为,BorderStyle但它们仍然呈现为普通表单。MDIChildrenbsSizeToolWin

4

4 回答 4

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.
于 2008-10-02T07:33:43.147 回答
2

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 接口或其他东西)。我经常这样做,但这比在这里解释这个概念所需的要复杂得多。

高温高压

于 2008-08-12T14:10:18.430 回答
0

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

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

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

于 2008-08-12T13:06:23.987 回答
0

感谢 onnodb

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

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

于 2008-08-12T13:58:52.853 回答