Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi GetSystemMetrics - Rahmen eines Fensters (https://www.delphipraxis.net/167471-getsystemmetrics-rahmen-eines-fensters.html)

Premaider 31. Mär 2012 14:35

GetSystemMetrics - Rahmen eines Fensters
 
Hey Leute ich möchte die Größe eines externen Fensters bearbeiten, doch Delphi7 rechnet den Rand mit dazu. Ich will nur den hier rot markieren Bereich in der Größe ändern.
Bild: http://img6.imagebanana.com/img/3t2b...dImage.php.png

Dazu müsste ich ja GetSystemMetrics verwenden.
Ich bin so weit:
Delphi-Quellcode:
var
 HWND:THandle;
 Breite:Integer;
 Hoehe:Integer;
 BorderWidth:Integer;
 BorderHeight:Integer;
begin
  BorderHeight:= 2 * GetSystemMetrics(SM_CXBORDER);
  BorderWidth:= GetSystemMetrics(SM_CYBORDER) + GetSystemMetrics(SM_CYCAPTION);
  Hoehe:= BorderHeight + SpinEdit1.Value;
  Breite:= BorderWidth + SpinEdit2.Value;
  HWND := FindWindow(nil, PChar(Edit1.Text));
  SetWindowPos(HWND,HWND_TOPMOST,0,0,Breite,Hoehe,SWP_NOMOVE);
end;
Er startet ganz normal, dennoch wird der Rand dazugerechnet und nicht nur der rote Bereich.
Was könnte der Fehler sein ?

Dalai 31. Mär 2012 14:41

AW: GetSystemMetrics - Rahmen eines Fensters
 
Probier's mal mit GetSystemMetrics(SM_CXSIZEFRAME).

MfG Dalai

Premaider 31. Mär 2012 14:49

AW: GetSystemMetrics - Rahmen eines Fensters
 
Sieht jetzt so aus:
Delphi-Quellcode:
var
 HWND:THandle;
 Width:Integer;
 Height:Integer;
 List: TStrings;
begin
  List := TStringList.Create;
  If Edit10.text='Breite' Then MessageDlg('Du hast keine Breite eingegeben', mtError, [mbOK], 0)
  Else If Edit11.text='Höhe' Then MessageDlg('Du hast keine Höhe eingegeben', mtError, [mbOK], 0)
  Else If ((Edit10.text<>'Breite') and (Edit11.text<>'Höhe')) Then Begin
  Width:= StrToInt(Edit10.text) + GetSystemMetrics(SM_CXSIZEFRAME);
  Height:= StrToInt(Edit11.text)+ GetSystemMetrics(SM_CYSIZEFRAME);
  HWND := FindWindow(nil, PChar(Edit1.Text));
  SetWindowPos(HWND,HWND_NOTOPMOST,0,0,Width,Height,SWP_NOMOVE);
  end;
  try
      List.Add(Edit10.Text);
      List.Add(Edit11.Text);
      List.Add(Edit1.Text);
      List.SaveToFile('C:\Program Files\Premaider\Multifunktionstool\InhaltGröße.txt');
   finally
     List.Free;
   end;
end;
1280x720 eigegeben. 1272x690 Pixel herrausbekommen

himitsu 31. Mär 2012 14:54

AW: GetSystemMetrics - Rahmen eines Fensters
 
MSDN-Library durchsuchenAdjustWindowRectEx

Premaider 31. Mär 2012 15:00

AW: GetSystemMetrics - Rahmen eines Fensters
 
Könntest du mir bitte erklären wie ich dort dann die Größe eintrage. Ich kann nie was aus der Doku rauslesen, bin noch n Anfänger :(

himitsu 31. Mär 2012 15:10

AW: GetSystemMetrics - Rahmen eines Fensters
 
Damit kann man natürlich keine Fenstergröße ändern, wie man im MSDN nachlesen kann. :roll:
Zitat:

Calculates the required size of the window rectangle, based on the desired size of the client rectangle. The window rectangle can then be passed to the CreateWindowEx function to create a window whose client area is the desired size.
Aber es macht genau das, was du willst.

Aus der Fenstergröße die Größe des Clientbereichs berechnen.

Der umgekehrte Weg ist auch einfach.
- aktuelle Fenstergröße nehmen,
- das ClientRect berechnen lassen
- die Different von WindowsRect und ClientRect ergibt das Offset, welches man dazurechnen muß, wenn man aus dem ClientRect das WindowRect berechnen will.



Ansonsten mußt du aufpassen, welchen Fenstertyp man vor sich hat, wenn man es unbedingt selber berechnen will, wie z.B. ob ScrollBars sichtbar sind und ob es einen Offset (inneren Abstand) für den Clientberech gibt.
- unterschiedliche Fenstertypen haben unterschiedliche Rahmen (schau dir mal den BorderStyle deiner TForms an)
- Scrollleisten verkleinern auch den Klientbereich
- usw.

Premaider 31. Mär 2012 15:21

AW: GetSystemMetrics - Rahmen eines Fensters
 
Ich verstehe aber nicht wie ist das bei mir unterzubringen habe :S

Premaider 31. Mär 2012 16:23

AW: GetSystemMetrics - Rahmen eines Fensters
 
Könntet ihr mir vllt ein Beispiel geben ?

Dalai 31. Mär 2012 17:05

AW: GetSystemMetrics - Rahmen eines Fensters
 
Delphi-Quellcode:
var rect: TRect;
rect.bottom:= 720;
rect.top:= 0;
rect.left:= 0;
rect.right:= 540;
AdjustWindowRectEx(rect, WS_OVERLAPPEDWINDOW, False, 0);
Mit den Werten für dwStyle und dwExStyle musst du rumspielen bzw. lesen, welche Konstanten nötig sind (mit OR verknüpfen!).

Wie die damit entstandenen Werte zu benutzen sind, sollte klar sein:
Delphi-Quellcode:
HWND := FindWindow(nil, PChar(Edit1.Text));
SetWindowPos(HWND,HWND_NOTOPMOST,0,0,rect.right - rect.left, rect.bottom - rect.top,SWP_NOMOVE);
Übrigens solltest du mehr auf Exception-Handling achten, denn ein StrToInt() kann bei Eingabe von Nicht-Ziffern eine solche werfen. Beachte außerdem, dass eben dieses Exception-Handling in meinem Beispiel der Einfachheit halber ebenfalls fehlt.


Ich verstehe allerdings den Sinn hinter deinem Code noch nicht ganz. Du willst das Attribut OnTop eines fremdes Fenster setzen? Oder geht's dir um die Größe? Oder beides gleichzeitig? Wenn's nur um OnTop geht, dann setze doch die Werte für Width und Height auf 0.

MfG Dalai

Premaider 31. Mär 2012 18:50

AW: GetSystemMetrics - Rahmen eines Fensters
 
Hab in den Edits nur Zahleneingaben zugelassen. Allerdings habe ich den Begriff OR noch nie gehört xD

€: Bei größeren Werten wie 1280x720 stimmt alles.
Bei kleinen Werten wie 111x111 stimmt es nicht (112x110)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:35 Uhr.
Seite 1 von 2  1 2      

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