Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi printer.canvas.Textout spiegelverkehrt ausgeben ? (https://www.delphipraxis.net/5008-printer-canvas-textout-spiegelverkehrt-ausgeben.html)

JoelH 20. Mai 2003 14:30


printer.canvas.Textout spiegelverkehrt ausgeben ?
 
Ich hab ein misteriöses Problem, ich hab ein Programm für einen Plotter geschrieben, leider druckt dieser, nicht wie seinen 'normalen' Kollegen meine Ausgaben richtig aus sondern die Texte sind Spiegelverkehrt. Der Plotter ist ein HP Designjet700.
Jetzt will ich ihn dahigehend austricksen dass ich im einfach die Texte spiegelverkehrt sende, allerdings hab ich leider keine Ahnung wie ich dies dem Textout beibringe.

Stanlay Hanks 20. Mai 2003 15:10

Ich glaub nicht, dass das mit textout so einfach geht, weil das ja nur einen ganz normalen text drucken kann (glaub ich zumindest). Was mir da jetzt so spontan eingefallen wäre, wäre einfach eine Spiegelschrift als Schriftart zu verwenden, also einfach einen Anderen Schrifttyp.

Vielleicht gibts aber auch ne einfachere Lösung.
Man liest sich, Stanlay 8)

sakura 20. Mai 2003 15:20

Hier ein Anfang. Einfach mal testen.
Delphi-Quellcode:
var
  OldFontHandle: THandle;
  LogFont: TLogFont;
  FinalRect: TRect;
  Txt: String;
begin
  Txt := 'Sample';

  with PaintBox1 do
  begin
    SetGraphicsMode(Canvas.Handle, GM_ADVANCED);
    GetObject(Canvas.Font.Handle, SizeOf(LogFont), @LogFont);
    LogFont.lfEscapement := 1800;
    LogFont.lfOrientation := 0;
    LogFont.lfQuality := ANTIALIASED_QUALITY;
    OldFontHandle := Canvas.Font.Handle;
    Canvas.Font.Handle := CreateFontIndirect(LogFont);
    try
      FinalRect := Rect(50, 50, Width, Height);
      Windows.DrawText(Canvas.Handle, @Txt[1], Length(Txt), FinalRect,
          DT_EXTERNALLEADING + DT_NOPREFIX + DT_LEFT + DT_NOCLIP +
          DT_WORDBREAK);
    finally
      DeleteObject(Canvas.Font.Handle);
      Canvas.Font.Handle := OldFontHandle;
    end;
    SetTextCharacterExtra(Canvas.Handle, 0);
    SetGraphicsMode(Canvas.Handle, GM_COMPATIBLE);
  end;
end;
...:cat:...

JoelH 20. Mai 2003 15:41

hmm,
 
klasse, das geht schon, jetzt muss ich es nur noch für meine Zwecke implementieren.

Jens Schumann 20. Mai 2003 15:51

Hallo,
sakura's Vorschlag läuft nicht unter Win9x Systemen.
Erst ab Win2000 (WinNT konnte ich nicht testen).

Warum drehst Du den String nicht einfach um. Sakura's Vorschlag macht das auch.

Delphi-Quellcode:
function SkipString(const Value: String): String;
var
  I  : Integer;
  P  : PChar;
begin
  SetLength(Result, Length(Value));
  P := PChar(Result);
  for I := Length(value) DownTo 1 do
    begin
      P^ := Value[I];
      Inc(P);
    end;
end;
Aber Achtung: ich habe gerade noch einmal über Spiegelverkehrt nachgedacht. Das bedeutet doch, dass man jeden Buchstaben an seine vertikalen Achse spiegeln muss. Das kann mein und Sakura's Vorschlag aber nicht.

JoelH 21. Mai 2003 07:06

hmm,
 
also Sakura's Vorschlag dreht doch alles genauso wie ich es mir vorstelle. Also die Buchstaben selbst und von hinten nach vorne. Ich hoffe es rennt auch auf einer NT Kiste, dort brauch ich es nämlich.

Jens Schumann 31. Mai 2003 15:37

Hallo,
sakura's Code spiegelt unter Win2k (D5 SP1) die Buchstaben nicht and der vertikalen Achse.

SnGtKs 2. Dez 2005 22:15

Re: printer.canvas.Textout spiegelverkehrt ausgeben ?
 
um noch mal alten Kaffee aufzuwärmen ... ist stehe vor dem selben problem ... mit nem Bother Laser Drucker

Lannes 2. Dez 2005 22:47

Re: printer.canvas.Textout spiegelverkehrt ausgeben ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

Ergebnis siehe Anlage:
Delphi-Quellcode:
var ZielRect,QuellRect : TRect;
    s : String;
begin
  Canvas.Font.Size := 30;
  s := 'Spiegelschrift geht so ???';
  Canvas.TextOut(0,0,s);
  QuellRect.Left := Canvas.TextWidth(s);//<----  Left ist größer
  QuellRect.Top := 0;
  QuellRect.Right := 0;//<----                   als Right !!!
  QuellRect.Bottom := Canvas.TextHeight(s);
  ZielRect.Left := 0;
  ZielRect.Top := 50;
  ZielRect.Right := Canvas.TextWidth(s);
  ZielRect.Bottom := Canvas.TextHeight(s)+50;
  Canvas.CopyRect(ZielRect,Canvas,QuellRect);


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