![]() |
AW: Metafile spinnt bei hochauflösenden Bildschirmen (>=150% scaling)
Zitat:
Ab 150% scaling kommt's zu einer sogenannten dpi-Virtualisierung. (ausser man macht die Anwendung dpi-Aware, aber dann muss man ZIEMLICH viel nacharbeiten, uA bei etlichen 3rd Party Komponenten, und das will ich nun wirklich nicht) Bisher wusste ich nicht, wie ich feststellen kann, um welchen Faktor Windows heimlich herum skaliert. Jetzt hab ich eine Lösung (glaub ich, braucht noch Tests), und zwar die von oben mit DESKTOPVERTRES und VERTRES. Normalerweise liefern die identische Werte. Wenn diese Virtualisierung anfährt, dann kann man so den Skalierungsfaktor bestimmen. Ich werd noch ein wenig herumspielen und meld mich dann wieder... Danke für die Denkanstösse! |
AW: Metafile spinnt bei hochauflösenden Bildschirmen (>=150% scaling)
noch Erkenntnisse gewonnen - @ralfiii ?
|
AW: Metafile spinnt bei hochauflösenden Bildschirmen (>=150% scaling)
Jupp, ich streck's jetzt einfach:
Delphi-Quellcode:
So geht's. Alternativ kann man auch die High-Res-Awareness (in meinem Fall per Setting) beim Start einschalten, dann muss man halt alles recht kompliziert umrechnen.
dc := GetDC(0);
logicalScreenHeight := GetDeviceCaps(dc, VERTRES); physicalScreenHeight := GetDeviceCaps(dc, DESKTOPVERTRES); ReleaseDC(0, dc); if logicalScreenHeight <> physicalScreenHeight then begin rc.Right := rc.Left + MulDiv(rc.Right - rc.Left, physicalScreenHeight, logicalScreenHeight); rc.Bottom := rc.Top + MulDiv(rc.Bottom - rc.Top, physicalScreenHeight, logicalScreenHeight); end; function scaleToNativeDeskRes(pVal: Integer): Integer; var tTemp: HDC; begin tTemp := GetDC(0); try Result := MulDiv(pVal, GetDeviceCaps(tTemp, DESKTOPVERTRES), GetDeviceCaps(tTemp, VERTRES)); finally ReleaseDC(0, tTemp); end; end; Printer.Canvas.StretchDraw( Rect( 0, 0, scaleToNativeDeskRes(Printer.PageWidth), scaleToNativeDeskRes(Printer.PageHeight) ), mf ); Ich hab defaultmässig mal die primitive Version (oben) im Einsatz.
Delphi-Quellcode:
const
Process_DPI_Unaware = 0; Process_System_DPI_Aware = 1; Process_Per_Monitor_DPI_Aware = 2; type TSetProcessDPIAwareness = function (value : LongWord) : HRESULT; stdcall; var setProcessDPIAwareness : TSetProcessDPIAwareness; hdl : THandle; implementation uses Windows...; initialization hdl := LoadLibrary('Shcore.dll'); if hdl <> 0 then begin setProcessDPIAwareness := GetProcAddress(hdl, 'SetProcessDpiAwareness'); if Assigned(setProcessDPIAwareness) then setProcessDPIAwareness(Process_System_DPI_Aware); FreeLibrary(hdl); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz