2008-08-12 20 views
3

Ich habe eine MDI-Anwendung in Delphi 2006 geschrieben, die XP mit dem Standardthema ausgeführt wird.Delphi MDI-Anwendung und die Titelleiste der MDI Kinder

Gibt es eine Möglichkeit, das Aussehen der MDI Children zu kontrollieren, um die große XP-Stil Titelleiste in jedem Fenster zu vermeiden?

Ich habe versucht, die BorderStyle von MDIChildren auf bsSizeToolWin zu setzen, aber sie werden immer noch als normale Formulare gerendert.

Antwort

4

Alle Ihre Notwendigkeit - Überlastung Prozedur Create, wie folgt aus:

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. 
0

Ich glaube nicht, dass es gibt; Meiner Erfahrung nach ist MDI in Delphi streng limitiert und kontrolliert durch seine Implementierung in der VCL (und vielleicht auch durch die Windows API?). Versuchen Sie beispielsweise nicht, ein MDI-Kind zu verstecken (Sie erhalten eine Ausnahme, wenn Sie es versuchen, und Sie müssen durch ein paar API-Rahmen springen, um dies zu umgehen) oder die Art und Weise ändern, wie das MDI-Kind das Hauptmenü aufruft wird mit den Host-Forms zusammengeführt.

Angesichts dieser Einschränkungen, sollten Sie vielleicht überlegen, warum Sie in erster Linie spezielle Titelleisten haben möchten? Ich denke, es gibt auch gute Gründe, warum diese MDI Sachen standardisiert --- Benutzer könnte es zu schätzen wissen :)

(PS: schön, eine Delphi Frage hier zu sehen)

0

Dank onnodb

Leider besteht der Kunde auf MDI und der kleineren Titelleiste.

Ich habe eine Möglichkeit ausgearbeitet, die Titelleiste durch Überschreiben der Fenster CreateParams zu verstecken und dann meine eigene Titelleiste zu erstellen (einfaches Panel mit etwas Maushandling zum Verschieben). Funktioniert gut genug, ich denke, ich könnte es vom Client ausführen und sehen, ob es tun wird ...

1

Die Art und Weise, MDI funktioniert nicht Gel mit was Sie versuchen zu tun.

Wenn Sie das "MDI" -Format benötigen, sollten Sie entweder das integrierte oder ein commercial Docking-Paket in Betracht ziehen und das Docking-Setup verwenden, um das MDI-Feeling nachzuahmen.

In meinen Delphi-Anwendungen verwende ich häufig TFrames und ersetze sie zum Hauptformular und maximiere sie, damit sie den Kundenbereich einnehmen. Dies gibt Ihnen etwas, ähnlich wie Outlook aussieht. Es geht ein wenig etwas wie folgt aus:

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; 

es zu benutzen, können Sie dies einfach tun:

MyForm.CurrentModule := TSomeFrame.Create(nil); 

Es ist ein gutes Argument, das Sie Schnittstellen (Erstellen einer IModule Schnittstelle oder etwas) verwenden sollten das du benutzt. Ich mache das oft, aber es ist komplexer als nötig, um das Konzept hier zu erklären.

HTH