Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Drucker canvas skalieren (https://www.delphipraxis.net/154439-drucker-canvas-skalieren.html)

Evian 10. Sep 2010 14:42

Drucker canvas skalieren
 
Hallo Zusammen,

ich sitze hier vor einem ziemlich doofen Problem. Mein Programm soll unter bestimmten Bedingungen Barcodes auf einem Barcode-Drucker drucken. Dafür habe ich eine Komponente (TBarCode), die eine Print-Methode mitbringt. In etwa so:

Code:
Printer.BeginDoc;
tmpbarcode.Print(x,y);
Printer.EndDoc;
Wärend tmpbarcode.Print(x,y); wird der Barcode an die Stelle x,y ins Drucker Canvas geschrieben.
Das drucken ansich funktioniert auch ohne Probleme, nur sagen mir die MTAs aus dem Labor, dass der Barcode zu breit ist für ihre Automaten.
Die Barcodes selber bringen aber keine wirklich funktionierende Methode mit um den Druck weiter zu skalieren.

Ich suche nun eine möglichkeit, das gesammte DruckerCanvas im Nachhinein zu skalieren. Hat da jemand einen Tipp?

Liebe Grüße,

Evian

Bummi 10. Sep 2010 15:34

AW: Drucker canvas skalieren
 
Ich kenne Deine Komponente nicht, unterstütze Deine weiter Routinen?

Bei Bir z.B.

procedure Print(OfsX, OfsY : integer); override;
PROCEDURE DrawBarCode(PrintWhere:TObject;UsePixelsPerInchX : integer);


Hier kann ich bei PrintWhere ein beliebiges canvas angeben und das Bild per Strechdraw an den Printer schicken..

Namenloser 10. Sep 2010 15:42

AW: Drucker canvas skalieren
 
SetMapMode und Co. (Siehe Abschnitt "See also") könnten interessant sein.

Evian 10. Sep 2010 16:12

AW: Drucker canvas skalieren
 
@Bummi: Leider nein. Die Komponente ist generell sehr eingeschränkt. Für das Drucken gibt es keine weiteren Funktionen.
@NamenLozer: Danke für den Tipp, aber wirklich etwas gefunden, das mir weiterhelfen könnte, habe ich nicht. :/

Ich hatte jetzt auch eher daran gedacht, das Canvas des Druckers per StretchBlt/StretchDraw zu modifizieren. Aber bisher bekomme ich immer nur exceptions. Geht das Überhaupt?!

Namenloser 10. Sep 2010 16:21

AW: Drucker canvas skalieren
 
Zitat:

Zitat von Evian (Beitrag 1048741)
@NamenLozer: Danke für den Tipp, aber wirklich etwas gefunden, das mir weiterhelfen könnte, habe ich nicht. :/

Hast du das Kapitel über Coordinate Spaces and Transformations gelesen?
Aus der Einleitung:
Applications use coordinate spaces and transformations to scale, rotate, translate, shear, and reflect graphics output. A coordinate space is a planar space that locates two-dimensional objects by using two reference axes that are perpendicular to each other. There are four coordinate spaces: world, page, device, and physical device (client area, desktop, or page of printer paper).

A transformation is an algorithm that alters ("transforms") the size, orientation, and shape of objects. Transformations also transfer a graphics object from one coordinate space to another. Ultimately, the object appears on the physical device, which is usually a screen or printer.

Da geht es doch offensichtlich genau um das, was du vorhast.

himitsu 10. Sep 2010 16:27

AW: Drucker canvas skalieren
 
Hier auch nochmal 2 Links zu ähnlichen Themen:
http://www.delphipraxis.net/53976-in...tml#post365632
http://www.delphipraxis.net/129499-schrift-pixelig.html

Wie schin jemand sagte, über SetMapMode kannst du die Auflösung des (Printer)Canvas verändern.

Wenn es überall etwa gleich aussehn soll, dann darfst du kein Hardwareabhäniges Format nutzen, sondern nutzt einfach ein festes Format, wobei man sich hier einige Auflösungen in Inch/Zoll oder Millimetern auswählen kann (siehe erster Link).


Wenn du noch mehr skalieren willst, dann wäre halt der Weg über SetWorldTransform (siehe NamenLozer) oder du könntest du die TBarCode-Ausgabe erstmal auf ein TBitMap zeichnen und kopierst dann dieses Bild skaliert auf den Printer-Canvas.

Bummi 10. Sep 2010 16:44

AW: Drucker canvas skalieren
 
der Beitrag von NamenLozer hat mich inspiriert,
Versuchs doch mal mit


SetCanvasZoomFactor(Printer.canvas,70);

Delphi-Quellcode:
procedure SetCanvasZoomFactor(Canvas: TCanvas; AZoomFactor: Integer);
var
  i: Integer;
begin
  if AZoomFactor = 100 then
    SetMapMode(Canvas.Handle, MM_TEXT)
  else
  begin
    SetMapMode(Canvas.Handle, MM_ISOTROPIC);
    SetWindowExtEx(Canvas.Handle, 100,100, nil);
    SetViewportExtEx(Canvas.Handle,AZoomFactor, AZoomFactor, nil);
  end;
end;

Evian 10. Sep 2010 17:10

AW: Drucker canvas skalieren
 
oh ich muss mich vielmals entschuldigen... ich habe das C-Codebeispiel nicht gesehen. Sorry @NamenLozer!!!

mit

Code:
    var  
      form : tagXFORM;    
 
Printer.BeginDoc;
    SetGraphicsMode(Printer.Handle, GM_ADVANCED);
    SetMapMode(Printer.Handle,MM_ANISOTROPIC);

    form.eM11 := 0.95;
    form.eM12 := 0.0;
    form.eM21 := 0.0;
    form.eM22 := 0.95;
    form.eDx := 0.0;
    form.eDy := 0.0;

    SetWorldTransform(PRINTER.Canvas.Handle,form);
Printer.EndDoc;
kann ich auf 95% skalieren... funktioniert wunderbar. Danke!!!

xZise 10. Sep 2010 18:06

AW: Drucker canvas skalieren
 
Könntest du nicht vielleicht auch einfach eine eigene Unit verwenden (ist es also ein "gebräuchlicher" Code)? Hier gibt es glaub ich irgendwo eine Libary mit vielen verschiedenen Codes.

MfG
Fabian


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