AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Zeichnungsgröße in Metafile fällt je Rechner anders aus?!
Thema durchsuchen
Ansicht
Themen-Optionen

Zeichnungsgröße in Metafile fällt je Rechner anders aus?!

Ein Thema von Jelen · begonnen am 3. Mär 2010 · letzter Beitrag vom 4. Mär 2010
Antwort Antwort
Jelen

Registriert seit: 5. Nov 2003
45 Beiträge
 
#1

Zeichnungsgröße in Metafile fällt je Rechner anders aus?!

  Alt 3. Mär 2010, 21:47
Hallo,
an diesem Problem knabbere ich nun schon lange:

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?

Anbei das Projekt sowie die beiden unterschiedlichen WMF's.
Angehängte Dateien
Dateityp: zip metafile_171.zip (5,7 KB, 6x aufgerufen)
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: Zeichnungsgröße in Metafile fällt je Rechner anders aus?

  Alt 4. Mär 2010, 04:57
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
  Mit Zitat antworten Zitat
Jelen

Registriert seit: 5. Nov 2003
45 Beiträge
 
#3

Re: Zeichnungsgröße in Metafile fällt je Rechner anders aus?

  Alt 4. Mär 2010, 10:38
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:
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 !

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.
  Mit Zitat antworten Zitat
Antwort Antwort


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 20:29 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