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 Form mit bsSingle unter Aero zu groß (https://www.delphipraxis.net/159936-form-mit-bssingle-unter-aero-zu-gross.html)

uligerhardt 19. Apr 2011 12:05


Form mit bsSingle unter Aero zu groß
 
Hallo miteinander!

Mir ist gerade aufgefallen, dass meine Form mit BorderStyle = bsSingle unter Windows 7/Aero um 10 Pixel zu hoch gezeichnet wird. Wenn ich also Height := 100 setze, erhalte ich auf dem Bildschirm eine Höhe von 110 Pixeln. (Vermutlich ist das das gleiche Problem wie in http://www.delphipraxis.net/114442-v...t-angeben.html.) Mit BorderStyle = bsSizeable habe ich den Effekt nicht, und unter Windows Classic oder Aero Basic auch nicht.

Blöd ist das u.a. deshalb, wenn ich einer bsSizeable-Form die gleiche Größe wie der bsSingle-Form verpassen will. Wenn ich einfach
Delphi-Quellcode:
Form2.Height := Form1.Height
setze, wird die zweite Form 10 Pixel kleiner als die erste.

Hat jemand eine Idee, wie ich die "Spezialbehandlung" ausschalten kann, oder wenigstens einen Workaround?

EDIT: Ich hab mittlerweile das und das gefunden.

EDIT2:
Delphi-Quellcode:
const
  DWMWA_EXTENDED_FRAME_BOUNDS = 9;

function DwmGetWindowAttribute(hwnd: HWND; dwAttribute: DWORD; pvAttribute: Pointer; cbAttribute: DWORD): HResult; stdcall;
  external 'dwmapi.dll';


 var
  r: TRect;
begin
  DwmGetWindowAttribute(Handle, DWMWA_EXTENDED_FRAME_BOUNDS, @r, SizeOf(r));
liefert tatsächlich ein Rechteck, das in jeder Richtung um 5 Pixel über BoundsRect hinausgeht.

-187- 19. Apr 2011 12:25

AW: Form mit bsSingle unter Aero zu groß
 
Setzt du die Attribute erst zur Laufzeit ?

uligerhardt 19. Apr 2011 12:39

AW: Form mit bsSingle unter Aero zu groß
 
Zitat:

Zitat von -187- (Beitrag 1096019)
Setzt du die Attribute erst zur Laufzeit ?

Die von der ersten Form (die mit der falschen Größe gezeichnet wird) nicht. Die Größe der zweiten Form wird hier gesetzt:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Form2: TForm2;
begin
  Form2 := TForm2.Create(Self);
  try
    Form2.Height := Height;
    Form2.Width := Width;
    Form2.Top := Top;
    Form2.Left := Left + 20;
    Form2.ShowModal;
  finally
    Form2.Free;
  end;
end;
Der Rest kommt ebenfalls aus der DFM.

uligerhardt 19. Apr 2011 14:07

AW: Form mit bsSingle unter Aero zu groß
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hier mal mein Testprojekt:
  1. Neues VCL-Projekt anlegen.
  2. Im OI Form1.Height auf 100 und Form1.BorderStyle auf bsSingle setzen.
  3. Neues Formular hinzufügen (Form2).
  4. Button auf Form1 mit folgendem OnClick-Handler:
    Delphi-Quellcode:
    const
      DWMWA_EXTENDED_FRAME_BOUNDS = 9;

    function DwmGetWindowAttribute(hwnd: HWND; dwAttribute: DWORD; pvAttribute: Pointer; cbAttribute: DWORD): HResult; stdcall;
      external 'dwmapi.dll';

    procedure TForm1.Button1Click(Sender: TObject);
    var
      Form2: TForm2;
      r: TRect;
    begin
      //DwmGetWindowAttribute(Handle, DWMWA_EXTENDED_FRAME_BOUNDS, @r, SizeOf(r));
      r := BoundsRect;
      OffsetRect(r, 20, 0);

      Form2 := TForm2.Create(Self);
      try
        Form2.BoundsRect := r;
        Form2.ShowModal;
      finally
        Form2.Free;
      end;
    end;
Das liefert folgendes:Anhang 33976
Kommentiert man die Zeile
Delphi-Quellcode:
r := BoundsRect;
aus und aktiviert dafür den Dwm-Aufruf, so erhält man:Anhang 33977

Wäre nett, wenn das mal jemand unter Delphi XE ausprobieren könnte - vielleicht ist das Problem da ja gar nicht mehr vorhanden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:11 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