BGRA Ribbon

Zur Vorstellung von Komponenten und Units für Lazarus
Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: BGRA Ribbon

Beitrag von Soner »

coasting hat geschrieben:...
Ich habe eine neue Version im ersten Post hochgeladen. Die ist nun Resizable und Moveable. Allerdings fehlt noch der Schatten der Form.
..


Deaktiviere dein Code hier:

Code: Alles auswählen

 
procedure TfrmMain.FormActivate(Sender: TObject);
begin
{ von Soner: Nich nötig!
  if not FormStyleModifyDone then
    begin
      SetWindowLong(Handle,GWL_STYLE, GetWindowLong(Handle, GWL_STYLE) and not WS_CAPTION);
      // Sample instruction to force Redraw (including title area)
      //   There are probably smarter solutions
//      MoveWindow(Handle, Left, Top, Width-1, Height, True);
      FormStyleModifyDone := True;
    end;}

 
end;
 


Und füge hier einige Zeilen:

Code: Alles auswählen

 
procedure TfrmMain.FormCreate(Sender: TObject);
begin
{ TODO : Loading / Saving of configuration -> TXMLConfig}
 
  BorderStyle:=bsNone;
  //Füge die nächsten 3 Zeilen hinzu ------------------------------------
  // vergiß uses LCLIntf; nicht.
  SetWindowLong(Handle,GWL_STYLE, GetWindowLong(Handle, GWL_STYLE) or WS_THICKFRAME);
  ClientHeight:=Height;
  Refresh;
  // ------------------------------------ bis hier
//  Doublebuffered := True;   
 

Dann hast du dein Schatten, aber mit Windowsstandardrahmen.

Ich glaube wenn, man das Professional machen will kommt man nicht um nicht-Client-Bereiche selbst zu zeichnen. Du kannst im Internet nach "wm_ncpaint" und "wm_nccalcsize" suchen.

coasting
Beiträge: 21
Registriert: Mi 30. Apr 2014, 14:32

Re: BGRA Ribbon

Beitrag von coasting »

Soner hat geschrieben:
Deaktiviere dein Code hier:

Code: Alles auswählen

 
procedure TfrmMain.FormActivate(Sender: TObject);
begin
{ von Soner: Nich nötig!
  if not FormStyleModifyDone then
    begin
      SetWindowLong(Handle,GWL_STYLE, GetWindowLong(Handle, GWL_STYLE) and not WS_CAPTION);
      // Sample instruction to force Redraw (including title area)
      //   There are probably smarter solutions
//      MoveWindow(Handle, Left, Top, Width-1, Height, True);
      FormStyleModifyDone := True;
    end;}

 
end;
 


Und füge hier einige Zeilen:

Code: Alles auswählen

 
procedure TfrmMain.FormCreate(Sender: TObject);
begin
{ TODO : Loading / Saving of configuration -> TXMLConfig}
 
  BorderStyle:=bsNone;
  //Füge die nächsten 3 Zeilen hinzu ------------------------------------
  // vergiß uses LCLIntf; nicht.
  SetWindowLong(Handle,GWL_STYLE, GetWindowLong(Handle, GWL_STYLE) or WS_THICKFRAME);
  ClientHeight:=Height;
  Refresh;
  // ------------------------------------ bis hier
//  Doublebuffered := True;   
 

Dann hast du dein Schatten, aber mit Windowsstandardrahmen.

Ich glaube wenn, man das Professional machen will kommt man nicht um nicht-Client-Bereiche selbst zu zeichnen. Du kannst im Internet nach "wm_ncpaint" und "wm_nccalcsize" suchen.



Danke für den Tipp!

Welche Windows Version nutzt Du? Ich habe das Problem, das ich in Windows 10 dann einen weißen Rand am oberen Fenster habe und das die Form ein Stück kleiner wird, sobald ich ich die Titelleiste anklicke.

Siehe hier:
Screenshot
Screenshot
Screenshot.png (8.29 KiB) 4385 mal betrachtet

Gibts dafür eine Erklärung und evtl. eine Lösung?

Habe mittlerweile noch einen anderen Weg gefunden einen Schatten hinzubekommen.

Siehe hier:
Screenshot 2
Screenshot 2

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: BGRA Ribbon

Beitrag von wp_xyz »

coasting hat geschrieben:Hmm... komisch. Wenn ich auf den Link klicke, wird die Seite angezeigt.

Aaah, geht - es war die Firefox-Erweiterung NoScript...

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: BGRA Ribbon

Beitrag von Soner »

Ich habe Windows 7 hier am Desktop. Beim mir ändert sich der Button Rechts unten, aber ich denke das hat mit dein Code zu tun, hier das Bild vor und nach:
Screenshot
Screenshot

Ich lade mal das Beispiel von mir hoch.
Dateianhänge
FormTitellos.zip
(63.56 KiB) 234-mal heruntergeladen

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: BGRA Ribbon

Beitrag von Soner »

Bei dieser Vorgehensweise hast du auch das Problem, dass es beim maximieren den Bildschirm ganz verdeckt, deshalb muss man die Position und Größe von Windowstaskleiste bestimmen und des eigene Formular beim Maximieren entsprechend verkleinern.
Für das Position und Größenänderung des eigenen Formular brauchst du die WM_WINDOWPOSCHANGED-Nachricht von Windows.

https://msdn.microsoft.com/en-us/library/bb688195

coasting
Beiträge: 21
Registriert: Mi 30. Apr 2014, 14:32

Re: BGRA Ribbon

Beitrag von coasting »

