Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Titelleiste der Form ausblenden, aber Rahmen beibehalten (https://www.delphipraxis.net/143423-titelleiste-der-form-ausblenden-aber-rahmen-beibehalten.html)

Keks 15. Nov 2009 22:03


Titelleiste der Form ausblenden, aber Rahmen beibehalten
 
Ich würde gerne die Titelleiste einer Form ausblenden, den Rahmen und Schatten aber beibehalten (Vista/7).
Gleichzeitig darf der Besucher die Formgröße nicht ändern können (Mouseover am Rand soll gar nicht erst die Resize-Mausicons zeigen).

Hier ein Beispiel aus Windows7:
http://windows7news.com/wp-content/u.../09/7stack.jpg

Ich habe mich jetzt durch diverse Beispiele und Forumseinträge gewälzt und bekomme das nicht hin. Entweder es ist alles weg, oder mit Darstellungsfehlern oder die Größe bleibt änderbar...

Jemand eine konkrete Lösung?

DSCHUCH 26. Mär 2010 20:19

Re: Titelleiste der Form ausblenden, aber Rahmen beibehalten
 
Hast Du hierfür eine Lösung gefunden? ich stehe derzeit vor dem gleichen Problem,

Viele Grüße.

Keks 26. Mär 2010 20:27

Re: Titelleiste der Form ausblenden, aber Rahmen beibehalten
 
Nein, leider nicht. Ich habe es vorerst aufgeschoben und mich an andere Baustellen gemacht, weil ich keine Lösung dafür hatte.
Für Lösungsvorschläge wäre ich immer noch sehr dankbar.

Klaus01 26. Mär 2010 20:41

Re: Titelleiste der Form ausblenden, aber Rahmen beibehalten
 
Hallo,

Form ohne Leisten
BorderStyle auf bsNone setzen und auf die Form ein Bild mit den Rändern plazieren?

Grüße
Klaus

DSCHUCH 26. Mär 2010 20:50

Re: Titelleiste der Form ausblenden, aber Rahmen beibehalten
 
Hallo Klaus,

das ist keine wirkliche Lösung, oder willst du für jedes Windows Layout was es inzwischen gibt ein Bild nachzeichnen und dann alles hin und herschalten?

Viele Grüße.

Sir Rufo 26. Mär 2010 21:04

Re: Titelleiste der Form ausblenden, aber Rahmen beibehalten
 
Damit geht die Titelleiste weg ... aber so richtig hübsch sieht es noch nicht aus
Delphi-Quellcode:
procedure TForm1.FormCreate( Sender : TObject );
  begin
    SetWindowLong( Handle, GWL_STYLE, GetWindowLong( Handle, GWL_STYLE ) and not WS_CAPTION );
    ClientHeight := Height;
  end;

samso 27. Mär 2010 22:06

Re: Titelleiste der Form ausblenden, aber Rahmen beibehalten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Meine Idee dazu ist, das vorhandene Hauptfenster durch ein weiteres (rahmenloses) Fenster zu verdecken. Die Größe des zweiten Formulars muss dann entsprechend angepasst werden. Das Ganze ist bestimmt noch optimierbar, aber vielleicht hilft das ja schon weiter. Anbei kleine Demo (getestet mit Delphi 2007+2009). Hier ein Auszug, der das Grundprinzip zeigt:
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin
  Form2 := TForm2.Create(Self);
  ResizeClientForm;
  Form2.Show;
end;

procedure TForm1.ResizeClientForm;
begin
  if Assigned(Form2)
  then begin
    Form2.SetBounds(Left + Glassframe.Left,
                    Top + Glassframe.Top,
                    ClientWidth,
                    ClientHeight + GetSystemMetrics(SM_CYCAPTION));
  end;
end;

procedure TForm1.WMMove(var msg: TWMMove);
begin
  ResizeClientForm;
end;

Namenloser 27. Mär 2010 22:12

Re: Titelleiste der Form ausblenden, aber Rahmen beibehalten
 
Meine Lösung:
Delphi-Quellcode:
procedure TfrmMain.FormCreate(Sender: TObject);
var
  lStyle: cardinal;
begin
  lStyle := WS_POPUP or WS_THICKFRAME;
  SetWindowLong(Handle, GWL_STYLE, lStyle);
  SetWindowPos(Handle, 0, 0, 0, 0, 0, SWP_FRAMECHANGED or SWP_NOMOVE or
    SWP_NOREPOSITION or SWP_NOSIZE or SWP_NOACTIVATE);
end;
[edit]
Ach sorry, hab nicht gelesen, dass es nicht in der Größe veränderbar sein darf.
[/edit]

Keks 27. Mär 2010 23:13

Re: Titelleiste der Form ausblenden, aber Rahmen beibehalten
 
@NamenLozer
Also das geht ja schon in die richtige Richgung. Es müsste ja "nur" noch das Resizen deaktiviert werden.

Jetzt habe ich eine halbe Stunde lang mit den ganzen WS_... Werten herumgespielt. Aber entweder es war kein Rahmen mehr da, es war nur der Rahmen da aber mit Resize oder es war der Rahmen da ohne Resize, aber dafür mit Programmleiste oben. Irgendwo muss doch da der Trick sein...

Vielleicht hat ja jemand mehr Erfolg beim Ausprobieren...

Tryer 27. Mär 2010 23:38

Re: Titelleiste der Form ausblenden, aber Rahmen beibehalten
 
Probier mal lStyle := WS_DLGFRAME

Grüsse, Dirk

Namenloser 28. Mär 2010 00:13

Re: Titelleiste der Form ausblenden, aber Rahmen beibehalten
 
Du könntest auch einfach mal versuchen mit einem Tool wie WinSpy die Style-Eigenschaften des Beispielfensters aus dem 1. Beitrag auszulesen.

Keks 28. Mär 2010 00:34

Re: Titelleiste der Form ausblenden, aber Rahmen beibehalten
 
Wenn ich da bei "Styles" schaue, steht da "noch nicht implementiert"... Oder übersehe ich, wo das stehen könnte?
Ich hatte vorhin noch "Winspector" versucht, aber da konnte ich das Fenster nicht auswählen, weil sich das immer automatisch schließt, sobald man außerhalb klickt und ich wusste nicht, wie man das sonst auswählen könnte.

Wenns jemand anders ausprobieren möchte: Das besagte Fenster kommt, wenn man in Win7 auf ein Icon in der Taskleiste rechtsklickt oder wenn man auf die Uhr linksklickt. (gibt natürlich noch mehr Möglichkeiten). Das mit der Uhr könnte übrigens auch in Vista gehen, bin mir aber nicht mehr sicher.

himitsu 28. Mär 2010 08:36

Re: Titelleiste der Form ausblenden, aber Rahmen beibehalten
 
Zitat:

Zitat von NamenLozer
[edit]
Ach sorry, hab nicht gelesen, dass es nicht in der Größe veränderbar sein darf.
[/edit]

Für sowas gibt es auch noch die Constraints.

samso 28. Mär 2010 09:41

Re: Titelleiste der Form ausblenden, aber Rahmen beibehalten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Eine weitere Möglichkeit wäre folgende: (Auch hier ist aber mindestens Delphi 2007 erforderlich)

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    procedure WMNCCALCSIZE(var msg: TWMNCCalcSize); message WM_NCCALCSIZE;
  public
  end;

....

procedure TForm1.WMNCCALCSIZE(var msg: TWMNCCalcSize);
begin
  msg.CalcValidRects := True;
  msg.Result := 0;
end;
Dies erzeugt dann zunächst mal ein rahmenloses Fenster. Der Glassrahmen wird dann mit Hilfe der Eigenschaft "Glassframe" wieder hinzugefügt.

Edit:
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin
  if IsCompositionActive //Aero aktiv?
  then begin
    GlassFrame.Enabled := True;
    GlassFrame.Left := GetSystemMetrics(SM_CXSIZEFRAME);
    GlassFrame.Right := GetSystemMetrics(SM_CXSIZEFRAME);
    GlassFrame.Top := GetSystemMetrics(SM_CYSIZEFRAME);
    GlassFrame.Bottom := GetSystemMetrics(SM_CYSIZEFRAME);
  end;
end;
Edit:
Bei älteren Delphi-Version muss man vermutlich die Funktion "DwmExtendFrameIntoClientArea" bemühen, um den Glassrahmen in dem Clientbereich zu erzeugen.

Keks 28. Mär 2010 23:13

Re: Titelleiste der Form ausblenden, aber Rahmen beibehalten
 
Zitat:

Zitat von samso
Bei älteren Delphi-Version muss man vermutlich die Funktion "DwmExtendFrameIntoClientArea" bemühen, um den Glassrahmen in dem Clientbereich zu erzeugen.

Ich verwende Delphi 2006 Pro. GlassFrame habe ich also nicht zur Verfügung. Mit DwmExtendFrameIntoClientArea habe ich jetzt ein bisschen herumgespielt, aber damit bekomme ich das auch nicht hin. Ich war zwar soweit, dass ich den Glas-Rand überall auf 5px gesetzt habe, aber dann waren am oberen Rand die drei Buttons auf der rechten Seite immer noch vorhanden, aber halbwegs schön auf 5px verkleinert ... dafür ohne Funktion. :(
Kannst Du das bei Dir mal testen, ob Du das geschickter hinbekommst?

turboPASCAL 29. Mär 2010 01:59

Re: Titelleiste der Form ausblenden, aber Rahmen beibehalten
 
Liste der Anhänge anzeigen (Anzahl: 2)
Eigentlich ist das doch recht einfach zu erstellen.
Dazu den Borderstyle im OI auf bsNone stellen und die Form der Form von
Hand festlegen.

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    // ...
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure CreateParams(var Params: TCreateParams); override;
    procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
  end;

// ...

implementation

// ...

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := WS_POPUP or WS_THICKFRAME;
  Params.ExStyle := WS_EX_TOOLWINDOW;
end;

procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
begin
  inherited;
  Message.Result := htClient;
end;
Wie der "originale" Windowsstyle ist kann man leider nur vermuten, da es sich nicht um irgend welche
besonderen Windowsstyle-Eigenschaften handelt (Bild).
Möglicher weise wird das MS so oder anders machen... ;)

Keks 29. Mär 2010 02:33

Re: Titelleiste der Form ausblenden, aber Rahmen beibehalten
 
Jaaa! Perfekt, vielen, vielen Dank! :D
Sieht sogar in XP noch vernünftig aus.

MuTzE.Y85 14. Mai 2013 10:14

AW: Re: Titelleiste der Form ausblenden, aber Rahmen beibehalten
 
turboPASCAL genau das habe ich gesucht! :)
Ich danke dir!

