Delphi MDI アプリケーションと MDI 子のタイトルバー
質問
Delphi 2006 で書かれた MDI アプリケーションを持っており、デフォルトのテーマで XP を実行します。
各ウィンドウに大きな XP スタイルのタイトル バーが表示されるのを避けるために、MDI 子の外観を制御する方法はありますか?
設定してみました BorderStyle
の MDIChildren
に bsSizeToolWin
ただし、通常のフォームとしてレンダリングされます。
解決
必要なものはすべて、次のように 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をオーバーライドしてタイトルバーを非表示にし、独自のタイトルバー(移動用のマウス処理を備えた単純なパネル)を作成することです。十分にうまく機能するので、クライアントで実行して、うまくいくかどうかを確認してみようと思います...