Einzelnen Beitrag anzeigen

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