Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Metafile spinnt bei hochauflösenden Bildschirmen (>=150% scaling) (https://www.delphipraxis.net/188078-metafile-spinnt-bei-hochaufloesenden-bildschirmen-%3D150-scaling.html)

ralfiii 28. Jan 2016 15:26

Metafile spinnt bei hochauflösenden Bildschirmen (>=150% scaling)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo!

Ich bin hier über einen seltsamen Bug gestolpert.
Siehe angehängte Anwendung.
Solange das Windows-Bildschirm-scaling kleiner als 150% ist (das "verstellt" die dpi), druckt die Anwendung einfach ein Kreuz gestretcht auf das Blatt des Druckers.
Sobald 150% oder mehr eingestellt ist (-> 144 oder mehr dpi), wird das Metafile nicht mehr richtig vergrössert, die Grafik füllt nur mehr einen Teil der Seite. Je höher die Prozent-Vergrösserung, desto schlimmer der Effekt.
HILFE!!!

PS: 150% oder mehr kommen zB bei Laptops mit 4k Displays vor, man braucht unter Win7 (oder 8 oder 10) nur auf "Anzeige" gehen, und mal 150% auswählen.

Ich könnte die ganze Anwendung dpi-Aware machen, aber dann müssen sämtliche 3rd Party Komponenten überarbeitet werden, das wäre ein mords Aufwand....

Hilfe hilfe hilfe!
Eine ganze Kiste Bier steht für einen sachdienlichen Hinweis :)

Memnarch 28. Jan 2016 16:30

AW: Metafile spinnt bei hochauflösenden Bildschirmen (>=150% scaling)
 
Nur mal grob drübergeguckt aber PrinterDPI<>ScreenDPI
Oder sehe ich das Falsch? Zum drucken gibt es doch normalerweise seperate DPI-Settings?

Das heißt das zeichnen per ScreenDPI und drucken per PrinterDPI bekämpft sich. Wenn deine Applikation nicht DPI-Aware ist virtualisiert windows das IIRC und das gilt nur für den Screen IIRC.

Es müsste doch möglich sein die DPI-Settings für den Druck zu setzen(bevor du die Metafile auf den Printer haust)

sh17 29. Jan 2016 06:30

AW: Metafile spinnt bei hochauflösenden Bildschirmen (>=150% scaling)
 
ja, kenne ich, für "normale" Bildschirme war für uns die Lösung, die Metalfiles in der Auflösung des Druckers zu erstellen (bzw unabhängig vom Bildschirm)

Jetzt hat uns dieser Effekt aber wieder eingeholt - bei 4k-Bildschirmen. Ich hab es noch nicht geschafft, mich damit zu beschäftigen, aber anscheinend bringt mir Delphi trotz zB 300% eine 96 dpi. Und dann haut irgend was mit dem Metafile nicht hin. Das was drauf muss, liegt links oben in die Ecke gequetscht. Aber wie gesagt, ich konnte mir noch kein Bild machen.

Memnarch 29. Jan 2016 08:28

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

Zitat von sh17 (Beitrag 1328688)
[...] ich konnte mir noch kein Bild machen.

Badum TSSSSSSS:party:!

Bjoerk 29. Jan 2016 10:24

AW: Metafile spinnt bei hochauflösenden Bildschirmen (>=150% scaling)
 
Ja, sowas kann einen echt fertig machen. Ich hab da auch schon oft probiert und immer kapituliert. Während Width/Height, die Schriftgrößen und Pen.Width gezoomt sind, sind MMWidth/MMHeight und z.B. Canvas.MoveTo/LineTo nicht gezoomt. Das heißt, in beiden Fällen ist die Grafik unterschiedlich.

Luckie 29. Jan 2016 16:15

AW: Metafile spinnt bei hochauflösenden Bildschirmen (>=150% scaling)
 
In was für Einheiten wird denn auf dem Bildschirm und dem Drucker gezeichnet?

ralfiii 1. Feb 2016 13:18

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

Zitat von Luckie (Beitrag 1328762)
In was für Einheiten wird denn auf dem Bildschirm und dem Drucker gezeichnet?

Wie meinst du, in was für Einheiten?
Wir bestimmen die Auflösung in Pixel pro Millimeter (einfach mit GetDeviceCaps(Can.Handle, HORZRES) / GetDeviceCaps(Can.Handle, HORZSIZE)
Und dann skalieren wir die Grafik entsprechend. Wir drucken sozusagen in Millimetern. Via Pixel. Äh...

Aber ab 150% Scaling kommt bei Windows offensichtlich eine dpi-Virtualisierung dazu.

Erster Schritt Richtung Lösung:
Delphi-Quellcode:
// From https://msdn.microsoft.com/en-us/library/windows/desktop/dd144877(v=vs.85).aspx and
//   http://stackoverflow.com/questions/25924614/quick-report-displaying-or-printing-a-report-incorrectly-with-windows-font-size
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;

himitsu 1. Feb 2016 14:16

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

Zitat von ralfiii
Wie meinst du, in was für Einheiten?

Genau so, wie beim Drucker, kann man beim Screen auch die Ausgabe steuern.
So wie das auch Windows nun auch macht und dann intern das Canvas eine andere Auflösung hat, als die Bildschirmausgabe.

Da kann man intern auf ein Canvas mit 96 DPI malen und Windows scalliert es für die Anzeige auf 144 DPI, wenn dein Programm nicht DPIaware ist.

MSDN-Library durchsuchenSetMapMode MSDN-Library durchsuchenSetViewportExtEx
https://msdn.microsoft.com/de-de/lib.../dd145139.aspx
https://msdn.microsoft.com/de-de/lib.../dd183475.aspx
https://msdn.microsoft.com/de-de/lib.../dd183476.aspx

ralfiii 1. Feb 2016 14:36

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

Zitat von himitsu (Beitrag 1328970)
Zitat:

Zitat von Luckie (Beitrag 1328762)
In was für Einheiten wird denn auf dem Bildschirm und dem Drucker gezeichnet?

Genauso, wie beim Drucker, kann man beim Screen auch die Ausgabe steuern.

Ahso das!
Nein, nachdem die Druckroutinen zu einem riesen Teil identisch mit den Routinen für den Bildschirm sind haben wir da nix verstellt, kein MapMode etc.
Wie gesagt, wir bestimmen die dpi und scalen selbst.
Auf Beamern muss man's anders machen (eh klar, da gibt's uU kein HorzSize), da fragen wir getDeviceCaps(Can.handle, LOGPIXELSX)/25.4 ab.

himitsu 1. Feb 2016 14:42

AW: Metafile spinnt bei hochauflösenden Bildschirmen (>=150% scaling)
 
Und wer sagt dir, daß Windows nicht da dran rum spielt? :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:47 Uhr.
Seite 1 von 2  1 2      

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