Einzelnen Beitrag anzeigen

Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.640 Beiträge
 
#1

Gedrehter Text nicht sichtbar?

  Alt 4. Jul 2007, 09:53
Hi *.*

Ich habe aus diesem Tipp und diesem Thread hier ein Control gebaut, welches drehbaren Text enthalten soll.

Daraus ergab sich folgender Code in meiner Paint-Routine:

Delphi-Quellcode:
procedure TASCustomVisuPanel.Paint;
const
  Alignments: array[TAlignment] of Longint = (DT_LEFT, DT_RIGHT, DT_CENTER);
var
  Rect: TRect;
  FontHeight: Integer;
  Flags: Longint;
  LogFont: TLogFont; // drehbarer Text
  TempFont: TFont;
begin
  Rect := GetClientRect;

  // Hintergrund zeichnen:
  if not Assigned(FBackgroundBitmap)
    and not ThemeServices.ThemesEnabled
    or not ParentBackground then
  begin
    Canvas.Brush.Color := Color;
    Canvas.FillRect(Rect);
  end;

  // Hintergrundbild einzeichnen:
  if Assigned(FBackgroundBitmap) then
  begin
    BitBlt(Canvas.Handle, Rect.Left, Rect.Top, Self.ClientWidth,
      Self.ClientHeight, FBackgroundBitmap.Canvas.Handle, 0, 0, SRCCOPY);
  end;

  // Rahmen zeichnen
  if BevelOuter <> bvNone then
  begin
    Frame3D(Canvas, Rect, FColorBorder, FColorBorder, BevelWidth);
  end;

  Frame3D(Canvas, Rect, Color, Color, BorderWidth);

  if BevelInner <> bvNone then
  begin
    Frame3D(Canvas, Rect, FColorBorder, FColorBorder, BevelWidth);
  end;

  Canvas.Brush.Style := bsClear;
  Canvas.Font := Self.Font;
  FontHeight := Canvas.TextHeight('W');

  // Text ggf. drehen:
  if not (FTextAngle = 0) then
  begin
    TempFont := TFont.Create;
    try
      TempFont.Assign(Canvas.Font);

      GetObject(TempFont.Handle, SizeOf(LogFont), @LogFont);
      LogFont.lfEscapement := 10 * FTextAngle;
      LogFont.lfOrientation := 10 * FTextAngle;
      TempFont.Handle := CreateFontIndirect(LogFont);

      Canvas.Font.Assign(TempFont);
    finally
      FreeAndNil(TempFont);
    end;
  end;

  with Rect do
  begin
    Top := ((Bottom + Top) - FontHeight) div 2;
    Bottom := Top + FontHeight;
  end;

  Flags := DT_EXPANDTABS or DT_VCENTER or Alignments[FAlignment];
  Flags := DrawTextBiDiModeFlags(Flags);
  DrawText(Canvas.Handle, PChar(Caption), -1, Rect, Flags);
end;
Das funktioniert nur leider nicht.

Nehme ich als Font z.B. Courier - also einen Font der nicht TrueType ist, wird dieser ganz normal horizontal gezeichnet. - Schliesslich soll das ja auch lt. Jens gar nicht funktionieren.

Benutze ich nun aber einen TrueType-Font, so sehe ich gar keinen Text.

Was geht da schief?
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat