Aplicația MDI Delphi și bara de titlu a copiilor MDI

Am o aplicație MDI scrisă în Delphi 2006, care rulează XP cu tema implicită.

Există o modalitate de a controla aspectul copiilor MDI pentru a evita bara de titlu mare în stilul XP în fiecare fereastră?

Am încercat setarea codului BorderStyle al MDIChildren la bsSizeToolWin , dar acestea sunt încă redate ca forme normale.

0
fr hi bn

4 răspunsuri

Modul în care funcționează MDI nu se îngroapă cu ceea ce încerci să faci.

Dacă aveți nevoie de formatul "MDI", trebuie să luați în considerare utilizarea fie a built-in-ului, fie a unui comerciale și folosiți setarea de andocare pentru a imita simțul MDI.

În aplicațiile mele Delphi, folosesc frecvent TFrames și le pescuiesc în forma principală și maximizându-le astfel încât să intre în zona clientului. Acest lucru vă oferă ceva similar cu modul în care arată Outlook. Merge cam așa:

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;

Pentru ao folosi, puteți face acest lucru:

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

Există un argument bun că trebuie să utilizați interfețe (crearea unei interfețe IModule sau ceva) pe care îl utilizați. Eu fac adesea asta, dar este mai complex decât este necesar pentru a explica conceptul aici.

HTH

0
adăugat

Mulțumesc onnodb

Din păcate, clientul insistă asupra MDI și a barei de titlu mai mici.

Am facut un mod de a face acest lucru, care este de a ascunde bara de titlu prin suprascrierea ferestrelor CreateParams si apoi sa creez propria bara de titlu (panou simplu cu unele Mouse handling pentru a te misca). Funcționează destul de bine, așa că cred că l-aș putea executa de client și să văd dacă o va face ...

0
adăugat

Nu cred că există; din experiența mea, MDI în Delphi este foarte strict limitat și controlat prin implementarea sa în VCL (și probabil și de Windows API?). De exemplu, nu încercați să ascundeți un copil MDI (veți obține o excepție dacă încercați și va trebui să sari peste câteva cercuri API pentru a rezolva problema) sau pentru a schimba modul în care meniul principal al unui copil MDI este fuzionat cu formularul gazdei.

Având în vedere aceste limitări, poate ar trebui să vă revedeți de ce doriți să aveți în primul rând bare de titlu speciale? Cred că există și motive bune pentru care acest lucru este standardizat pentru utilizatorii MDI --- utilizatorii dvs. ar putea aprecia acest lucru :)

(PS: frumos să vezi o întrebare despre Delphi aici!)

0
adăugat

Tot ce ai nevoie - procedura de supraîncărcare CreateWindowHandle, după cum urmează:

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
adăugat