4

デフォルトのテーマで XP を実行する Delphi 2006 で作成された MDI アプリケーションがあります。

MDI 子の外観を制御して、各ウィンドウの大きな XP スタイルのタイトル バーを回避する方法はありますか?

の を に設定しようとしましたが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 インターフェイスなどを作成する) を使用する必要があるという良い議論があります。私はよくそうしますが、ここで概念を説明するのは必要以上に複雑です。

HTH

于 2008-08-12T14:10:18.430 に答える
0

ないと思います。私の経験では、Delphi の MDI は非常に厳密に制限され、VCL での実装によって (そしておそらく Windows API によっても) 制御されます。たとえば、MDI の子を非表示にしようとしたり (しようとすると例外が発生し、それを回避するにはいくつかの API フープをジャンプする必要があります)、MDI の子のメイン メニューの方法を変更したりしないでください。ホストフォームとマージされます。

これらの制限を考えると、そもそもなぜ特別なタイトル バーが必要なのかを再考する必要があるのではないでしょうか? この MDI が標準化されているのには、それなりの理由もあると思います --- ユーザーはそれを高く評価するかもしれません :)

(PS: ここで Delphi の質問を見てうれしいです!)

于 2008-08-12T13:06:23.987 に答える
0

ありがとう

残念ながら、クライアントは MDI と小さいタイトル バーを要求しています。

ウィンドウのCreateParamsをオーバーライドしてタイトルバーを非表示にし、独自のタイトルバー(移動用のマウス処理を備えた単純なパネル)を作成するという1つの方法を考え出しました。十分に機能するので、クライアントで実行して、動作するかどうかを確認できると思います...

于 2008-08-12T13:58:52.853 に答える