質問

Delphi 2006 で書かれた MDI アプリケーションを持っており、デフォルトのテーマで XP を実行します。

各ウィンドウに大きな XP スタイルのタイトル バーが表示されるのを避けるために、MDI 子の外観を制御する方法はありますか?

設定してみました 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 を頻繁に使用し、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

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

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

(追伸:ここで Delphi の質問を見ることができてうれしいです!)

ありがとう。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top