Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Canvas, Vertikaler Text (https://www.delphipraxis.net/58487-canvas-vertikaler-text.html)

igel457 7. Dez 2005 18:16


Canvas, Vertikaler Text
 
Hi,

weiß jemand von euch wie ich einen Text auf ein einfaches Canvas vertikal ausgeben kan? (Ungerfähr so wie auf einem TPageControl)

(Hoffe das ist die richtige Sparte, Multimedia ginge vieleicht auch...)

Danke, igel457

SirThornberry 7. Dez 2005 18:25

Re: Canvas, Vertikaler Text
 
willst du den Text gedreht ausgeben oder oder so:
D
E
I
N

T
E
X
T

ichbins 7. Dez 2005 18:28

Re: Canvas, Vertikaler Text
 
Gebe deinen Text auf einem Tbitmap aus und drehe dieses dann.

Nils_13 7. Dez 2005 18:30

Re: Canvas, Vertikaler Text
 
http://www.delphipraxis.net/internal...t=canvas+90%B0
Könnte evtl. sogar ausreichen.

igel457 7. Dez 2005 18:56

Re: Canvas, Vertikaler Text
 
Ich meinte um 90° Drehen.

Danke, das Problem wäre damit gelöst!!!

Neutral General 7. Dez 2005 18:57

Re: Canvas, Vertikaler Text
 
Zitat:

Zitat von SirThornberry
willst du den Text gedreht ausgeben oder oder so:
D
E
I
N

T
E
X
T

Also so wie ich ihn versteh will er ihn "so" ausgeben.
Das machst du halt etwa so:

Delphi-Quellcode:
var S: String;
    i: Integer;
begin
 S:= 'Hallo';
 //Canvas.Brush.Style := bsClear;
 for i:= 1 to Length(S) do begin
  Canvas.Textout(0,I*16,S[i]);
 end;
 end;
also so in etwa. Mit den Y-Werten musst du mal rumexperimentieren. Das hängt natürlich auch von der Schriftgröße ab...
EDIT: Also mit Standard-Schriftgröße funktioniert das prima.

glkgereon 7. Dez 2005 19:00

Re: Canvas, Vertikaler Text
 
Zitat:

Zitat von Neutral General
Also so wie ich ihn versteh will er ihn "so" ausgeben.
Das machst du halt etwa so:

Delphi-Quellcode:
var S: String;
    i, H: Integer;
begin
 S:= 'Hallo';
 H:=0;
 for i:= 1 to Length(S) do
  begin
  Canvas.Textout(0,H,S[i]); // 
  H:=H+Canvas.TextHeight(S[i])+5;
  end;
 end;

Nun musst du nur noch mit dem Abstand zwischen den Buchstaben rumexperimentieren. Die eigentliche buchstabenhöhe wird automatisch und vor allem exakt aufaddiert :)

alzaimar 7. Dez 2005 19:03

Re: Canvas, Vertikaler Text
 
Rotierten Text gibt man so aus (vorausgesetzt, der Font kann das, z.b. TrueType):
Delphi-Quellcode:
 
Var
  aFt : LOGFONT;
 
begin
...
  GetObject (aCanvas.Font.Handle, SizeOf (aFt), @Aft);
  aFt.lfEscapement := 10 * Rotation; // Rotate ist der Winkel in Grad
  aFt.lfOrientation := aft.lfEscapement;
  aCanvas.Font.Handle := CreateFontIndirect(aFt);

SirThornberry 7. Dez 2005 19:11

Re: Canvas, Vertikaler Text
 
um jede art von Text um 90° zu drehen braucht man nur den Hintergrund in die andere Richtung um 90° drehen, dann den Text drauf schreiben, und dann wieder zurück drehen. (Bilder um 90° drehen ist ja kein problem)

igel457 8. Dez 2005 18:05

Re: Canvas, Vertikaler Text
 
Gut ich hab mir ne Funktion geschrieben, die das nun für mich erledigt.

Das wie alzaimar es Vorgeschlagen hat, hat nicht geklappt.

Also, wen es noch interessiert, so ist's gemacht:
Delphi-Quellcode:
procedure VerticalText(x,y:integer;text:string;target:TCanvas);
Var
  bmp:TBitmap;
begin
  with target do
  begin
    bmp := TBitmap.Create;
    bmp.Canvas.Font := font;
    bmp.Width := textwidth(text);
    bmp.Height := textheight(text);
    bmp.Canvas.TextOut(0,0,text);
    turn(bmp);
    draw(x,y,bmp);
    bmp.Free;
  end;
end;

type TMyhelp = array[0..0] of TRGBQuad;

procedure Turn(const Bitmap: TBitmap);
var P: PRGBQuad; //^THelpRGB;
    x,y,b,h : Integer;
    RowOut: ^TMyHelp;
    help: TBitmap;
begin
  Bitmap.PixelFormat := pf32bit;
  help := TBitmap.Create;
  try
    help.PixelFormat := pf32bit;
    b := bitmap.Height;
    h := bitmap.Width;
    help.Width := b;
    help.height := h;
    for y := 0 to (h-1) do
    begin
      rowOut := help.ScanLine[y];
      P := Bitmap.scanline[bitmap.height-1];
      inc(p,y);
      for x := 0 to (b-1) do
      begin
        rowout[x] := p^;
        inc(p,h);
      end;
    end;
  finally
    bitmap.Assign(help);
  end;
end;


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