Seite 1 von 3

Schrift als Kreis verbiegen

Verfasst: 25.07.2006 18:01
von Calloway
Hallo!

Suchfunktion -> ergebnislos. Ich wusste auch nicht, wonach ich suchen sollte.

Mein Problem: Ich möchte Text als Kreis verbogen ausdrucken, so ähnlich wie die Copyrightvermerke an den Außenrändern von "bespielten" CDs. Ich denke ich müsste da über die Grafikfunktionen gehen. Aber wie gehe ich das am besten an? Und wie bekomme ich das auf den Drucker?

Vielen Dank schon mal für eure Hilfe.

Verfasst: 26.07.2006 03:30
von Just_reading
Du könntest CreateFont_ verwenden.
Dazu müsstest du nur aus die einzelnen Buchstaben mittels einer Kreisberechnung und der Angabe des Winkels bei CreateFont_ deinen Text auf ein Image oder einen anderen DC zeichnen.

Verfasst: 26.07.2006 04:12
von STARGÅTE
Am besten du machst es so :

Du machst dir ein leeres Sprite3D, welches du auf dem Bildschirm anzeigst.
Dann wird ein buchstabe auf dem Bildschirm wo das Sprite ist angezeigt.
Dann machst du GrabSprite() und machst aus diesem wieder ein Sprite3D und lässt es um ein paar Grad drehen und dann anzeigen.
Nun lässt du den nächsten buchstarben anzeigen (der ist dann etwas daneben) usw.

Allerding wird das ergibsnis dich nicht recht zufrieden , denn die ersten Buchstaben könnten sehr komisch verschwommen sein, musst du einfach mal testen :allright: [/code]

Verfasst: 26.07.2006 04:25
von Just_reading
Ich bin gespannt wie du ein Sprite ausdruckst ;-)

Und wie bekomme ich das auf den Drucker?

Verfasst: 26.07.2006 04:46
von PMV
Hm ... also fals sich mit der Suche keine Ergebnise erziehlen lassen,
könnte er sein Sprite immer noch in ein Images umwandeln lassen. Fals
er aber zu faul für die Suche ist (weis jetzt nicht ob das im deutschen
oder englischen Forum war) könnte er das Sprite immer noch
abspeichern und dann als Image laden.

Allerdings sind glaub beide Methoden ziemlich Rechenlasstig und nichts
für die "Echtzeit". Aber mit der Sprite3D-Lib kann er seine Buchstaben
mittels der PB Befehle drehen. Im Forum lassen sich aber sicher auch
sogar fertige Prozeduren finden, welche normale Sprites oder sogar
Images drehen. Bei der suche eventuell auch das englische Forum und
Code-Archiv mit einbinden :wink: .

Um die richtigen Koordinaten und den Winkel raus zu bekommen für
jeden Buchstaben brauchst du die entsprechenden Funktionen zur
Berechnung von Kreisen. Hm, mir fallen da die Suchwörter
"Kreisberechnung", "Durchmesser", "Winkel", "Radus", "Umfang" ein.
Vielleicht sucht auch ein anderer wenne glück hast.

MFG PMV

Verfasst: 26.07.2006 05:20
von Just_reading
Ich verstehe nicht warum du es so umständlich machen würdest.
Die Api und die Mathematik bieten hier alles Nötige.


Wie ich schon oben geschrieben habe, muß noch der Text Buchstabe für Buchstabe CreateFont_ im richtigen Winkel eingestellt und über TextOut_ auf dem DC mittels einer Kreisbahnberechnung ausgegeben werden.

Fertige Kreisberechnungen findest du in Pure-Board, PureBasic-Lounge, PureArea.net und auch im englischen PureBasic-Forum nahezu unzählbar.

Verfasst: 26.07.2006 21:07
von Falko
Jetzt habe ich mich mal wieder an Grafik in PB versucht. :mrgreen:
So könnte man es z.B. mittels API machen. Falls jemand eine
PB-Demo-Version hat, ist dieser Source, so wie er ist, leider nicht funktionsfähig.

Hier mal, wie man es direkt auf Windows-Fenster ohne über die ganzen
SpritesundScreenextras zu zeichen. Für das Drucken und für das kopieren
des aktiven Fensters gibt es schon einige Tips z.B. in PureArea.net

Code: Alles auswählen

;Author: Falko Lünsmann
;API and PB3.94: Draws simple Text on circle


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

 OpenWindow(0, 0, 0, 400, 400, #PB_Window_SystemMenu|#PB_Window_ScreenCentered, "Arc and bezier curves")
 
 Procedure Circle_Text(String$)
  hDc=StartDrawing(WindowOutput())
  If hDc
      FrontColor(0,255,0)
      Radius=180
      String$="Purebasic 4 you"
  
      For i=1 To Len(string$)
         Zeichen$=Mid(String$,i,1)
         Winkel=20 * i
         X = Radius*Sin(Winkel/360*2*#PI)
         Y = Radius*Cos(Winkel/360*2*#PI)
         DrawRText(hDc,WindowWidth()/2+X,WindowHeight()/2+Y,Zeichen$,"Arial",Winkel,40)
      Next i
   StopDrawing()
   EndIf
  EndProcedure
 Circle_Text("Happy Purebasic4")
 Repeat
  Event=WaitWindowEvent()
  If Event=#PB_EventMoveWindow:Circle_Text("Happy Purebasic4"):EndIf ;  Redraw Windows!
 Until Event = #PB_EventCloseWindow
Grüße Falko

Verfasst: 26.07.2006 21:51
von ts-soft
Habs mal an PB4 angepaßt :mrgreen:

Code: Alles auswählen

;Author: Falko Lünsmann
;API and PB4: Draws simple Text on circle
; changed for PB4: ts-soft

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(0),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

 OpenWindow(0, 0, 0, 400, 400, "Arc and bezier curves", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
 
 Procedure Circle_Text(String$)
  hDc=StartDrawing(WindowOutput(0))
  If hDc
      FrontColor(RGB(0,255,0))
      Radius=180
      String$="Purebasic 4 you"
 
      For i=1 To Len(string$)
         Zeichen$=Mid(String$,i,1)
         Winkel=20 * i
         X = Radius*Sin(Winkel/360*2*#PI)
         Y = Radius*Cos(Winkel/360*2*#PI)
         DrawRText(hDc,WindowWidth(0)/2+X,WindowHeight(0)/2+Y,Zeichen$,"Arial",Winkel,40)
      Next i
   StopDrawing()
   EndIf
  EndProcedure
 Circle_Text("Happy Purebasic4")
 Repeat
  Event=WaitWindowEvent()
  If Event=#PB_Event_MoveWindow : Circle_Text("Happy Purebasic4") : EndIf ;  Redraw Windows!
 Until Event = #PB_Event_CloseWindow

Verfasst: 26.07.2006 22:00
von Falko
Hi, Thomas, hab's mal auf Pb3.94 korrigiert <) (Ausser den bei dir :lol: )
Irgendwann werde ich die alten PB-versionen vernichten.

Es kann nur einen geben :mrgreen:


Gruß Falko

Verfasst: 26.07.2006 22:12
von Calloway
Vielen Dank für die rege Teilnahme und für den fertigen Code. Mal schauen, was ich daraus machen kann.