デフォルトのテーマで XP を実行する Delphi 2006 で作成された MDI アプリケーションがあります。
MDI 子の外観を制御して、各ウィンドウの大きな XP スタイルのタイトル バーを回避する方法はありますか?
の を に設定しようとしましたが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 を頻繁に使用し、それらをメイン フォームの親として使用し、それらを最大化してクライアント領域を占有します。これにより、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 が標準化されているのには、それなりの理由もあると思います --- ユーザーはそれを高く評価するかもしれません :)
(PS: ここで Delphi の質問を見てうれしいです!)
ありがとう
残念ながら、クライアントは MDI と小さいタイトル バーを要求しています。
ウィンドウのCreateParamsをオーバーライドしてタイトルバーを非表示にし、独自のタイトルバー(移動用のマウス処理を備えた単純なパネル)を作成するという1つの方法を考え出しました。十分に機能するので、クライアントで実行して、動作するかどうかを確認できると思います...