Ich habe mir das Fenster der Tray Apps nochmal angesehen.
Macht optisch keinen Unterschied, aber es ist genau so eingestellt:

Zitat:

Zitat von turboPASCAL (Beitrag 1010468)
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    // ...
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure CreateParams(var Params: TCreateParams); override;
    procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
  end;

// ...

implementation

// ...

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := WS_POPUP or WS_SIZEBOX or WS_BORDER or WS_MINIMIZEBOX;
  Params.ExStyle := WS_EX_TOOLWINDOW or WS_EX_TOPMOST or WS_EX_WINDOWEDGE;
end;

procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
begin
  inherited;
  Message.Result := htClient;
end;

EDIT: Wenn ein Eintrag in der Taskleiste gewünscht ist, dann einfach noch "WS_EX_APPWINDOW" hinzufügen.
Code:
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.Style := WS_POPUP or WS_THICKFRAME or WS_DLGFRAME or WS_MINIMIZEBOX;
  Params.ExStyle := WS_EX_TOOLWINDOW or WS_EX_TOPMOST or WS_EX_WINDOWEDGE or WS_EX_APPWINDOW;
end;

010101 28. Nov 2014 11:17

AW: Titelleiste der Form ausblenden, aber Rahmen beibehalten
 
das hier klappt gut beim xp...

