Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Zeichnungsgröße in Metafile fällt je Rechner anders aus?! (https://www.delphipraxis.net/148536-zeichnungsgroesse-metafile-faellt-je-rechner-anders-aus.html)

Jelen 3. Mär 2010 20:47


Zeichnungsgröße in Metafile fällt je Rechner anders aus?!
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
an diesem Problem knabbere ich nun schon lange: :wall:

Meine Anwendung soll die Bildschirmausgabe in eine wmf-Datei exportieren.
Auf Rechner 1 läuft's, auf Rechner 2 stimmt zwar die Größe des Metafile noch, aber die Grafik darin ist deutlich größer.
Beide Rechner sind Win XP SP2.

Ich hab das Problem auf ein Mini-Beispiel reduziert:

Delphi-Quellcode:
procedure TForm1.MetafileBtnClick(Sender: TObject);
 var i: integer;
     Pict: TPicture;
     mfc: TMetafileCanvas;
 begin
  Pict := TPicture.Create;
  Pict.Metafile.MMWidth := 21000;
  Pict.Metafile.MMHeight := 29700;
  Pict.Metafile.Inch := 1440;
  mfc := TMetafileCanvas.Create(Pict.Metafile,0);

   { ab hier wird eine Beispielzeichnung ausgegeben }
  mfc.Brush.Color := clRed;
  mfc.Ellipse(300,300,400,600);
  mfc.Brush.Color := clWhite;
  mfc.Font.Name := 'Arial';
  mfc.Font.Height := -20;
  for i := 1 to 10
  do mfc.TextOut(50,i*50,'Text auf (50,'+IntToStr(i*50)+')');
  mfc.Font.Name := 'Courier New';
  mfc.Font.Size := 15;
  for i := 1 to 10
  do mfc.TextOut(500,i*50,'Text auf (500,'+IntToStr(i*50)+')');
  mfc.TextOut(50,600,'Inch='+IntToStr(Pict.Metafile.Inch));
   { Ende Beispielzeichnung }

  mfc.Free;
  Pict.Metafile.SaveToFile('MFTest.wmf');
  Pict.Free;
 end;
Ich hab' sowohl mit dem Parameter Inch als auch mit dem Gerätekontext-Handle in TMetafileCanvas.Create experimentiert - ohne Erfolg.

Hat jemand eine Idee? :coder2:

Anbei das Projekt sowie die beiden unterschiedlichen WMF's.

gmc616 4. Mär 2010 03:57

Re: Zeichnungsgröße in Metafile fällt je Rechner anders aus?
 
Hmm... du scheinst irgendetwas auf A4 ausgegeben zu wollen.

könnte es evtl. damit zu tun haben hCreating a DPI-Aware Application

// edit: Link korrigiert

Jelen 4. Mär 2010 09:38

Re: Zeichnungsgröße in Metafile fällt je Rechner anders aus?
 
Danke für den Tipp.
Die darin beschriebene Vorgehensweise erfordert aber Windows Vista - das ist mir noch erspart geblieben.

Mit dem Gerätekontext-Handle bin ich inzwischen aber doch weitergekommen: :idea:
Da meine Anwendung seine Ausgabe sowieso auf den Druckbereich eines bestimmten Druckers hin formatiert (WYSIWYG), gebe ich dem Metafile das Handle des Druckers mit auf den Weg.
Wenn dann die Ausgabe noch gemäß der Druckerauflösung skaliert wird, bekomme ich auf beiden Rechnern dasgleiche Ergebnis :dancer: !

Der Quelltext dazu sieht jetzt so aus:

Delphi-Quellcode:
procedure TForm1.MetafileBtnClick(Sender: TObject);
 var DpiX,DpiY,i,SeiBreimm,SeiHoehmm,Seitenbreite,Seitenhoehe: integer;
     Pict: TPicture;
     mfc: TMetafileCanvas;

 function KoorUmr (Wert: integer): integer;
  begin
   Result := round(Wert/96*DpiX);
  end;

 begin
  { Druckparameter ermitteln }
  Printer.SetPrinter
   (PChar('Samsung CLP-300 Series'),PChar('WINSPOOL'),PChar(''),0);
  Printer.Orientation := poLandscape;
  Seitenbreite := Printer.PageWidth;   { in Pixel }
  Seitenhoehe := Printer.PageHeight;   { in Pixel }
  DpiX := GetDeviceCaps(Printer.Handle,LogPixelsX);  { Druckerauflösung }
  DpiY := GetDeviceCaps(Printer.Handle,LogPixelsY);
  SeiBreimm := round(Seitenbreite/DpiX*2540);  { Breite in 0.01 mm }
  SeiHoehmm := round(Seitenhoehe/DpiY*2540);   { Höhe in 0.01 mm }
  { Metafile erzeugen }
  Pict := TPicture.Create;
  Pict.Metafile.MMWidth := SeiBreimm;
  Pict.Metafile.MMHeight := SeiHoehmm;
  Pict.Metafile.Inch := DpiX;
  mfc := TMetafileCanvas.Create(Pict.Metafile,Printer.Handle);
  { Beispielzeichnung ausgeben }
  mfc.Brush.Color := clRed;
  mfc.Ellipse(KoorUmr(340),KoorUmr(300),KoorUmr(440),KoorUmr(600));
  mfc.Brush.Color := clWhite;
  mfc.Font.Name := 'Arial';
  mfc.Font.Height := -KoorUmr(30);
  for i := 1 to 10
  do mfc.TextOut(KoorUmr(50),i*KoorUmr(50),'Text auf (50,'+IntToStr(i*50)+')');
  mfc.Font.Name := 'Courier New';
  mfc.Font.Size := KoorUmr(20);
  for i := 1 to 10
  do mfc.TextOut(KoorUmr(500),i*KoorUmr(50),'Text auf (500,'+IntToStr(i*50)+')');
  mfc.TextOut(KoorUmr(50),KoorUmr(550),'Inch='+IntToStr(Pict.Metafile.Inch));
  mfc.TextOut(KoorUmr(50),KoorUmr(600),'Width='+IntToStr(Pict.Metafile.Width));
  mfc.TextOut(KoorUmr(50),KoorUmr(650),'Height='+IntToStr(Pict.Metafile.Height));
  { Ende Beispielzeichnung }
  mfc.Free;
  Pict.Metafile.SaveToFile('MFTest.wmf');
  Pict.Free;
 end;
Die Ergebnisse stimmen auch unabhängig vom gewählten Drucker überein (bis auf die Blattgröße natürlich).
Komischerweise stimmen die Werte Pict.Metafile.Width und Height nicht. Bei Verwendung des wmf in anderen Programmen (z.B. Einfügen in Word-Dokument) stört das aber nicht. :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:15 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