AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi GetSystemMetrics - Rahmen eines Fensters
Thema durchsuchen
Ansicht
Themen-Optionen

GetSystemMetrics - Rahmen eines Fensters

Ein Thema von Premaider · begonnen am 31. Mär 2012 · letzter Beitrag vom 1. Apr 2012
Antwort Antwort
Seite 1 von 2  1 2      
Premaider

Registriert seit: 31. Mär 2012
160 Beiträge
 
#1

GetSystemMetrics - Rahmen eines Fensters

  Alt 31. Mär 2012, 15:35
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#2

AW: GetSystemMetrics - Rahmen eines Fensters

  Alt 31. Mär 2012, 15:41
Probier's mal mit GetSystemMetrics(SM_CXSIZEFRAME).

MfG Dalai
  Mit Zitat antworten Zitat
Premaider

Registriert seit: 31. Mär 2012
160 Beiträge
 
#3

AW: GetSystemMetrics - Rahmen eines Fensters

  Alt 31. Mär 2012, 15:49
Sieht jetzt so aus:
Delphi-Quellcode:
var
 HWND:THandle;
 Width:Integer;
 Height:Integer;
 List: TStrings;
begin
  List := TStringList.Create;
  If Edit10.text='BreiteThen MessageDlg('Du hast keine Breite eingegeben', mtError, [mbOK], 0)
  Else If Edit11.text='HöheThen 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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: GetSystemMetrics - Rahmen eines Fensters

  Alt 31. Mär 2012, 15:54
MSDN-Library durchsuchenAdjustWindowRectEx
$2B or not $2B
  Mit Zitat antworten Zitat
Premaider

Registriert seit: 31. Mär 2012
160 Beiträge
 
#5

AW: GetSystemMetrics - Rahmen eines Fensters

  Alt 31. Mär 2012, 16:00
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

Geändert von Premaider (31. Mär 2012 um 16:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: GetSystemMetrics - Rahmen eines Fensters

  Alt 31. Mär 2012, 16:10
Damit kann man natürlich keine Fenstergröße ändern, wie man im MSDN nachlesen kann.
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.
$2B or not $2B

Geändert von himitsu (31. Mär 2012 um 16:14 Uhr)
  Mit Zitat antworten Zitat
Premaider

Registriert seit: 31. Mär 2012
160 Beiträge
 
#7

AW: GetSystemMetrics - Rahmen eines Fensters

  Alt 31. Mär 2012, 16:21
Ich verstehe aber nicht wie ist das bei mir unterzubringen habe :S
  Mit Zitat antworten Zitat
Premaider

Registriert seit: 31. Mär 2012
160 Beiträge
 
#8

AW: GetSystemMetrics - Rahmen eines Fensters

  Alt 31. Mär 2012, 17:23
Könntet ihr mir vllt ein Beispiel geben ?
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#9

AW: GetSystemMetrics - Rahmen eines Fensters

  Alt 31. Mär 2012, 18:05
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
  Mit Zitat antworten Zitat
Premaider

Registriert seit: 31. Mär 2012
160 Beiträge
 
#10

AW: GetSystemMetrics - Rahmen eines Fensters

  Alt 31. Mär 2012, 19:50
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)

Geändert von Premaider (31. Mär 2012 um 19:57 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:40 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