Autor Beitrag
trm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Sa 21.05.11 21:34 
Hallo,

Unter Windows kann man die Anzeige skalieren (vordefinierte Werte: 100%, 125% und 150%).
Wenn ich nun mein Programm unter Win7, 100% starte, ist alles ok.
Unter 125% werden ALLE Elemente im Programm vergrößert, ich habe einen Fixwert meiner Form, die im Moment nicht ziehbar ist.

Vor ein paar Jahren hatte ich gefunden, wie man die Windows-Skalierung ermittelt und dann auf die eigene Form umsetzen kann.
Leider habe ich das vergessen, wie es funktioniert.

Die Breite/Höhe würde ich ja normal per Prozentsatz anpassen, damit alle Elemente sichtbar sind.
Aber wie ermittle ich die Windowsanzeigeskalierungsgröße ?


Edit: Die Eigenschaft Scaled möchte ich ungern auf FALSE setzen.

Danke und viele Grüße

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: So 22.05.11 18:32 
So, nach einer Mütze voll Schlaf, habe ich folgendes gemacht:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
.oncreate ..
var
  x: Integer;
begin

{ Programm anpassen }
  Application.Title := RS_Application_Title;
  Panel_Caption.Caption := RS_Application_Title;
  Self.Caption := RS_Application_Title;

  Panel_Main_Holder.Left := 0;
  Panel_Main_Holder.Top := 0;
  Panel_Main_Holder.Width := 657;
  Panel_Main_Holder.Height := 513;

  case ReadDword(HKEY_CURRENT_USER, 'Control Panel\Desktop\WindowMetrics''AppliedDPI', x) of
    True: { Registry wurde gelesen }
      begin
        Panel_Main_Holder.Width := Round( Panel_Main_Holder.Width *(x / 96));
        Panel_Main_Holder.Height := Round(Panel_Main_Holder.Height * (x / 96));
      end;
    False: { Registry wurde nicht gelesen }
      case GetDPI(x) of
        True: { dpi wurden ermittelt }
          begin
            Panel_Main_Holder.Width := Round( Panel_Main_Holder.Width *(x / 96));
            Panel_Main_Holder.Height := Round(Panel_Main_Holder.Height * (x / 96));
          end;
        False: { dpi wurden nicht ermittelt }
          Scaled := False;
      end;
  end;

  SetBounds(Left, Top, Panel_Main_Holder.Width, Panel_Main_Holder.Height);
  Panel_Main_Holder.Align := alClient;
  Self.Borderstyle := bsNone;
{ Programm anpassen }

[..]


function ReadDword(RootKey: LongWord; KEY_NAME, KEY_VALUE: stringvar IntResult: Integer): Boolean;
var
  Reg: TRegistry;
begin

  Reg := TRegistry.Create;
  try
    Reg.RootKey := RootKey;
    if Reg.OpenKeyReadOnly(KEY_NAME) then
      if Reg.ValueExists(KEY_VALUE) then
      begin
        IntResult := Reg.ReadInteger(KEY_VALUE);
        Reg.CloseKey;
      end;
    Result := True;
  finally
    Reg.Free
  end;

function GetDPI(var IntResult: Integer): Boolean;
var
  DC: hDC;
begin

  DC := GetDC(HWND_DESKTOP);
  try
    IntResult := GetDeviceCaps(DC, LOGPIXELSY);
    Result := True;
  finally
    ReleaseDC(DC, HWND_DESKTOP);
  end;

end;

end;


100% Skalierung ist mit 96 dpi gleich zu setzen = 1.
120% Skalierung wäre dann 1,25.
150% Skalierung sind 1,5625.

Wer einen Fehler findet, meldet sich bitte :)

Viele Grüße, schönen Sonntag.


Edit: Rechenfehler behoben.
Edit2: Es gibt ein Problem bei der Breite.
Ich habe es folgendermaßen gelöst:

1. Panel (unsichtbar) auf die Form. panel.left = 8; panel.top = 8; panel.width = form.width -8; panel.height = form.height - 8;
2. im oncreate einen fix ausführen:
ausblenden Delphi-Quelltext
1:
2:
3:
  SetBounds(Left, Top, Panel_Main_Holder.Width, Panel_Main_Holder.Height);
  Width:=Panel23.Left+Panel23.Width +8;
  Panel_Main_Holder.Align := alClient;


3. Außerdem habe ich die Zeilen:             Panel_Main_Holder.Height := Round(Panel_Main_Holder.Height * (x / 96)); auskommentiert, da die dpi-Skalierung nur in der Breite angewandt wird (?)

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)