![]() |
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:
Ich hab' sowohl mit dem Parameter Inch als auch mit dem Gerätekontext-Handle in TMetafileCanvas.Create experimentiert - ohne Erfolg.
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; Hat jemand eine Idee? :coder2: Anbei das Projekt sowie die beiden unterschiedlichen WMF's. |
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 ![]() // edit: Link korrigiert |
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:
Die Ergebnisse stimmen auch unabhängig vom gewählten Drucker überein (bis auf die Blattgröße natürlich).
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; 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 08:52 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