Text Drehen ?

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Text Drehen ?

Beitrag von pluto »

Hallo,
nach einigen suchen bin ich auf diesen Code gestoßen:

Code: Alles auswählen

procedure TForm1.VerticalTitleBar(TexTo: string; Size: Integer);
var
  LogFont: TLogFont;
  tmpCanvas: TCanvas;
  tmpRect: TRect;
  x1, x2, y1, y2: integer;
begin
  tmpCanvas        := PaintBox1.Canvas;
//  tmpCanvas.Handle := GetWindowDc(Handle);
  try
    GetObject(Canvas.Font.Handle, SizeOf(LogFont), @LogFont);
    with LogFont do
    begin
      lfEscapement   := 90 * 10;
      lfOrientation  := 90 * 10;
      lfOutPrecision := OUT_TT_ONLY_PRECIS;
      lfFaceName     := 'dejavu sans';
      lfHeight       := Size+5;
//      lfWeight       := FW_BOLD;
      lfQuality      := PROOF_QUALITY;
    end;
    with tmpCanvas do
    begin
      Font.Handle := CreateFontIndirect(LogFont);
      Font.Color  := clWhite;
      Brush.Color := clNavy;
    end;
    x1 := GetSystemMetrics(SM_CXEDGE) + GetSystemMetrics(SM_CXBORDER);
    x2 := 20;
    y1 := GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYEDGE) +
          GetSystemMetrics(SM_CYBORDER) + 1;
    y2 := Height - GetSystemMetrics(SM_CYEDGE) - GetSystemMetrics(SM_CYBORDER);
    tmpRect := Rect(x1, y1, x2, y2);
    tmpCanvas.FillRect(tmpRect);
 
    DrawText(tmpCanvas.Handle, PChar(Texto), - 1, tmpRect, DT_BOTTOM or
      DT_SINGLELINE);
  finally
//    tmpCanvas.Free;
  end;
end;
Der Code dreht die Buchstaben zwar schon, aber der Text wird leider immer noch Horizontal gezeichnet.
Aber ich hätte ihn gerne Vertikal....
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Das ist pure WinAPI, es ist recht unwarscheinlich das der in nicht Win32 Widgetsets korrekt funktioniert. Da wirst du wohl auf GTK internas zurückgreifen müssen, wie z.b. hier http://www.mail-archive.com/lazarus@mir ... 18159.html mal auf der Mailingliste diskutiert.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

Hat nicht alexander auf seinem Button den Text auch gedreht?

Eventuell kannst du dich ja da inspirieren lassen.
Johannes

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

leider nein. ich habe mir seinen soruce-code angeschaut, leider macht er das pixelweise also er dreht den Canvas... ich wollte den button bei mir verwenden evlt. aber leider dauert das klicken einfach zu lange und die cpu last steig auf über 50%

@Christian
Der Code von oben geht, aber leider wird der Schrift zug nur horizontal gezeichnet und nicht vertikal, die Buchstaben werden aber gedreht.

Naja WINAPI ist übertrieben das TLogFont Objekt dürfte doch nix mit Winapi zu tun haben oder ?

und ich habe den Daten Typ in der LCLtype gefunden.

Ich muss nur noch einen Weg finden, den Schrift zug auch Vertikal zu zeichnen... Danke für den Link, werde ich mir gleich mal anschauen

Edit01: Das sieht auf den ersten Blick nicht einfach aus, ich werden den Code aber ausprobieren....
Geht der Code auch unter GTK1 ? weil ich sehe da immer nur GTK2...
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

Auf GTK2 geht auch dein Code, auf GTK1 geht nichts.
Habe Ihn zum testen leicht vereinfacht und mal mit 45grad getestet:

Code: Alles auswählen

procedure TForm1.VerticalTitleBar(TexTo: string; Size: Integer);
var
  LogFont: TLogFont;
  tmpCanvas: TCanvas;
  tmpRect: TRect;
  x1, x2, y1, y2: integer;
begin
  tmpCanvas        := PaintBox1.Canvas;
  try
    GetObject(PaintBox1.Canvas.Font.Handle, SizeOf(LogFont), @LogFont);
    with LogFont do
    begin
      lfEscapement   := 45 * 10;
      lfOrientation  := 45 * 10;
      lfOutPrecision := OUT_TT_ONLY_PRECIS;
      lfFaceName     := 'Arial';
      lfHeight       := Size+5;
