So, nach einer Mütze voll Schlaf, habe ich folgendes gemacht:
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
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: 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: case GetDPI(x) of True: 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: Scaled := False; end; end;
SetBounds(Left, Top, Panel_Main_Holder.Width, Panel_Main_Holder.Height); Panel_Main_Holder.Align := alClient; Self.Borderstyle := bsNone;
[..]
function ReadDword(RootKey: LongWord; KEY_NAME, KEY_VALUE: string; var 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:
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
Narses: Code- durch Delphi-Tags ersetzt