Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Drucker liefert unterschiedliche Fontgrößen (https://www.delphipraxis.net/164251-drucker-liefert-unterschiedliche-fontgroessen.html)

marcibaer 4. Nov 2011 09:32

Drucker liefert unterschiedliche Fontgrößen
 
Hallo zusammen,

wenn ich z.B. folgenden Code habe,

Delphi-Quellcode:
        BeginDoc;
        SetMapMode(Handle, MM_LOMETRIC);
        Font.Name := 'Times New Roman';
        Font.Size := 6;
        Font.Style := [fsBold];
        y := -50;
        TextOut(1050,y,Blablabla');
dann sieht das auf meinem Drucker gut aus - auf anderen Rechnern wird die Schrift aber so klein gedruckt, da braucht man 'ne Lupe.
Hat jemand 'ne Idee, was da schief läuft!? Der Font ist ja Standard ...

Vielen Dank,

Marc

Bummi 4. Nov 2011 09:53

AW: Drucker liefert unterschiedliche Fontgrößen
 
versuchsweise
SetMapMode(Handle, MM_LOMETRIC);
vor Begindoc ?

marcibaer 4. Nov 2011 11:01

AW: Drucker liefert unterschiedliche Fontgrößen
 
Ne, tut's nicht ...

Da kommt direkt 'ne Exception "der Drucker druckt gerade nicht"!

Marc

Bummi 4. Nov 2011 11:21

AW: Drucker liefert unterschiedliche Fontgrößen
 
willst Du es mal so probieren?

Delphi-Quellcode:
var
  y:Integer;
  fs:integer;
begin
with Printer do
  begin
        fs := 6;
        BeginDoc;
        SetMapMode(Handle, MM_LOMETRIC);
        canvas.Font.Name := 'Times New Roman';
        canvas.Font.Size := round(10.0 * fs *(25.4/GetDeviceCaps(printer.handle, LOGPIXELSX)));;
        canvas.Font.Style := [fsBold];
        y := -50;
        canvas.TextOut(50,y,'Blablabla');
        y := -150;
        canvas.TextOut(50,y,'Blablabla');
        EndDoc;
  end;
end;

hathor 4. Nov 2011 11:27

AW: Drucker liefert unterschiedliche Fontgrößen
 
Es hat nicht jeder Drucker die gleiche Auflösung.
Damit WINDOWS auf allen Geräten gleich gut druckt, wurde das GDI erfunden...

http://directtools.de/wissen/drucker...reiber_gdi.htm

DELPHI hinkt da hinterher.

Mit GetDeviceCaps holst du dir die Eigenschaften eines Gerätes, in deinem Beipsiel von deinem Drucker.
Wenn du z.B. Millimetergenau drucken willst, musst du ermitteln wieviele Pixel/mm Auflösung der Drucker hat. GetDeviceCaps ist eine Windows-API-Funktion.
http://www.delphipraxis.net/116774-b...he-pixeln.html
.
http://www.esanu.name/delphi/Hardwar...t%20sizes.html
.
http://www.google.com/codesearch#sea...ceCaps&type=cs
.
Delphi-Quellcode:
Type
  TPageInfo = record
    width, height: Integer;  { physical width and height, in dots }
    offsetX, offsetY: Integer;{ nonprintable margin, in dots }
    resX, resY: Integer;     { logical resolution, dots per inch }
  End;

Procedure GetPageinfo(  Var info: TPageInfo; index: Integer = -1 );
  Begin
    If index > -1 Then
      Printer.PrinterIndex := index;
    With Printer Do Begin
      info.resX   := GetDeviceCaps( handle, LOGPIXELSX );
      info.resY   := GetDeviceCaps( handle, LOGPIXELSY );
      info.offsetX := GetDeviceCaps( handle, PHYSICALOFFSETX );
      info.offsetY := GetDeviceCaps( handle, PHYSICALOFFSETY );
      info.width  := GetDeviceCaps( handle, PHYSICALWIDTH );
      info.height := GetDeviceCaps( handle, PHYSICALHEIGHT );
    End; { With }
  End;

marcibaer 4. Nov 2011 11:38

AW: Drucker liefert unterschiedliche Fontgrößen
 
Wow,

das ist ja mal 'ne Berechnung :)
Delphi-Quellcode:
round(10.0 * fs *(25.4/GetDeviceCaps(printer.handle, LOGPIXELSX)))
Dann wird's SEHR klein bei mir!
Kann es denn sein, dass es bei den "anderen" damit "normal" aussieht!?

Marc

DeddyH 4. Nov 2011 12:12

AW: Drucker liefert unterschiedliche Fontgrößen
 
Diese Rechenorgie sollte bei Verwendung von SetMapMode gar nicht erforderlich sein. Gerade dafür ist die Funktion ja da.

[edit] Hier habe ich recht interessanten Code gefunden: http://stackoverflow.com/questions/1...ive-text-width [/edit]

p80286 4. Nov 2011 13:35

AW: Drucker liefert unterschiedliche Fontgrößen
 
Ggf hilft Dir
Delphi-Quellcode:
canvas.FontUpdate
weiter.
Delphi-Quellcode:
SetMapMode(Handle, MM_LOMETRIC);
        canvas.Font.Name := 'Times New Roman';
        canvas.Font.Size := round(10.0 * fs *(25.4/GetDeviceCaps(printer.handle, LOGPIXELSX)));;
        canvas.Font.Style := [fsBold];
        canvas.FontUpdate;
Gruß
K-H

DeddyH 4. Nov 2011 13:42

AW: Drucker liefert unterschiedliche Fontgrößen
 
Wo kommt das her? Ich finde nirgends eine solche Methode :gruebel:

Bummi 4. Nov 2011 13:56

AW: Drucker liefert unterschiedliche Fontgrößen
 
Da ich immer gerne au Dinge zurückgreife die ich schon länger nutze, vielleicht lässt sich hieraus was machen.

Die Idee ist direkt mit Millimetern zu arbeiten ....

den GetPageinfo-Teil habe ich von hathor übernommen ....

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,Printers,Math, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
Type
  TPageInfo = record
    width, height: Integer; { physical width and height, in dots }
    offsetX, offsetY: Integer;{ nonprintable margin, in dots }
    resX, resY: Integer; { logical resolution, dots per inch }
  End;

Procedure GetPageinfo( Var info: TPageInfo; index: Integer = -1 );
  Begin
    If index > -1 Then
      Printer.PrinterIndex := index;
    With Printer Do Begin
      info.resX := GetDeviceCaps( handle, LOGPIXELSX );
      info.resY := GetDeviceCaps( handle, LOGPIXELSY );
      info.offsetX := GetDeviceCaps( handle, PHYSICALOFFSETX );
      info.offsetY := GetDeviceCaps( handle, PHYSICALOFFSETY );
      info.width := GetDeviceCaps( handle, PHYSICALWIDTH );
      info.height := GetDeviceCaps( handle, PHYSICALHEIGHT );
    End; { With }
  End;




Procedure SetCanvasZoomAndRotation(ACanvas:TCanvas;Zoom:Double;Angle:Double;CenterpointX,CenterpointY:Double);
var
    form : tagXFORM;
    Winkel:Double;

begin
      Winkel := DegtoRad(Angle);
      SetGraphicsMode(ACanvas.Handle, GM_ADVANCED);
      SetMapMode(ACanvas.Handle,MM_ANISOTROPIC);
      form.eM11 := Zoom * cos( Winkel);
      form.eM12 := Zoom *Sin( Winkel) ;
      form.eM21 := Zoom * (-sin( Winkel));
      form.eM22 := Zoom * cos( Winkel) ;
      form.eDx := CenterpointX;
      form.eDy := CenterpointY;
      SetWorldTransform(ACanvas.Handle,form);
end;

Procedure ResetCanvas(ACanvas:TCanvas);
begin
   SetCanvasZoomAndRotation(ACanvas , 1, 0, 0,0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
info: TPageInfo;
begin
  GetPageinfo(info);
  Printer.BeginDoc;
  SetCanvasZoomAndRotation(Printer.Canvas, info.height / 297,0,0,0);
  Printer.Canvas.Rectangle(10,10,30,20);
  Printer.Canvas.Font.Height := 10;
  Printer.Canvas.TextOut(10,10,'Test');
  Printer.EndDoc;
end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:53 Uhr.
Seite 1 von 2  1 2      

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