//      lfWeight       := FW_BOLD;
      lfQuality      := PROOF_QUALITY;
    end;
    with tmpCanvas do
    begin
      Font.Handle := CreateFontIndirect(LogFont);
      Font.Color  := clBlack;
      Brush.Color := clNone;
    end;
    tmpCanvas.TextOut(0,tmpCanvas.TextWidth(Texto)+5,Texto);
  finally
 
  end;
end;

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

CreateFontIndirect ist WinAPI TLogFont ist nur eine Datenstruktur und die ist auch Winapi spezifisch.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

ach so... allerdings ist TLogFont in der LCLType definiert !
Aber lassen wir das....


Danke theo anscheind ist das wohl ein kleiner Fehler in der GKT1 Implementierung !
Schade ! Kannst du mir ein Bild zeigen wie es bei dir aussieht mit 45 ° ?

Die schrift art Arial wollte er bei mir nicht.... Da kam immer eine Fehler Meldung das sie nicht gefunden wird in den Ausgaben.
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Genau, und die LCLType implementiert Typen die es eigentlich nur unter Windows gibt für andere Betriebsysteme / Widgetsets.

z.b. http://www.freepascal.org/docs-html/lcl ... dex-3.html Sieht man eig auf den ersten Blich das das alles WinAPI kram ist.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Ich würde sagen, nicht umgedingt WinApi sondern generell API.
Einiges geht auch unter Linux oder auf anderen Plattformen...

Es währe doch irgendwie blöd all diese Daten Typen in einer LCLTYpe zu definieren, wenn sie nur unter Windows zu Gebrauchen sind.Wozu gibt es die unit Windows denn ?

Ich werde mal weiter forschen... Kennst du dich mit der API Programmierung unter Lazarus aus ?
ich meine Plattform unabhängig ?
Für Windows gibt es ja genügend Tutorials und Hilfen...

Ich habe mich mal einige Zeit direkt mit GTK1 Objekten befasst...
Müsste Lazarus bzw. die LCL, nicht auch eine Plattform unabhängige API haben ?

Mir ist aufgefallen das sogar einige WINAPI Botschaften unter Linux ankommen.
Aber leider nur Teilweise... z.b. bei WMPaint gibt es anscheind Probleme...

Ich habe mal versucht bei einem Memo einen Hintergrund zu Zeichnen also eine Grafik.
An sich hätte das klappen müssen. Leider wahr der Handel in der Datenstruktur nicht gesetzt...
evlt. ein BUG, ich hatte die Frage hier mal gepostet.
Eigentlich wollte ich versuchen ob es möglich ist ein Transparentes Memo hinzubekommen.

So eine API ist eigentlich Praktisch. z.b. hat WinAmp unter Windows auch eine*G*...
Unter Linux ist mir sowas noch nicht begegnet... Nur auf umwege... aber sowas wie mit Botschaften zu senden noch nicht. z.b. währe es Praktisch den einen oder anderen Video Player Fernzusteuern.

Edit:
Das Handel in der WMPaint Botschaft von TPaintStruct wahr nicht gesetzt. *Leider*
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

bei mir sieht es so aus
Dateianhänge
test1.jpg
test1.jpg (3.25 KiB) 1874 mal betrachtet
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Es währe doch irgendwie blöd all diese Daten Typen in einer LCLTYpe zu definieren, wenn sie nur unter Windows zu Gebrauchen sind.Wozu gibt es die unit Windows denn ?
Lies doch mal was ich schreibe. genau das gegenteil ist der fall. Unter Windows gibts die Funktionen eh LCLProc und LClType implementieren die für andere Widgetsets.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Ich habe dich wohl Falsch verstanden vorhin !
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

pluto hat geschrieben:bei mir sieht es so aus
Ich sag ja, dass es auf GTK1 nicht geht. Probier's doch mal mit GTK2.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Und bei dir wird der Schriftzug vertikal gezeichnet ?
Ich werde es morgen mal mit GTK2 Probieren....
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

pluto hat geschrieben:Und bei dir wird der Schriftzug vertikal gezeichnet ?
Ich werde es morgen mal mit GTK2 Probieren....
Ja, resp. im obigen Beispiel 45 Grad.

Antworten