Domanda

Ho un'applicazione MDI scritta in Delphi 2006 che esegue XP con il tema predefinito.

Esiste un modo per controllare l'aspetto dei figli MDI per evitare la grande barra del titolo in stile XP su ogni finestra?

Ho provato a impostare il BorderStyle del MDIChildren A bsSizeToolWin ma sono ancora resi come moduli normali.

È stato utile?

Soluzione

Tutto ciò di cui hai bisogno: procedura di sovraccarico CreateWindowHandle, in questo modo:

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.

Altri suggerimenti

Il modo in cui funziona MDI non si adatta a ciò che stai cercando di fare.

Se hai bisogno del formato "MDI", dovresti prendere in considerazione l'utilizzo del formato integrato o a commerciale pacchetto docking e utilizza la configurazione docking per imitare la sensazione MDI.

Nelle mie app Delphi, utilizzo spesso TFrames e li inserisco nel modulo principale, massimizzandoli in modo che occupino l'area client.Questo ti dà qualcosa di simile a come appare Outlook.Funziona più o meno così:

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;

Per usarlo, puoi semplicemente fare questo:

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

C'è una buona argomentazione secondo cui dovresti usare le interfacce (creando un'interfaccia IModule o qualcosa del genere) che usi.Lo faccio spesso, ma è più complesso del necessario spiegare il concetto qui.

HTH

Non penso che ci sia;nella mia esperienza, MDI in Delphi è strettamente limitato e controllato dalla sua implementazione nella VCL (e forse anche dall'API di Windows?).Ad esempio, non provare a nascondere un figlio MDI (se ci provi otterrai un'eccezione e dovrai passare attraverso un paio di passaggi API per aggirare il problema) o a cambiare il modo in cui il menu principale di un figlio MDI viene unito con quello del modulo host.

Date queste limitazioni, forse dovresti riconsiderare il motivo per cui vorresti avere barre del titolo speciali in primo luogo?Immagino che ci siano anche buone ragioni per cui questo materiale MDI è standardizzato: i tuoi utenti potrebbero apprezzarlo :)

(PS:bello vedere una domanda Delphi da queste parti!)

Grazie onnodb

Sfortunatamente il client insiste su MDI e sulla barra del titolo più piccola.

Ho trovato un modo per farlo, ovvero nascondere la barra del titolo sovrascrivendo i CreateParams di Windows e quindi creare la mia barra del titolo (pannello semplice con alcune gestioni del mouse per lo spostamento).Funziona abbastanza bene quindi penso che potrei eseguirlo dal client e vedere se funzionerà...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top