DrawText gedreht ausgeben

Für allgemeine Fragen zur Programmierung mit PureBasic.
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

DrawText gedreht ausgeben

Beitrag von Sven »

Hallo!

Ich möchte auf einem Image einen Text (einfarbig) um einen bestimmten Winkel gedreht ausgeben. Bisher schreibe ich den Text mit DrawText horizontal.

Wie kann ich möglichst einfach eine Drehung beim Schreiben (Parameter für DrawText?) oder auch danach (Image-Bereich drehen?) erreichen? PB scheint dafür keine Funktionen zu haben?

Sven
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Eine Funktion zum rotieren von Text ist mir leider auch nicht bekannt. Sowas würde ich mir auch wünschen .Bild
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

Wenn du mit Sprites arbeiten würdest, könntest du mit Sprite3D und RotateSprite3D arbeiten. Aber bei Images...
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Es gibt ja im GDI irgendeine Funktion um TrueType Fonts zu rotieren, kenne sie leider nicht. In der 2D Drawing Lib wäre sie auch sehr sinnvoll.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Morty
Beiträge: 268
Registriert: 22.10.2004 07:20
Wohnort: Erfurt
Kontaktdaten:

Beitrag von Morty »

Folgende Funktion nutze ich immer. Ist von purearea.net:

Code: Alles auswählen

