![]() |
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:
Wärend tmpbarcode.Print(x,y); wird der Barcode an die Stelle x,y ins Drucker Canvas geschrieben.
Printer.BeginDoc;
tmpbarcode.Print(x,y); Printer.EndDoc; 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 |
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.. |
AW: Drucker canvas skalieren
![]() |
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?! |
AW: Drucker canvas skalieren
Zitat:
![]() 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. |
AW: Drucker canvas skalieren
Hier auch nochmal 2 Links zu ähnlichen Themen:
![]() ![]() 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. |
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; |
AW: Drucker canvas skalieren
oh ich muss mich vielmals entschuldigen... ich habe das C-Codebeispiel nicht gesehen. Sorry @NamenLozer!!!
mit
Code:
kann ich auf 95% skalieren... funktioniert wunderbar. Danke!!!
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; |
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 11:14 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 by Thomas Breitkreuz