2008-08-12 9 views
3

J'ai une application MDI écrite en Delphi 2006 qui exécute XP avec le thème par défaut.Delphi MDI Application et la barre de titre des enfants MDI

Existe-t-il un moyen de contrôler l'apparence de MDI Children pour éviter la grande barre de titre de style XP sur chaque fenêtre?

J'ai essayé de placer le BorderStyle du MDIChildren à bsSizeToolWin mais ils sont encore rendus comme les formes normales.

Répondre

4

Tous vos besoins - procédure surcharge CreateWindowHandle, comme ceci:

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

Je ne pense pas qu'il y en ait; D'après mon expérience, MDI dans Delphi est très strictement limité et contrôlé par son implémentation dans la VCL (et peut-être aussi par l'API Windows?). Par exemple, n'essayez pas de cacher un enfant MDI (vous obtiendrez une exception si vous essayez, et vous devrez passer par quelques cerceaux API pour contourner cela), ou changer la façon dont le menu principal d'un enfant MDI est fusionné avec la forme de l'hôte. Compte tenu de ces limitations, peut-être devriez-vous reconsidérer la raison pour laquelle vous aimeriez avoir des barres de titre spéciales en premier lieu? Je suppose qu'il ya aussi de bonnes raisons pour lesquelles ce genre de choses MDI est standardisé --- vos utilisateurs peuvent apprécier :)

(PS: agréable de voir une question Delphi ici)

0

Merci onnodb

Malheureusement, le client insiste sur MDI et la plus petite barre de titre.

J'ai développé une façon de le faire qui est de cacher la barre de titre en remplaçant les fenêtres CreateParams et ensuite créer ma propre barre de titre (panneau simple avec un peu de manipulation de la souris pour le déplacement). Fonctionne assez bien donc je pense que je pourrais le lancer par le client et voir si cela va faire ...

1

La façon dont fonctionne MDI ne gèle pas avec ce que vous essayez de faire.

Si vous avez besoin du format "MDI", vous devriez envisager d'utiliser le module d'amarrage intégré ou commercial, et d'utiliser la configuration de l'ancrage pour imiter la sensation MDI.

Dans mes applications Delphi, j'utilise fréquemment des TFrames et je les mets en relation avec le formulaire principal, en les maximisant pour qu'elles occupent la zone client. Cela vous donne quelque chose de similaire à l'apparence d'Outlook. Il va un petit quelque chose comme ceci:

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; 

Pour l'utiliser, vous pouvez simplement faire ceci:

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

Il y a un bon argument que vous devez utiliser des interfaces (créant une interface IModule ou quelque chose) que vous utilisez. Je fais souvent cela, mais c'est plus complexe que nécessaire pour expliquer le concept ici.

HTH

Questions connexes