Delphi MDI-Anwendung und der Titelleiste des MDI-Kinder
Frage
Ich habe eine MDI-Anwendung, geschrieben in Delphi 2006 läuft XP mit der Standard-theme.
Gibt es eine Möglichkeit zum Steuern der Darstellung des MDI Kinder, um die große XP-Stil Titelleiste der einzelnen Fenster?
Ich habe versucht, die Einstellung der BorderStyle
der MDIChildren
zu bsSizeToolWin
aber Sie werden immer noch gerendert als normale Formen.
Lösung
Alle Ihre Notwendigkeit - überlast procedure CreateWindowHandle, wie diese:
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.
Andere Tipps
Die Art und Weise MDI funktioniert nicht gel mit dem, was Sie zu tun versuchen.
Wenn Sie benötigen die "MDI" - format, sollten Sie erwägen, entweder mit dem gebaut-in-oder kommerziellen docking Paket, und verwenden Sie die docking-setup-zu imitieren, die MDI fühlen.
In meinem Delphi-apps, die ich Häufig verwenden Sie TFrames und Eltern Sie zu die wichtigsten form, und maximieren Sie Sie, so dass Sie den client-Bereich.Dies gibt Ihnen etwas ähnlich wie in Outlook sieht.Es geht ein wenig so etwas wie dieses:
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;
Um es zu benutzen, Sie können einfach tun diese:
MyForm.CurrentModule := TSomeFrame.Create(nil);
Es gibt ein gutes argument, dass, sollten Sie die Verwendung von Schnittstellen (Erstellung einer Schnittstelle IModule oder etwas), die Sie verwenden.Ich oft tun, aber es ist komplexer als nötig zu erklären, das Konzept hier.
HTH
Ich glaube nicht, dass es ist;in meiner Erfahrung, MDI in Delphi ist sehr streng begrenzt und kontrolliert deren Umsetzung in der VCL (und vielleicht auch von der Windows-API?).Zum Beispiel, versuchen Sie nicht, versteckt sich ein MDI-Kind (Sie erhalten eine Ausnahme, wenn Sie versuchen, und Sie haben zu springen durch ein paar API-Reifen um, dass die Arbeit), oder ändern die Art und Weise ein untergeordnetes MDI-Haupt-Menü ist verschmolzen mit die host form ist.
Angesichts dieser Einschränkungen, sollten Sie vielleicht überdenken, warum Sie möchten, um spezielle Titel-bars in den ersten Platz?Ich denke, es gibt auch gute Gründe, warum dies MDI Sachen ist genormt --- Ihre Benutzer könnten es schätzen :)
(PS:schön zu sehen, Delphi Frage rund um hier!)
Dank onnodb
Leider ist der AUFTRAGGEBER besteht auf MDI und die kleinere Titelleiste.
Ich habe einen Weg, es zu tun ist, um die Titelleiste auszublenden durch überschreiben der windows CreateParams und erstellen meine eigene Titelleiste (einfaches Bedienfeld mit einigen Maus-handling für den Umzug).Funktioniert gut genug also, ich denke, ich könnte es starten, indem Sie den client und sehen, ob Sie tun...