DrawText gedreht ausgeben

Für allgemeine Fragen zur Programmierung mit PureBasic.
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 »

FGK hat geschrieben:@Falko

... Tut mir leid wenn du meine
flapsige Meldung "zur Ähnlichkeit" als Auslöser für ein möglichst
akribisches Imitat empfunden hast. ....
FGK
Das habe ich natürlich nicht so empfunden :lol: . Ich hatte ja auch nur das Bild von ts gesehen. Den ganzen Post hatte ich natürlich nicht durchgelesen. Ich hoffe, du bist mir nicht böse :roll:

Übrigens deinen tollen Source habe ich mir abgespeichert, da ich ihn sehr gut gebrauchen kann :allright: Danke

Mit freundlichen Gruss

Falko
Zuletzt geändert von Falko am 30.09.2005 19:50, insgesamt 1-mal geändert.
Bild
Win11 Pro 64-Bit, PB_6.11b1
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Beitrag von Sven »

Danke, Leute!

Das sieht doch recht gut aus, mit weichen Kanten... Deutlich besser lesbar als das Beispiel aus dem Code-Archiv.

Und eine entsprechende PB-Funktion wäre in Zukunft auch nicht schlecht.

Sven
Benutzeravatar
Morty
Beiträge: 268
Registriert: 22.10.2004 07:20
Wohnort: Erfurt
Kontaktdaten:

Beitrag von Morty »

FGK hat geschrieben: Ich hatte dies ja nur auf den vorherigen Post von Morty bezogen da dessen Ergebnis völlig an dem Wunsch von Sven vorbei ging.
Naja, ganz so schlimm seh ich das nicht. Ich wollte lediglich ein Beispiel bringen wie man Text drehen kann. Das funktioniert ... also bin ich nicht ganz so am Wunsch vom Sven vorbei gegangen. Ein bissl was kann ein Programmierer ja auch noch selbst machen, oder? Ich finde Gedankenanstöße sowieso besser als den Wettstreit wer den Wunsch eines Users am besten umsetzt.

In diesem Sinne ...

Morty
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@morty:

leider hast du was mißverstanden:

> Post von Morty bezogen da dessen Ergebnis völlig an dem Wunsch von Sven vorbei ging

trifft zu, da Sven von einem Image sprach, und damit darstellung auf einem Window,
und nicht auf einem DX-Screen meinte.

sorry...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Morty
Beiträge: 268
Registriert: 22.10.2004 07:20
Wohnort: Erfurt
Kontaktdaten:

Beitrag von Morty »

Okay, zugegeben, es bezog sich auf ein Screen, aber wie ich selbst drunter geschrieben hab geht das auch mit allen anderen Outputs. Sprich, einfach:

Code: Alles auswählen

CreateImage(...)
....
DC=Startdrawing(ImageOutput())

  ; Hier die DrawRText(DC,.....) - Funktion
Stopdrawing()
Wie gesagt, ein bissl was sollte man auch selbst machen. Aber ist jetzt wirklich okay.

Morty
sobi
Beiträge: 170
Registriert: 05.02.2005 23:41
Wohnort: passau
Kontaktdaten:

Beitrag von sobi »

Morty hat geschrieben:Okay, zugegeben, es bezog sich auf ein Screen, aber wie ich selbst drunter geschrieben hab geht das auch mit allen anderen Outputs. Sprich, einfach:
Hi,
also ich habe würde den Text gerne auf einem Image ausgeben. Habe das aber beim besten Willen nicht hingebracht. So habe ich es versucht:

Code: Alles auswählen

