Einzelnen Beitrag anzeigen

Benutzerbild von ralfiii
ralfiii

Registriert seit: 30. Mai 2007
489 Beiträge
 
Delphi 2010 Professional
 
#13

AW: Metafile spinnt bei hochauflösenden Bildschirmen (>=150% scaling)

  Alt 28. Apr 2016, 15:34
Jupp, ich streck's jetzt einfach:

Delphi-Quellcode:
             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 );
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.
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;

Geändert von ralfiii (28. Apr 2016 um 15:36 Uhr)
  Mit Zitat antworten Zitat