Procedure DrawRText(DC.l,x,y,Text.s,fFont.s,fangle.l,fHeight) 
  Font = CreateFont_(fHeight,0,fangle*10,0,0,0,0,0,0,0,0,0,0,fFont) 
  GetWindowRect_(WindowID(),r.RECT) 
  OldFont = SelectObject_(DC,Font) 
  SetTextAlign_(DC,#TA_BASELINE) 
  SetBKMode_(DC,#TRANSPARENT) 
  ExtTextOut_(DC, x,y,0 ,r,Text,Len(Text),0 ) 
  SelectObject_(DC,OldFont) 
  DeleteObject_(Font) 
EndProcedure 
Folgender Aufruf:

Code: Alles auswählen

OpenScreen(1024,768,16,"") 
For i = 0 To 255 
    ClearScreen(0,0,0) 
    DC = StartDrawing(ScreenOutput()) 
    FrontColor(255-i,i,0) 
    DrawRText(DC,Int(10+3*i),Int(100+2*i),"Testtext "+Str(i),"Arial",Int(i/6),20+Int(i/10)) 
    ;Parameter 
    ;1 = DeviceContext 
    ;2 = StartX 
    ;3 = StartY 
    ;4 = Text$ 
    ;5 = Font$ 
    ;6 = Angle 
    ;7 = FontHeight 
    FlipBuffers() 
    StopDrawing() 
Next 
Delay(2000) 
End 
Funktioniert bei mir immer und kann auch auf alle anderen Outputs angewandt werden.

Morty
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Funzt erst nach Änderungen:

Code: Alles auswählen

Procedure DrawRText(DC.l,x,y,Text.s,fFont.s,fangle.l,fHeight)
  Font = CreateFont_(fHeight,0,fangle*10,0,0,0,0,0,0,0,0,0,0,fFont)
  GetWindowRect_(WindowID(),r.RECT)
  OldFont = SelectObject_(DC,Font)
  SetTextAlign_(DC,#TA_BASELINE)
  SetBkMode_(DC,#TRANSPARENT)
  ExtTextOut_(DC, x,y,0 ,r,Text,Len(Text),0 )
  SelectObject_(DC,OldFont)
  DeleteObject_(Font)
EndProcedure 
InitSprite()
OpenScreen(1024,768,16,"")
For i = 0 To 255
    ClearScreen(0,0,0)
    DC = StartDrawing(ScreenOutput())
    FrontColor(255-i,i,0)
    DrawRText(DC,Int(10+3*i),Int(100+2*i),"Testtext "+Str(i),"Arial",Int(i/6),20+Int(i/10))
    ;Parameter
    ;1 = DeviceContext
    ;2 = StartX
    ;3 = StartY
    ;4 = Text$
    ;5 = Font$
    ;6 = Angle
    ;7 = FontHeight
    StopDrawing()
    FlipBuffers()
Next
Delay(2000)
End 
Ist aber nicht so ganz das richtige :(
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
FGK
Beiträge: 249
Registriert: 09.01.2005 14:02
Computerausstattung: i5-4430 CPU / 8GB RAM
GeForce GT630
Windows 10 Home / 64-bit
Wohnort: Augsburg

Beitrag von FGK »

Hi Leute,

verdammt ihr seid immer so schnell mit dem posten!
Ich würd es so lösen. Kommt dem gezeichneten Bild von
ts-Soft am nähesten. Viel Spaß damit

Code: Alles auswählen

#FONT_SIZE=12
If OpenWindow(0, 100, 200, 640,480,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_WindowCentered , "PureBasic Window")
  hdc = GetDC_(WindowID(0))
  NewFont.LOGFONT
  FontName.s = "Arial"+Chr(0)
  text.s = "Purebasic dreht durch..."
  NewFont\lfFaceName=@FontName
  For n =0 To 3600 Step 200
    s.f=s.f +0.15
    NewFont\lfEscapement = n
    NewFont\lfHeight = (#FONT_SIZE*-s.f)
    hFont = CreateFontIndirect_(NewFont)
    oldFont = SelectObject_(hdc,hFont)
    Textout_(hdc,WindowWidth()/2-75,WindowHeight()/2-75,text.s,Len(text.s))
    retval = SelectObject_(hdc,oldFont)
    retval=DeleteObject_(hFont)
  Next n  
   
  Repeat
    EventID.l = WaitWindowEvent()
   If EventID = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit = 1
    EndIf
   Until Quit = 1
EndIf
End 

Gruß
FGK
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

>> Kommt dem gezeichneten Bild von ts-Soft am nähesten

Das stimmt :allright: , jedoch ist das Bild nicht gezeichnet sondern programmiert in Profan. Hab lediglich einen SnapShot des Fensters gemacht.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Naja, um Ähnlichkeit liesse sich ja streiten. Ein bisschen Transparent dazu sowie den Text und die Schleife etwas angepasst und es sieht ausser dem Textfont schon fast ähnlicher :mrgreen:

Code: Alles auswählen

#FONT_SIZE=12
If OpenWindow(0, 100, 200, 640,480,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_WindowCentered , "PureBasic Window")
  OutputID = WindowOutput()
StartDrawing(OutputID) ; Endlich wird der Hintergrund weis :D
   FillArea(5, 5,RGB(254,254,254),RGB(254,254,254))
StopDrawing()
  hdc = GetDC_(WindowID(0))
  
  NewFont.LOGFONT
  FontName.s = "Arial"+Chr(0)
  text.s = "..............PureBasic ist klasse!"
  NewFont\lfFaceName=@FontName
  For n =0 To 3600 Step 156
    s.f=s.f +0.10
    NewFont\lfEscapement = n
    NewFont\lfHeight = (#FONT_SIZE*-s.f)
    hFont = CreateFontIndirect_(NewFont)
    oldFont = SelectObject_(hdc,hFont)
    SetBkMode_(hdc,#TRANSPARENT); erweitert :D
    TextOut_(hdc,WindowWidth()/2-75,WindowHeight()/2-75,text.s,Len(text.s))
    retval = SelectObject_(hdc,oldFont)
    retval=DeleteObject_(hFont)
  Next n
  Repeat
    EventID.l = WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow  ; If the user has pressed on the close button
      Quit = 1
    EndIf
   Until Quit = 1
EndIf
End
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
FGK
Beiträge: 249
Registriert: 09.01.2005 14:02
Computerausstattung: i5-4430 CPU / 8GB RAM
GeForce GT630
Windows 10 Home / 64-bit
Wohnort: Augsburg

Beitrag von FGK »

@Falko

Danke für den zum "Verständnis" sooo wichtigen weißen Hintergrund und die Transparenz. :twisted: Wichtig ist doch eigentlich nur daß die Anwendung des API-Aufrufs klar wird. Tut mir leid wenn du meine
flapsige Meldung "zur Ähnlichkeit" als Auslöser für ein möglichst
akribisches Imitat empfunden hast. :mrgreen: Ich hatte dies ja nur auf den vorherigen Post von Morty bezogen da dessen Ergebnis völlig an dem Wunsch von Sven vorbei ging.

Nix für ungut

FGK
Antworten