http://www.delphipraxis.net/379391-post1.html

gibt es auch ne möglichkeit den windows rahmen bei der MessageDlgPos wegzubekommen?


mfg

mkinzler 28. Nov 2014 11:19

AW: Titelleiste der Form ausblenden, aber Rahmen beibehalten
 
Alos den Rahmen ausblenden, diesen aber trotzdem anzeigen?

010101 28. Nov 2014 18:31

AW: Titelleiste der Form ausblenden, aber Rahmen beibehalten
 
Zitat:

Alos den Rahmen ausblenden, diesen aber trotzdem anzeigen?
also den form rahmen hab ich weg. es geht nur noch um der rahmen von MessageDlgPos.

http://picload.org/image/coccwoc/rahmen.png

mfg

himitsu 30. Nov 2014 18:17

AW: Titelleiste der Form ausblenden, aber Rahmen beibehalten
 
Und wieso nicht die Lösungen von dort?
http://www.delphipraxis.net/143423-t...ibehalten.html

Wenn man das bei einem Standarddialog nicht anwenden kann, dann muß man den Dialog eben selber erstellen.
z.B. eine eigene TForm oder Delphi-Referenz durchsuchenCreateMessageDialog usw.

Und Bilder bitte anhängen, denn wenn in 2 Jahren jemand das gleiche Problemn hat oder einfach nur diesen Thread findet, dann ist das externe Bild bestimmt weg.

hathor 30. Nov 2014 18:32

AW: Titelleiste der Form ausblenden, aber Rahmen beibehalten
 
Geht das damit:
http://www.delphitricks.com/source-c...ption_bar.html

Kann es leider nicht testen: DELPHI kaputt...:(:(:(


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz