AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Metafile spinnt bei hochauflösenden Bildschirmen (>=150% scaling)
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von ralfiii · begonnen am 28. Jan 2016 · letzter Beitrag vom 28. Apr 2016
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von ralfiii
ralfiii

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

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

  Alt 28. Jan 2016, 16:26
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
Angehängte Dateien
Dateityp: 7z HighDpiMetaFilePrintingBug.7z (282,6 KB, 23x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#2

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

  Alt 28. Jan 2016, 17:30
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)
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.664 Beiträge
 
Delphi 11 Alexandria
 
#3

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

  Alt 29. Jan 2016, 07:30
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.
Sven Harazim
--
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#4

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

  Alt 29. Jan 2016, 09:28
[...] ich konnte mir noch kein Bild machen.
Badum TSSSSSSS!
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#5

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

  Alt 29. Jan 2016, 11:24
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

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

  Alt 29. Jan 2016, 17:15
In was für Einheiten wird denn auf dem Bildschirm und dem Drucker gezeichnet?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von ralfiii
ralfiii

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

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

  Alt 1. Feb 2016, 14:18
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 1. Feb 2016, 15:16
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
$2B or not $2B

Geändert von himitsu ( 1. Feb 2016 um 15:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von ralfiii
ralfiii

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

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

  Alt 1. Feb 2016, 15:36
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

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

  Alt 1. Feb 2016, 15:42
Und wer sagt dir, daß Windows nicht da dran rum spielt?
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:59 Uhr.
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