Gadgets beschriften mit Zusatztext - Last Update: mehrzeilig

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Gadgets beschriften mit Zusatztext - Last Update: mehrzeilig

Beitrag von hjbremer »

will man Gadgets mit Infotexten versehen ist dies mit einem gewissen Aufwand verbunden.
TextGadget erstellen, Position berechnen, Größe, ev. Farbe usw

Dieses Modul vereinfacht dies, indem es mit 5 Flags den Infotext positioniert.
Als WriteText.pbi speichern und mit XIncludeFile "WriteText.pbi" einbinden oder solo ausprobieren

Update: #goLeft + #goRight ohne Align Parameter, jetzt automatisch #goCenter
Update: mehrzeilig
Update: Font auf Default zurücksetzen

Code: Alles auswählen

;- Gadgets beschriften by HJBremer V.1.31 Nov 2022 - Windows 10 - PB ab 5.70 all

;Text kann rund um ein Gadget positioniert werden, auch mehrzeilig ausgerichtet
;
;WriteText(text$, parent, position=#goTop, align=#goLeft, gap=2, flag=0)

;  parent   = pbnr des Gadgets welches beschriftet wird
;  position = flag bestimmt wo der Text hin soll, flags gelten auch für align, siehe DeclareModule 
;  align    = flag bestimmt wo Text an welcher Stelle der Position steht
;  gap      = Abstand zum Parentgadget, Vorgabe ist 2 Pixel Abstand zum Gadget 
;  flag     = Ausrichtung für mehrzeiligen Text, #PB_Text_Right ..Center, Left ist Standard
;             unter Windows kann man #WS_BORDER als flag für Testzwecke angeben 

;     Standarvorgabe ist #goTop, #goLeft, Abstand 2 Pixel zum Gadget
;     wenn Position #goLeft oder #goRight, Vorgabe align=#goLeft wird intern zu #goCenter 

;Beispiele
;  WriteText("Bananen", pbnr)                            ;über dem Gadget links
;  WriteText("Eingabe", pbnr, #goLeft)                   ;links vom Gadget mittig
;  WriteText("Eingabe", pbnr, #goRight, #goTop)          ;rechts vom Gadget oben
;  WriteText("Eingabe", pbnr, #goRight, #goBottom, 3)    ;rechts vom Gadget unten Abstand 3 
;  WriteText("Eingabe", pbnr, #goRight, #goBottom, 3)    ;rechts vom Gadget unten Abstand 3 
;  WriteText("Eingabe", pbnr, #goBottom, #goCenter, 3)   ;unter dem Gadget mittig Abstand 3 

;  WriteText("Eingabe"+#LF$+"Euro"+#LF$+"Cola", pbnr)    ;mehrzeilig oben links
;
;  WriteText(~"Stücke\ngelb\ngelblich\ngelb", pbnr)      ;~ + \n als Escapezeichen für #LF$

;  WriteText(~"Stücke\ngelb\ngelblich\ngelb", pbnr, #goLeft, #goCenter, 2, #PB_Text_Right)

;WriteTextColor(flag, value)        ;ändert für ALLE folgenden WriteText() den Font oder Farben
;
;  WriteTextColor(#PB_All, fontid)        ;#PB_Any kann auch benutzt werden
;  WriteTextColor(#PB_All, #PB_Default)   ;Font zurück auf internen DefaultFont

;  WriteTextColor(#PB_Gadget_BackColor, color)   ;Color ändern
;  WriteTextColor(#PB_Gadget_FrontColor, color)  ;Color ändern

DeclareModule WriteText
   
   #goTop = 16 
   #goLeft = 1
   #goRight = 2
   #goBottom = 128   
   #goCenter = $100000
   
   Declare.i WriteTextColor(flag, value) ;für WriteText, Font oder Color ändert sich ab Aufruf 
   
   Declare.i WriteText(text$, parent, position=#goTop, align=#goLeft, gap=2, flag=0) ;gap = Abstand
   
EndDeclareModule
;-
Module WriteText   
   EnableExplicit
   
   Global backcolor = 0
   Global frontcolor = #Blue
   Global sizeimage  = CreateImage(#PB_Any, 1, 1)              ;für GadgetSize, FreeImage durch PB bei Progende
   Global textfontid = FontID(LoadFont(#PB_Any, "Arial", 9))   ;oder GetGadgetFont(#PB_Default) ist kleiner 
   Global defaultfont = textfontid                             ;um Font auf Default zurück zusetzen
   
   ;- intern
   Procedure.i SetGadgetSize(pbnr, txt$)
      Protected j, k, w, h, z = CountString(txt$, #LF$)  ;z = Anzahl LF, wenn > 0 dann mehrzeilig      
      StartDrawing(ImageOutput(sizeimage))
      DrawingFont(textfontid)
      w = TextWidth(StringField(txt$, 1, #LF$))          ;Breite vom 1.String, auch wenn LF nicht vorhanden
      For j = 1 To z                                     ;wenn z = 0 wird For Next nicht ausgeführt
         k = TextWidth(StringField(txt$, j+1, #LF$))     ;wenn For Next dann k = breite vom nächsten String 
         If k > w : w = k: EndIf                         ;wenn k > w wird w geändert
      Next                                               ;usw
      h = TextHeight(txt$): h + (h * z)                  ;h + Anzahl Zeilen
      StopDrawing()      
      ResizeGadget(pbnr, #PB_Ignore, #PB_Ignore, w+2, h+1)  ;+2 bzw. + 1 wegen Schönheit oder so 
   EndProcedure
   
   ; Procedure.i oldSetGadgetSize(pbnr, txt$)  ;alte Proc für einzeilig        
   ;    StartDrawing(ImageOutput(sizeimage))
   ;    DrawingFont(textfontid)      
   ;    Protected w = TextWidth(txt$) 
   ;    Protected h = TextHeight(txt$) 
   ;    StopDrawing() 
   ;    ResizeGadget(pbnr, #PB_Ignore, #PB_Ignore, w+2, h+0) 
   ; EndProcedure
   
   ;-extern
   Procedure.i WriteTextColor(flag, value)      
      Select flag
         Case #PB_All: textfontid = value             ;value = FontID übergeben
            If value = #PB_Default: textfontid = defaultfont: EndIf
         Case #PB_Gadget_BackColor: backcolor = value
         Case #PB_Gadget_FrontColor: frontcolor = value
      EndSelect      
   EndProcedure 
   
   Procedure.i WriteText(text$, parent, position=#goTop, align=#goLeft, gap=2, flag=0)
      
      If IsGadget(parent) = 0: Debug "kein Gadget": ProcedureReturn 0: EndIf
      
      Protected pbnr = TextGadget(#PB_Any, 0, 0, 0, 0, text$, flag)
      
      SetGadgetFont(pbnr, textfontid)  ;textfontid + colors sind global
      SetGadgetSize(pbnr, text$)
      SetGadgetColor(pbnr, #PB_Gadget_FrontColor, frontcolor)
      If backcolor: SetGadgetColor(pbnr, #PB_Gadget_BackColor, backcolor): EndIf
      
      Protected x, y, w = GadgetWidth(pbnr), h = GadgetHeight(pbnr)  ;TextGadget Werte
      
      Protected px = GadgetX(parent), py = GadgetY(parent)           ;Parent Werte
      Protected pw = GadgetWidth(parent), ph = GadgetHeight(parent) 
      
      Select position                      ;wohin soll der Text ?
         Case #goTop: y = py - h - gap     ;y über dem Parent         
         Case #goLeft: x = px - w - gap    ;x links vom Parent         
         Case #goRight: x = px + pw + gap  ;x rechts vom Parent         
         Case #goBottom: y = py + ph + gap ;y unter dem Parent         
         Case #goCenter: Debug "#goCenter für posi verboten" 
         Default: Debug "unbekanntes Flag für position" 
      EndSelect 
      
      ;Vorgabe align anpassen an position
      If position = #goLeft And align = #goLeft: align = #goCenter: EndIf  
      If position = #goRight And align = #goLeft: align = #goCenter: EndIf 
      
      Select align            ;Ausrichtung
         Case #goTop             
            Select position 
               Case #goLeft, #goRight: y = py 
               Default: Debug "Kombination posi/align falsch"
            EndSelect
            
         Case #goLeft 
            Select position 
               Case #goTop, #goBottom: x = px 
               Default: Debug "Kombination posi/align falsch"
            EndSelect
            
         Case #goRight 
            Select position
               Case #goTop, #goBottom: x = px + pw - w
               Default: Debug "Kombination posi/align falsch"
            EndSelect
            
         Case #goBottom:
            Select position
               Case #goLeft, #goRight: y = py + ph - h
               Default: Debug "Kombination posi/align falsch"
            EndSelect
            
         Case #goCenter: 
            Select position
               Case #goTop, #goBottom: x = px + ((pw - w)/2) 
               Case #goLeft, #goRight: y = py + ((ph - h)/2)
               Case #goCenter: Debug "Kombination posi/align falsch"
            EndSelect
            
         Default: Debug "unbekanntes Flag für align" 
      EndSelect
      
      ResizeGadget(pbnr, x, y, w, h)
      
      ProcedureReturn pbnr 
   EndProcedure
   
EndModule

UseModule WriteText

;===================

CompilerIf #PB_Compiler_IsMainFile
   
   LoadFont(12, "Calibri", 22)  
   
   OpenWindow(0, 0, 0, 650, 360, "TextGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   
   TextGadget(4, 100, 100, 400, 50, "Gadget Beschriftung", #PB_Text_Center | #PB_Text_Border)
   SetGadgetFont(4, FontID(12))   
   
   WriteText("Mayonese", 4)  ;#goTop + #goLeft sind Vorgabe
   
   WriteText("Bremer", 4, #goTop, #goRight)
   WriteText("ganz ganz viel Kirschen", 4, #goTop, #goCenter, 20)
   WriteText("sehr große Kartoffeln", 4, #goTop, #goCenter)
   
   WriteText("Äpfel", 4, #goLeft, #goTop)
   WriteText("Kohl", 4, #goLeft, #goCenter)
   WriteText("Bananen", 4, #goLeft, #goBottom)
   
   WriteTextColor(#PB_Gadget_FrontColor, #Red)  ;ab hier andere Farbe
   
   WriteText("Erdbeeren", 4, #goRight, #goTop)
   WriteText("Euro", 4, #goRight, #goCenter)
   WriteText("Kartoffeln", 4, #goRight, #goBottom)
   
   WriteTextColor(#PB_Gadget_FrontColor, #Gray)  ;ab hier andere Farbe
   WriteTextColor(#PB_All, FontID(12))           ;ab hier anderen Font
   
   WriteText("Kartoffeln", 4, #goBottom, #goCenter)
   
   WriteTextColor(#PB_All, #PB_Default)          ;ab hier anderen Font   
   
   WriteText("kleine Kartoffeln", 4, #goBottom, #goLeft)
   WriteText("sehr riesige Kartoffeln", 4, #goBottom, #goRight)
   
   WriteTextColor(#PB_Gadget_FrontColor, #Black)  ;ab hier andere Farbe
   
   StringGadget(5, 100, 250, 60, 20, "10")
   WriteText("Eingabe"+#LF$+"Euro"+#LF$+"Cola", 5, #goLeft, #goCenter, 4, #PB_Text_Right)
   
   WriteText(~"Knöpfe\n schwarz \n rot ", 5, #goTop, #goRight, 2, #PB_Text_Center|#WS_BORDER)
   
   WriteText(~"Bananen\ngelb\ngrün", 5, #goRight )
   
   Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
   
CompilerEndIf
Zuletzt geändert von hjbremer am 09.11.2022 23:05, insgesamt 3-mal geändert.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
dige
Beiträge: 1183
Registriert: 08.09.2004 08:53

Re: Gadgets beschriften mit Zusatztext

Beitrag von dige »

Coole Idee!! Danke fürs Teilen!
"Papa, mein Wecker funktioniert nicht! Der weckert immer zu früh."
Benubi
Beiträge: 186
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

Re: Gadgets beschriften mit Zusatztext

Beitrag von Benubi »

Guter Ansatz. Ich hatte mir schon mal so komplizierte Sachen ausgedacht, nur damit so ein Infotext bzw. Label for einem Paßwortfeld erscheint, neue Klassen ausgedacht, nur weil ich an falscher Stelle zu faul war.

Vielleicht könnte das Ganze noch verbessert werden, wenn diese extra Gadgets in eine Liste aufgenommen würden, um Resizes abzuarbeiten bzw. die Info Felder entfernen, wenn das Bezugs-Gadget nicht mehr existiert.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Gadgets beschriften mit Zusatztext

Beitrag von hjbremer »

Benubi hat geschrieben: 28.10.2022 14:55 Vielleicht könnte das Ganze noch verbessert werden, wenn diese extra Gadgets in eine Liste aufgenommen würden, um Resizes abzuarbeiten bzw. die Info Felder entfernen, wenn das Bezugs-Gadget nicht mehr existiert.
Gute Idee, man könnte eine Liste führen, die pbnr wird ja zurück gegeben oder diese Nummern und die ParentNummer im Modul verwalten

Aber dann wäre es nicht mehr einfach und simpel !

So etwas kann ja ein jeder hinzufügen wenn er es braucht.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
PureUser1966
Beiträge: 29
Registriert: 02.02.2017 21:03
Wohnort: Cologne / Germany

Re: Gadgets beschriften mit Zusatztext

Beitrag von PureUser1966 »

Sowas hab ich 2021 auch mal gebaut. Hier mein Ansatz dazu.
Hab das aber anstatt Textfeld mit CanvasGadget und DrawVectorText gebaut.
Auch konnte man Farben als auch Font sowie Fontgröße jeweils ändern.
Aber irgenwie hab ich es dann nicht weitergemacht.

LG


Code: Alles auswählen

; gadgetcomment.pb - WB 2021


EnableExplicit


Global.i	iMW_Event	=	0
Global.i	iMW_Quit	=	0

Global.i	iMyFontID1	=	0
Global.i	iMyGadget	=	0
Global.i	iMyGadget2	=	0


DeclareModule GadgetComment
	
	Enumeration
		#GC_TOPLEFT		= 1
		#GC_TOPRIGHT
		#GC_TOPCENTER
		#GC_BOTTOMLEFT
		#GC_BOTTOMRIGHT
		#GC_BOTTOMCENTER
		#GC_RIGHTTOP
		#GC_RIGHTBOTTOM
		#GC_RIGHTCENTER
		#GC_LEFTTOP
		#GC_LEFTBOTTOM
		#GC_LEFTCENTER
		#GC_END
	EndEnumeration
	
	
	Declare.i	GadgetComment(iParentGadget.i, sText.s, iFColor.i, iBColor.i, iXAdd.i, iYAdd.i, iPos.i = #GC_TOPLEFT, sFontName.s="Consolas", iFontSize.i=14)
	Declare		FreeGadgetComment(iCanvasID.i)
	
EndDeclareModule

Module GadgetComment

; -------------------------------------------------------------------------------------------------
; GadgetComment - WB - 14.08.2021
; last bits: 21.08.2021
; 
; -------------------------------------------------------------------------------------------------
; Parameter:
;  iParentgadget	- parent gadget to create comment for
;  sText:		- text
;  iFColor		- textcolor
;  iBColor		- background color
;  iXAdd		- xpos alignment
;  iYAdd		- ypos alignement
;  iPos			- position of comment text
;  sFontname		- fontname
;  iFontSize		- fontsize
;  
; -------------------------------------------------------------------------------------------------
; returns:		Gibt bei Erfolg einen Wert ungleich Null zurück (gadget nummer des generierten gadgets),
;			oder Null bei einem Fehler. 
; -------------------------------------------------------------------------------------------------

Procedure.i	GadgetComment(iParentGadget.i, sText.s, iFColor.i, iBColor.i, iXAdd.i, iYAdd.i, iPos.i = #GC_TOPLEFT, sFontName.s="Consolas", iFontSize.i=14)
	
	Protected.i	iResult		=	0
	Protected.i	iErrCode	=	0
	Protected.i	iFontID		=	0
	Protected.i	iCanvasID	=	0
	Protected.i	iTextWidth	=	0
	Protected.i	iTextHeight	=	0
	Protected.i	iXPos		=	0
	Protected.i	iYPos		=	0
	
	; Simple Error checking -------------------------------------------------------------------
	If IsGadget(iParentGadget) = 0
		iErrCode	=	1		; no proper parent gadget
	EndIf
	If Trim(sText) = ""
		iErrCode	=	2		; no text found
	EndIf
	ifontID			=	LoadFont(#PB_Any, sFontName, iFontSize, #PB_Font_HighQuality)
	If ifontID = 0
		iErrCode	=	3
	EndIf
	If iPos >=	#GC_END Or ipos < #GC_TOPLEFT
		iErrCode	=	4		; illegal position value (iPos)
	EndIf		
	
	If iErrCode <> 0
		Debug "GadgetComment error code: " + Str(iErrCode)
		ProcedureReturn	0
	EndIf
	; -----------------------------------------------------------------------------------------
	
	iCanvasID	=	CanvasGadget(#PB_Any, 1, 1, 1, 1)
	If iCanvasID = 0
		iErrCode	=	5
		Debug "GadgetComment error code: " + Str(iErrCode)
		ProcedureReturn 0
	EndIf
	If StartVectorDrawing(CanvasVectorOutput(iCanvasID))
		VectorFont(FontID(iFontID), iFontSize)
		iTextWidth	=	VectorTextWidth(sText)
		iTextHeight	=	VectorTextHeight(sText)
		StopVectorDrawing()	
		FreeGadget(iCanvasID)
	EndIf
		
	iCanvasID	=	CanvasGadget(#PB_Any, 10, 10, iTextWidth, iTextHeight)
	If iCanvasID = 0
		iErrCode	=	6
		Debug "GadgetComment error code: " + Str(iErrCode)
		ProcedureReturn 0
	EndIf
	HideGadget(iCanvasID, 1)
	If StartVectorDrawing(CanvasVectorOutput(iCanvasID))
		VectorFont(FontID(iFontID), iFontSize)
		AddPathBox(0, 0, iTextWidth, iTextHeight)
		VectorSourceColor($ff<<24+iBColor)
		FillPath()
		ResetPath()
		MovePathCursor(0,0)
		VectorSourceColor($ff<<24+iFColor)
		DrawVectorText(sText)
		StopVectorDrawing()	
	Else
		iErrCode	=	7
		Debug "GadgetComment error code: " + Str(iErrCode)
		ProcedureReturn 0
	EndIf
		
	; Set Positions
	Select iPos
		Case #GC_TOPLEFT
			iXPos	=	GadgetX(iParentGadget)
			iYPos	=	GadgetY(iParentGadget) - GadgetHeight(iCanvasID)		
		Case #GC_TOPRIGHT
			iXPos	=	GadgetX(iParentGadget) + GadgetWidth(iParentGadget) - GadgetWidth(iCanvasID)
			iYPos	=	GadgetY(iParentGadget) - GadgetHeight(iCanvasID)		
		Case #GC_TOPCENTER
			iXPos	=	GadgetX(iParentGadget) + (GadgetWidth(iParentGadget)/2) - (GadgetWidth(iCanvasID)/2)
			iYPos	=	GadgetY(iParentGadget) - GadgetHeight(iCanvasID)		
		Case #GC_BOTTOMLEFT
			iXPos	=	GadgetX(iParentGadget)
			iYPos	=	GadgetY(iParentGadget) + GadgetHeight(iParentGadget)		
		Case #GC_BOTTOMRIGHT
			iXPos	=	GadgetX(iParentGadget) + GadgetWidth(iParentGadget) - GadgetWidth(iCanvasID)
			iYPos	=	GadgetY(iParentGadget) + GadgetHeight(iParentGadget)		
		Case #GC_BOTTOMCENTER
			iXPos	=	GadgetX(iParentGadget) + (GadgetWidth(iParentGadget)/2) - (GadgetWidth(iCanvasID)/2)
			iYPos	=	GadgetY(iParentGadget) + GadgetHeight(iParentGadget)		
		Case #GC_RIGHTTOP
			iXPos	=	GadgetX(iParentGadget) + (GadgetWidth(iParentGadget))
			iYPos	=	GadgetY(iParentGadget)
		Case #GC_RIGHTBOTTOM
			iXPos	=	GadgetX(iParentGadget) + (GadgetWidth(iParentGadget))
			iYPos	=	GadgetY(iParentGadget) + GadgetHeight(iParentGadget) - GadgetHeight(iCanvasID)
		Case #GC_RIGHTCENTER
			iXPos	=	GadgetX(iParentGadget) + GadgetWidth(iParentGadget)
			iYPos	=	GadgetY(iParentGadget) + (GadgetHeight(iParentGadget)/2) - (GadgetHeight(iCanvasID)/2)
		Case #GC_LEFTTOP
			iXPos	=	GadgetX(iParentGadget) - (GadgetWidth(iCanvasID))
			iYPos	=	GadgetY(iParentGadget)
		Case #GC_LEFTBOTTOM
			iXPos	=	GadgetX(iParentGadget) - (GadgetWidth(iCanvasID))
			iYPos	=	GadgetY(iParentGadget) + GadgetHeight(iParentGadget) - GadgetHeight(iCanvasID)
		Case #GC_LEFTCENTER
			iXPos	=	GadgetX(iParentGadget) - (GadgetWidth(iCanvasID))
			iYPos	=	GadgetY(iParentGadget) + (GadgetHeight(iParentGadget)/2) - (GadgetHeight(iCanvasID)/2)
			
	EndSelect
	
	; -----------------------------------------------------------------------------------------
	; x&y corrctions if needed
	iXPos	+	iXAdd
	iYPos	+	iYAdd
	ResizeGadget(iCanvasID, iXPos, iYPos, #PB_Ignore, #PB_Ignore)		; set new gadget to its position
	FreeFont(iFontID)							; free font 
	HideGadget(iCanvasID, 0)
	
	ProcedureReturn	iCanvasID
	
EndProcedure


Procedure	FreeGadgetComment(iCanvasID.i)
	
	If IsGadget(iCanvasID)
		FreeGadget(iCanvasID)	
	EndIf
	
EndProcedure

EndModule


UseModule	GadgetComment

If OpenWindow(1, 100, 200, 1024, 768, "GadgetCommand", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
	SetWindowColor(1, #Gray)
	
	; Create Default Font
	iMyFontID1	=	LoadFont(#PB_Any, "Consolas", 14)	
	If IsFont(iMyFontID1)
		SetGadgetFont(#PB_Default, FontID(iMyFontID1))
	EndIf
	; Create Demo Gadgets
	
	iMyGadget	=	10
	TextGadget(iMyGadget, 200, 100, 300, 100, "Textgadget")	
	GadgetComment(iMyGadget, "TopLeft",		#Yellow,	GetWindowColor(1),	0,	0,	#GC_TOPLEFT, 		"Consolas",	8)
 	GadgetComment(iMyGadget, "TopRight",		#Yellow,	GetWindowColor(1),	0,	0,	#GC_TOPRIGHT, 		"Consolas",	24)
 	GadgetComment(iMyGadget, "TopCenter",		#Yellow,	GetWindowColor(1),	0,	0,	#GC_TOPCENTER)
 	GadgetComment(iMyGadget, "BottomLeft",  	#Blue,		GetWindowColor(1),	0,	0,	#GC_BOTTOMLEFT)
 	GadgetComment(iMyGadget, "BottomRight", 	#Blue, 		GetWindowColor(1),	0,	0,	#GC_BOTTOMRIGHT)
 	GadgetComment(iMyGadget, "BottomCenter",	#Blue, 		GetWindowColor(1),	0,	0,	#GC_BOTTOMCENTER,	"Arial",	18)
 	GadgetComment(iMyGadget, "RightTop",		#White, 	GetWindowColor(1),	2,	0,	#GC_RIGHTTOP)
 	GadgetComment(iMyGadget, "RightBottom",		#White,		GetWindowColor(1),	2,	0,	#GC_RIGHTBOTTOM)
 	GadgetComment(iMyGadget, "RightCenter",		#Black,		#Red,			2,	0,	#GC_RIGHTCENTER)
 	GadgetComment(iMyGadget, "LeftTop",		#Black,		GetWindowColor(1),	-2,	0,	#GC_LEFTTOP, 		"Consolas",	12)
 	GadgetComment(iMyGadget, "LeftBottom",		#Black,		GetWindowColor(1),	-2,	0,	#GC_LEFTBOTTOM)
 	GadgetComment(iMyGadget, "LeftCenter",		#Black,		#Green,			-2,	0,	#GC_LEFTCENTER)
 	
	iMyGadget	=	11
	EditorGadget(iMyGadget, 100, 300, 800, 200)	
	SetGadgetText(iMyGadget, "The quick brown fox jumps over the lazy dog!")
	GadgetComment(iMyGadget, "Editorgadget",	#Blue,		GetWindowColor(1),	0,	0,	#GC_TOPLEFT)
	GadgetComment(iMyGadget, "  SizeOf: " + Len(GetGadgetText(11)),	#Black,		GetWindowColor(1),	0,	0,	#GC_BOTTOMRIGHT)
	
	Repeat
		iMW_Event = WaitWindowEvent()
		Select iMW_Event
			Case	#PB_Event_Gadget
				Select EventGadget()
					Case 11
						Select EventType()
							Case #PB_EventType_Change
								GadgetComment(iMyGadget, "  SizeOf: " + Len(GetGadgetText(11)),	#Black,		GetWindowColor(1),	0,	0,	#GC_BOTTOMRIGHT)
						EndSelect
				EndSelect
			Case 	#PB_Event_CloseWindow  ; If the user has pressed on the close button
				iMW_Quit = 1
		EndSelect
	Until iMW_Quit = 1
EndIf




move.w #$7fff, $dff09a
ILLEGAL
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Gadgets beschriften mit Zusatztext - Last Update: mehrzeilig

Beitrag von hjbremer »

da ich mein Code-Update nicht mehr aufrufen kann, warum auch immer
hier noch einmal

Code: Alles auswählen

;- Gadgets beschriften by HJBremer V.1.31 Nov 2022 - Windows 10 - PB ab 5.70 all

;Text kann rund um ein Gadget positioniert werden, auch mehrzeilig ausgerichtet
;
;WriteText(text$, parent, position=#goTop, align=#goLeft, gap=2, flag=0)

;  parent   = pbnr des Gadgets welches beschriftet wird
;  position = flag bestimmt wo der Text hin soll, flags gelten auch für align, siehe DeclareModule 
;  align    = flag bestimmt wo Text an welcher Stelle der Position steht
;  gap      = Abstand zum Parentgadget, Vorgabe ist 2 Pixel Abstand zum Gadget 
;  flag     = Ausrichtung für mehrzeiligen Text, #PB_Text_Right ..Center, Left ist Standard
;             unter Windows kann man #WS_BORDER als flag für Testzwecke angeben 

;     Standarvorgabe ist #goTop, #goLeft, Abstand 2 Pixel zum Gadget
;     wenn Position #goLeft oder #goRight, Vorgabe align=#goLeft wird intern zu #goCenter 

;Beispiele
;  WriteText("Bananen", pbnr)                            ;über dem Gadget links
;  WriteText("Eingabe", pbnr, #goLeft)                   ;links vom Gadget mittig
;  WriteText("Eingabe", pbnr, #goRight, #goTop)          ;rechts vom Gadget oben
;  WriteText("Eingabe", pbnr, #goRight, #goBottom, 3)    ;rechts vom Gadget unten Abstand 3 
;  WriteText("Eingabe", pbnr, #goRight, #goBottom, 3)    ;rechts vom Gadget unten Abstand 3 
;  WriteText("Eingabe", pbnr, #goBottom, #goCenter, 3)   ;unter dem Gadget mittig Abstand 3 

;  WriteText("Eingabe"+#LF$+"Euro"+#LF$+"Cola", pbnr)    ;mehrzeilig oben links
;
;  WriteText(~"Stücke\ngelb\ngelblich\ngelb", pbnr)      ;~ + \n als Escapezeichen für #LF$

;  WriteText(~"Stücke\ngelb\ngelblich\ngelb", pbnr, #goLeft, #goCenter, 2, #PB_Text_Right)

;WriteTextColor(flag, value)        ;ändert für ALLE folgenden WriteText() den Font oder Farben
;
;  WriteTextColor(#PB_All, fontid)        ;#PB_Any kann auch benutzt werden
;  WriteTextColor(#PB_All, #PB_Default)   ;Font zurück auf internen DefaultFont

;  WriteTextColor(#PB_Gadget_BackColor, color)   ;Color ändern
;  WriteTextColor(#PB_Gadget_FrontColor, color)  ;Color ändern

DeclareModule WriteText
   
   #goTop = 16 
   #goLeft = 1
   #goRight = 2
   #goBottom = 128   
   #goCenter = $100000
   
   Declare.i WriteTextColor(flag, value) ;für WriteText, Font oder Color ändert sich ab Aufruf 
   
   Declare.i WriteText(text$, parent, position=#goTop, align=#goLeft, gap=2, flag=0) ;gap = Abstand
   
EndDeclareModule
;-
Module WriteText   
   EnableExplicit
   
   Global backcolor = 0
   Global frontcolor = #Blue
   Global sizeimage  = CreateImage(#PB_Any, 1, 1)              ;für GadgetSize, FreeImage durch PB bei Progende
   Global textfontid = FontID(LoadFont(#PB_Any, "Arial", 9))   ;oder GetGadgetFont(#PB_Default) ist kleiner 
   Global defaultfont = textfontid                             ;um Font auf Default zurück zusetzen
   
   ;- intern
   Procedure.i SetGadgetSize(pbnr, txt$)
      Protected j, k, w, h, z = CountString(txt$, #LF$)  ;z = Anzahl LF, wenn > 0 dann mehrzeilig      
      StartDrawing(ImageOutput(sizeimage))
      DrawingFont(textfontid)
      w = TextWidth(StringField(txt$, 1, #LF$))          ;Breite vom 1.String, auch wenn LF nicht vorhanden
      For j = 1 To z                                     ;wenn z = 0 wird For Next nicht ausgeführt
         k = TextWidth(StringField(txt$, j+1, #LF$))     ;wenn For Next dann k = breite vom nächsten String 
         If k > w : w = k: EndIf                         ;wenn k > w wird w geändert
      Next                                               ;usw
      h = TextHeight(txt$): h + (h * z)                  ;h + Anzahl Zeilen
      StopDrawing()      
      ResizeGadget(pbnr, #PB_Ignore, #PB_Ignore, w+2, h+1)  ;+2 bzw. + 1 wegen Schönheit oder so 
   EndProcedure
   
   ; Procedure.i oldSetGadgetSize(pbnr, txt$)  ;alte Proc für einzeilig        
   ;    StartDrawing(ImageOutput(sizeimage))
   ;    DrawingFont(textfontid)      
   ;    Protected w = TextWidth(txt$) 
   ;    Protected h = TextHeight(txt$) 
   ;    StopDrawing() 
   ;    ResizeGadget(pbnr, #PB_Ignore, #PB_Ignore, w+2, h+0) 
   ; EndProcedure
   
   ;-extern
   Procedure.i WriteTextColor(flag, value)      
      Select flag
         Case #PB_All: textfontid = value             ;value = FontID übergeben
            If value = #PB_Default: textfontid = defaultfont: EndIf
         Case #PB_Gadget_BackColor: backcolor = value
         Case #PB_Gadget_FrontColor: frontcolor = value
      EndSelect      
   EndProcedure 
   
   Procedure.i WriteText(text$, parent, position=#goTop, align=#goLeft, gap=2, flag=0)
      
      If IsGadget(parent) = 0: Debug "kein Gadget": ProcedureReturn 0: EndIf
      
      Protected pbnr = TextGadget(#PB_Any, 0, 0, 0, 0, text$, flag)
      
      SetGadgetFont(pbnr, textfontid)  ;textfontid + colors sind global
      SetGadgetSize(pbnr, text$)
      SetGadgetColor(pbnr, #PB_Gadget_FrontColor, frontcolor)
      If backcolor: SetGadgetColor(pbnr, #PB_Gadget_BackColor, backcolor): EndIf
      
      Protected x, y, w = GadgetWidth(pbnr), h = GadgetHeight(pbnr)  ;TextGadget Werte
      
      Protected px = GadgetX(parent), py = GadgetY(parent)           ;Parent Werte
      Protected pw = GadgetWidth(parent), ph = GadgetHeight(parent) 
      
      Select position                      ;wohin soll der Text ?
         Case #goTop: y = py - h - gap     ;y über dem Parent         
         Case #goLeft: x = px - w - gap    ;x links vom Parent         
         Case #goRight: x = px + pw + gap  ;x rechts vom Parent         
         Case #goBottom: y = py + ph + gap ;y unter dem Parent         
         Case #goCenter: Debug "#goCenter für posi verboten" 
         Default: Debug "unbekanntes Flag für position" 
      EndSelect 
      
      ;Vorgabe align anpassen an position
      If position = #goLeft And align = #goLeft: align = #goCenter: EndIf  
      If position = #goRight And align = #goLeft: align = #goCenter: EndIf 
      
      Select align            ;Ausrichtung
         Case #goTop             
            Select position 
               Case #goLeft, #goRight: y = py 
               Default: Debug "Kombination posi/align falsch"
            EndSelect
            
         Case #goLeft 
            Select position 
               Case #goTop, #goBottom: x = px 
               Default: Debug "Kombination posi/align falsch"
            EndSelect
            
         Case #goRight 
            Select position
               Case #goTop, #goBottom: x = px + pw - w
               Default: Debug "Kombination posi/align falsch"
            EndSelect
            
         Case #goBottom:
            Select position
               Case #goLeft, #goRight: y = py + ph - h
               Default: Debug "Kombination posi/align falsch"
            EndSelect
            
         Case #goCenter: 
            Select position
               Case #goTop, #goBottom: x = px + ((pw - w)/2) 
               Case #goLeft, #goRight: y = py + ((ph - h)/2)
               Case #goCenter: Debug "Kombination posi/align falsch"
            EndSelect
            
         Default: Debug "unbekanntes Flag für align" 
      EndSelect
      
      ResizeGadget(pbnr, x, y, w, h)
      
      ProcedureReturn pbnr 
   EndProcedure
   
EndModule

UseModule WriteText

;===================

CompilerIf #PB_Compiler_IsMainFile
   
   LoadFont(12, "Calibri", 22)  
   
   OpenWindow(0, 0, 0, 650, 360, "TextGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
   
   TextGadget(4, 100, 100, 400, 50, "Gadget Beschriftung", #PB_Text_Center | #PB_Text_Border)
   SetGadgetFont(4, FontID(12))   
   
   WriteText("Mayonese", 4)  ;#goTop + #goLeft sind Vorgabe
   
   WriteText("Bremer", 4, #goTop, #goRight)
   WriteText("ganz ganz viel Kirschen", 4, #goTop, #goCenter, 20)
   WriteText("sehr große Kartoffeln", 4, #goTop, #goCenter)
   
   WriteText("Äpfel", 4, #goLeft, #goTop)
   WriteText("Kohl", 4, #goLeft, #goCenter)
   WriteText("Bananen", 4, #goLeft, #goBottom)
   
   WriteTextColor(#PB_Gadget_FrontColor, #Red)  ;ab hier andere Farbe
   
   WriteText("Erdbeeren", 4, #goRight, #goTop)
   WriteText("Euro", 4, #goRight, #goCenter)
   WriteText("Kartoffeln", 4, #goRight, #goBottom)
   
   WriteTextColor(#PB_Gadget_FrontColor, #Gray)  ;ab hier andere Farbe
   WriteTextColor(#PB_All, FontID(12))           ;ab hier anderen Font
   
   WriteText("Kartoffeln", 4, #goBottom, #goCenter)
   
   WriteTextColor(#PB_All, #PB_Default)          ;ab hier anderen Font   
   
   WriteText("kleine Kartoffeln", 4, #goBottom, #goLeft)
   WriteText("sehr riesige Kartoffeln", 4, #goBottom, #goRight)
   
   WriteTextColor(#PB_Gadget_FrontColor, #Black)  ;ab hier andere Farbe
   
   StringGadget(5, 100, 250, 60, 20, "10")
   WriteText("Eingabe"+#LF$+"Euro"+#LF$+"Cola", 5, #goLeft, #goCenter, 4, #PB_Text_Right)
   
   WriteText(~"Knöpfe\n schwarz \n rot ", 5, #goTop, #goRight, 2, #PB_Text_Center|#WS_BORDER)
   
   WriteText(~"Bananen\ngelb\ngrün", 5, #goRight )
   
   Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
   
CompilerEndIf
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Antworten