Soner hat geschrieben:Bei dieser Vorgehensweise hast du auch das Problem, dass es beim maximieren den Bildschirm ganz verdeckt, deshalb muss man die Position und Größe von Windowstaskleiste bestimmen und des eigene Formular beim Maximieren entsprechend verkleinern.
Für das Position und Größenänderung des eigenen Formular brauchst du die WM_WINDOWPOSCHANGED-Nachricht von Windows.

https://msdn.microsoft.com/en-us/library/bb688195


Habe nun folgenden Code für den Maximize Button. Damit wird ein Überzeichnen der Taskbar verhindert:

Code: Alles auswählen

  if frmMain.WindowState=wsNormal then
  begin
    frmMain.WindowState:=wsMaximized;
    { Set Form size to fit on screen and not to hide the taskbar}
    with Screen.WorkAreaRect do
      frmMain.SetBounds(Left, Top, Right - Left, Bottom - Top);
  end
  else
  begin
    frmMain.WindowState:=wsNormal;
  end;
 

coasting
Beiträge: 21
Registriert: Mi 30. Apr 2014, 14:32

Re: BGRA Ribbon

Beitrag von coasting »

Soner hat geschrieben:Ich lade mal das Beispiel von mir hoch.

Vielen Dank!
Habe jedoch auch mit Deinem Beispiel das gleiche Problem in Windows 10. Oben ist ein weißer Rand, rechts und unten wird die Form beschnitten. Irgendwo hatte ich mal gelesen, das ab Windows 8 andere Fenstergeometrien benutzt werden. Werde mal schauen ob ich den Artikel wiederfinde.

coasting

coasting
Beiträge: 21
Registriert: Mi 30. Apr 2014, 14:32

Re: BGRA Ribbon

Beitrag von coasting »

coasting hat geschrieben:
Soner hat geschrieben:Ich lade mal das Beispiel von mir hoch.

Vielen Dank!
Habe jedoch auch mit Deinem Beispiel das gleiche Problem in Windows 10. Oben ist ein weißer Rand, rechts und unten wird die Form beschnitten. Irgendwo hatte ich mal gelesen, das ab Windows 8 andere Fenstergeometrien benutzt werden. Werde mal schauen ob ich den Artikel wiederfinde.

coasting


Habe den Artikel noch nicht gefunden. Daher verwende ich erstmal CS_DROPSHADOW. Ein Update inkl. Sourcecode liegt im ersten Post.

coasting

Soner
Beiträge: 623
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: BGRA Ribbon

Beitrag von Soner »

Das Problem mit Windows 10 habe ich auch (hab eben getestet).
Sieht gut aus. Ich glaube dein Weg ist vernünftiger und ist besser für Crossplatform. Bei meinem Vorgehen hat man standard Windowsrahmen. Wenn man anderen Style will, dann kann man schon gleich neue Rahmen haben.

Ich würde die Funktion streichen:

Code: Alles auswählen

 
function DropShadow(const Handle: THandle): boolean;
 
  function IsXP: boolean;
  begin
    Result := (Win32Platform = VER_PLATFORM_WIN32_NT) and
      ((Win32MajorVersion > 5) or ((Win32MajorVersion = 5) and
      (Win32MinorVersion >= 1)));
  end;
 
const
  SPI_SETDROPSHADOW = $1025;
  CS_DROPSHADOW = $00020000;
begin
  Result := IsXP and SystemParametersInfo(SPI_SETDROPSHADOW, 0, Pointer(True), 0) and
    (SetClassLong(Handle, GCL_STYLE, GetClassLong(Handle, GCL_STYLE) or
    CS_DROPSHADOW) <> 0);
end;
 


Und gleich nur das verwenden:

Code: Alles auswählen

SetClassLong(Handle, GCL_STYLE, GetClassLong(Handle, GCL_STYLE) or  CS_DROPSHADOW);

Die Wahrscheinlichkeit dass irgend jemand Windows 98 nutzt ist gleich Null.
CS_DROPSHADOW ist in Lazarus definiert.

Danke für den Tipp mit Screen.WorkAreaRect, denn hatte ich vergessen.

coasting
Beiträge: 21
Registriert: Mi 30. Apr 2014, 14:32

Re: BGRA Ribbon

Beitrag von coasting »

Soner hat geschrieben:...
Und gleich nur das verwenden:

Code: Alles auswählen

SetClassLong(Handle, GCL_STYLE, GetClassLong(Handle, GCL_STYLE) or  CS_DROPSHADOW);

Die Wahrscheinlichkeit dass irgend jemand Windows 98 nutzt ist gleich Null.
CS_DROPSHADOW ist in Lazarus definiert.
...

Danke! Ist damit auch um Einiges kürzer ;)

Neue Version im ersten Post. Jetzt auch mit Dekoration ;) Habe zudem versucht Linux zu berücksichtigen. Bin mir aber nicht sicher ob die Icons gezeichnet werden. Bitte einmal überprüfen, wenn möglich.

coasting

coasting
Beiträge: 21
Registriert: Mi 30. Apr 2014, 14:32

Re: BGRA Ribbon

Beitrag von coasting »

Update 06.04.2016

+ Fenster ist Resizeable und Moveable ohne Titelleiste
+ Fenster hat einen Schatten (CS_DROPSHADOW)
+ Maximize / Minimize des Fensters, inkl. Doppelklick der Titelleiste
+ Slide-in / Slide-out Effekt der Menus
+ XML Storage zum Abspeichern der Farbe, Größe und Position
+ Fokusstatus des Fensters wird berücksichtigt
+ Systemmenu
+ "Quick Access" Buttons
+ Fensterdeko in der Titelleiste
+ Cross Platform (so hoffe ich)
+ Diverse kleine Verbesserungen

Neue Version liegt im ersten Post.

coasting

Antworten