Procedure t_senkrecht(x.l,y.l,text.s)
#FONT_SIZE=12 
  hdc = GetDC_(ImageOutput(2)) 
  NewFont.LOGFONT 
  FontName.s = "Arial"+Chr(0) 
  NewFont\lfFaceName=@FontName  
    s.f=1
    
    NewFont\lfEscapement = 900 
    NewFont\lfHeight = (#FONT_SIZE*-1) 
    hFont = CreateFontIndirect_(NewFont) 
    oldFont = SelectObject_(hdc,hFont) 
    SetBkMode_(hdc,#TRANSPARENT); erweitert :D 
    TextOut_(hdc,x,y,text.s,Len(text.s)) 
    retval = SelectObject_(hdc,oldFont) 
    retval=DeleteObject_(hFont)  
EndProcedure




If OpenWindow(0, 100, 200, 640,480, "PureBasic Window",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_WindowCentered ) 

    CreateImage(2,100,100)
    hdc = StartDrawing(ImageOutput(2))
      DrawingMode(0) : Box(0,0,100,200,RGB(255,255,255)) : FrontColor(RGB(0,0,0))
      DrawingMode(1)
      t_senkrecht(20,20,"test")
      StopDrawing()
      CreateGadgetList(WindowID(0))
      ImageGadget(1,50,50,100,100,ImageID(2))
  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
LG, Simon
Sorgen sind wie Blumen, wenn man sie nicht gießt, gehen sie ein.
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 »

@sobi

Dein Code wäre prinzipiell schon richtig, aber leider scheint bei der
Ausgabe auf ein Image die API-Funktion Textout_ die Angabe der
X und Y Koordinaten zu ignoriren. Dadurch, daß immer 0,0 als
Startpunkt des Textes benutzt wird, wird bei 90 Grad der Text komplett
aus dem Image herausgedreht und deshalb nicht angezeigt. Den Grund
konnte ich bis jetzt noch nicht ermitteln. Eventuell weis ein anderer User
ja den Grund dafür.

Gruß FGK

Habe den Code etwas umgebaut - mit 0-45 Grad hauts noch hin,
da siehst du noch ein bischen vom Text.

Code: Alles auswählen

Procedure t_senkrecht(x.L,y.L,text.s,ImgNr.L) 
  #FONT_SIZE=12 
    hdc = StartDrawing(ImageOutput(ImgNr)) 
    Debug hdc
    DrawingMode(0) 
    Box(0,0,100,200,RGB(255,255,255)) 
    FrontColor(RGB(0,0,0)) 
    DrawingMode(1) 
    NewFont.LOGFONT 
    FontName.s = "Arial"+Chr(0) 
    NewFont\lfFaceName=@FontName  
    NewFont\lfEscapement = 0
    NewFont\lfHeight = (#FONT_SIZE+2) 
    hFont = CreateFontIndirect_(NewFont) 
    oldFont = SelectObject_(hdc,hFont) 
    ;SetBkMode_(hdc,#TRANSPARENT); erweitert :D 
    TextOut_(hdc,100,100,text.s,Len(text.s)) ; Hier stimmt was nicht! 
    RetVal = SelectObject_(hdc,oldFont) 
    RetVal=DeleteObject_(hFont)  
  StopDrawing() 
  
  EndProcedure 




If OpenWindow(0, 100, 200, 640,480, "PureBasic Window",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_WindowCentered ) 
  
  CreateImage(2,100,100)
  t_senkrecht(10,50,"TEST",2) 
  CreateGadgetList(WindowID(0)) 
  ImageGadget(1,50,50,100,100,ImageID(2)) 
  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
sobi
Beiträge: 170
Registriert: 05.02.2005 23:41
Wohnort: passau
Kontaktdaten:

Beitrag von sobi »

Ärgerlich, dass er X und Y ignoriert. Ist es irgendwie auf einem anderen Weg möglich, ihm einen X&Y startpunkt zu geben?
Sorgen sind wie Blumen, wenn man sie nicht gießt, gehen sie ein.
Benutzeravatar
tobe
Beiträge: 146
Registriert: 14.09.2006 17:33
Wohnort: Oktoberfest

Beitrag von tobe »

hi,
ich hab auch mal etwas an dem code rumgespielt und jetzt ist er über die koordinaten verschiebbar.
neu dazugekommen ist eigentlich nur SetTextAlign_(hdc, #TA_CENTER)

Code: Alles auswählen

Procedure t_senkrecht(x.l,y.l,Text.s,ImgNr.l)
  #FONT_SIZE=12
  hdc = StartDrawing(ImageOutput(ImgNr))
  ;Debug hdc
  DrawingMode(0)
  Box(0,0,100,200,RGB(255,255,255))
  FrontColor(RGB(0,0,0))
  DrawingMode(1)
  NewFont.LOGFONT
  FontName.s = "Arial"+Chr(0)
  NewFont\lfFaceName=@FontName 
  NewFont\lfEscapement = -900
  NewFont\lfHeight = (#FONT_SIZE+2)
  hFont = CreateFontIndirect_(NewFont)
  oldFont = SelectObject_(hdc,hFont)
  ;SetBkMode_(hdc,#TRANSPARENT); erweitert :D
  SetTextAlign_(hdc, #TA_CENTER)
  TextOut_(hdc,x,y,Text.s,Len(Text.s))
  RetVal = SelectObject_(hdc,oldFont)
  RetVal=DeleteObject_(hFont) 
  StopDrawing()
EndProcedure

If OpenWindow(0, 100, 200, 640,480, "PureBasic Window",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_WindowCentered )
  CreateImage(2,100,100)
  t_senkrecht(30,50,"TEST",2)
  CreateGadgetList(WindowID(0))
  ImageGadget(1,50,50,100,100,ImageID(2))
  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 
PureBasic 4.40 (Windows - x86)
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 »

@tobe

Klasse! :allright:

Anscheinend braucht Textout_ irgend ein gesetztes Align -
bei DCs von Fenstern scheint schon eines vorgegeben zu sein, darum
klappt es da auch ohne. Bei Images brauch das wohl explizit gesetzt
zu werden. Rausgefunden hab ich noch daß mit #TA_Center, #TA_Left
und #TA_Right die Koordinatenangabe sich auf jeweils die Eckpunkte
bezieht. Das heißt bei dem geforderten senkrechten Schriftzug ist die
kleinste mögliche X Koordinate = der Fonthöhe wenn man alles sehen will.

Code: Alles auswählen


#TA_Left      #TA_Center    #TA_Right

X----------   -----X-----   ----------X
|         |   |         |   |         | 
-----------   -----------   -----------

Antworten