Pour justifier ses DrawText()

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Pour justifier ses DrawText()

Message par graph100 »

Donc ce serais bien un bug ? et pas une fausse manip de ma part ?

Mais, à part le bug, tu n'as pas une idée pour la background color ? (la fontion box ne dessine que la frontcolor de base ><)
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: Pour justifier ses DrawText()

Message par case »

essaie #PB_2DDrawing_Transparent

If this flag is set then the background will be transparent with the DrawText() command.
ImageImage
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Pour justifier ses DrawText()

Message par graph100 »

en fait, ce que je cherchais à faire, c'est une fonction qui dessine le texte justifié, mais qui aie le même comportement qu'un DrawText() tout simple. Et ce, indépendamment des drawingmode() utilisés. Car à partir du moment ou j'utilise un drawingmode dans la fonction, il n'y a pas moyen de revenir à mode de dessin utilisé auparavant :cry:
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Pour justifier ses DrawText()

Message par Le Soldat Inconnu »

Oui, donc l'utilisateur gère son DrawingMode( avant comme pour un DrawText(
Tu ne mets aucune gestion dans ta procedure, juste des DrawText(x, y, Text)
L'utilisateur se débrouille avec le reste en utilisant FrontColor(, BackColor(, DrawingMode(, etc ... avant d'appler ta procedure comme avec un DrawText
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Pour justifier ses DrawText()

Message par graph100 »

exactement !
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Pour justifier ses DrawText()

Message par Le Soldat Inconnu »

Allez, j'ai poussé un peu plus loin.

Centrage, gauche, droite ou justifié en horizontal
centrage, haut ou bas en vertical

On a tout comme ça

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 5.0

; Explication du programme :
; Centrage de texte verticalement et horizontalement
Procedure.s DrawTextExtended(x.l, y.l, Width.l, Height.l, Text.s, Color.l = 0, HorizontalAlignement = 3, VerticalAlignement = 1, SpaceLine = 0)
	EnableExplicit
	Protected NewList Ligne.s()
	Protected Coupe.s, Caractere.s, Mot.s, n, nn, HauteurTexte
	Protected Espace_Largeur.l, Espace_Justifie.d, Espace_Nombre.l, xx.d, Caractere_Justifie.d
	
	HauteurTexte = TextHeight("A") + SpaceLine
	Espace_Largeur = TextWidth(" ") ; Largeur du caractère espace
	
	; Découpage du texte
	; On commence la première ligne
	AddElement(Ligne())
	
	For n = 1 To Len(Text) ; Pour tous les caractères
		Caractere.s = Mid(Text, n, 1)
		Select Caractere
			Case Chr(13)
				; Je fais rien avec ca, un passage de ligne d'un éditeur de texte, c'est chr(13) + chr(10)
			Case Chr(10) ; donc je m'occupe que du chr(10)
				Ligne() + Chr(10) ; Marqueur de fin de ligne normale utilisé pour le dessin du texte
				AddElement(Ligne()) ; on passe à la ligne suivante
			Default ; Sinon, pour les autres caractères
				Ligne() + Caractere ; J'ajoute le caractere à la ligne
				If TextWidth(Ligne()) > Width ; Si le texte est trop long
					
					For nn = Len(Ligne()) To 1 Step -1 ; On remonte au dernier espace
						Caractere.s = Mid(Ligne(), nn, 1)
						
						If Caractere = " " ; au premier espace
							Coupe.s = Right(Ligne(), Len(Ligne()) - nn)
							Ligne() = Left(Ligne(), nn)
							AddElement(Ligne()) ; on passe à la ligne suivante
							Ligne() = Coupe
							Break
						EndIf
						
						If nn = 1 ; On n'a pas trouvé d'espace, donc le mot est trop long et ne rentre pas dans la ligne, donc on met un tiret
							Caractere = ""
							Repeat
								Caractere = Right(Ligne(), 1) + Caractere ; on récupère le dernier caractère
								Ligne() = Left(Ligne(), Len(Ligne()) - 1) ; on supprime le dernier caractère
							Until TextWidth(Ligne() + "-") <= Width
							Ligne() + "-"
							AddElement(Ligne()) ; on passe à la ligne suivante
							Ligne() = Caractere
						EndIf
						
					Next
					
				EndIf
				
		EndSelect
	Next
	
	; Dessin du texte
	Select VerticalAlignement
		Case 1 ; Centrer
			y + (Height - ListSize(Ligne()) * HauteurTexte) / 2
		Case 2 ; En bas
			y + Height - ListSize(Ligne()) * HauteurTexte
	EndSelect
	
	ForEach Ligne()
		
		Select HorizontalAlignement
			Case 0 ; On dessine le texte normalement
				Ligne() = RTrim(Ligne(), Chr(10))
				Ligne() = RTrim(Ligne())
				DrawText(x, y, Ligne(), Color)
			Case 1 ; On dessine le texte centrer
				Ligne() = RTrim(Ligne(), Chr(10))
				Ligne() = RTrim(Ligne())
				DrawText(x + (Width - TextWidth(Ligne())) / 2, y, Ligne(), Color)
			Case 2 ; On dessine le texte à droite
				Ligne() = RTrim(Ligne(), Chr(10))
				Ligne() = RTrim(Ligne())
				DrawText(x + Width - TextWidth(Ligne()), y, Ligne(), Color)
			Case 3 ; On dessine le texte justifié
				If Right(Ligne(), 1) = Chr(10) Or ListIndex(Ligne()) = ListSize(Ligne()) - 1 ; Si on a une fin de ligne normale
					Ligne() = RTrim(Ligne(), Chr(10))
					Ligne() = RTrim(Ligne())
					Debug Chr(34) + Ligne() + Chr(34)
					DrawText(x, y, Ligne(), Color) ; On dessine le texte normalement
					Debug Space(10) + "Ligne normale"
				Else ; Sinon, on dessine le texte justifié
					Ligne() = RTrim(Ligne())
					Debug Chr(34) + Ligne() + Chr(34)
					If Ligne()
						Espace_Nombre = CountString(Ligne(), " ") ; Nombre d'espace dans la ligne
						If Espace_Nombre > 0
							Espace_Justifie = (Width - TextWidth(Ligne()) + Espace_Largeur * Espace_Nombre) / Espace_Nombre ; Taille des espaces pour justifier le texte
							If Espace_Justifie > 3 * Espace_Largeur ; Si la largeur des espace devient trop grande, on espace également les caractères
								Caractere_Justifie = (Espace_Justifie - 3 * Espace_Largeur) * Espace_Nombre
								Caractere_Justifie / (Len(Ligne()) - 1)
								Debug Space(10) + "Espace entre caractère"
							Else
								Caractere_Justifie = 0
							EndIf
						ElseIf Len(Ligne()) > 1 ; Si il n'y a pas d'espace dans la ligne, on espace les caractères
							Caractere_Justifie = Width - TextWidth(Ligne())
							Caractere_Justifie / (Len(Ligne()) - 1)
							Debug Space(10) + "Espace entre caractère (Pas d'espace sur la ligne)"
						Else
							Caractere_Justifie = 0
						EndIf
						If Caractere_Justifie > Espace_Largeur ; Si l'espacement entre les caractères est trop grand, on l'annule
							Caractere_Justifie = 0
							Debug Space(10) + "Espace trop grand"
						ElseIf Caractere_Justifie > 0 ; On valide l'espace entre les caractères
							Espace_Justifie = 3 * Espace_Largeur
							Debug Space(10) + "Validation espace entre caractères"
						EndIf
						Debug Espace_Justifie
						Debug Caractere_Justifie
						xx = x
						For n = 1 To Espace_Nombre + 1 ; Pour chaque mot
							Mot = StringField(Ligne(), n, " ") ; Texte du mot
							If Caractere_Justifie = 0 ; Pas d'espacement entre chaque caractère
								DrawText(xx, y, Mot, Color) ; Dessin du mot complet
								xx + TextWidth(Mot) + Espace_Justifie ; On déplace la position de dessin au mot suivant
							Else ; Dessin avec espacement entre chaque caractère
								For nn = 1 To Len(Mot)
									Caractere = Mid(Mot, nn, 1)
									DrawText(xx, y, Caractere, Color) ; Dessin du caractère du mot
									xx + TextWidth(Caractere) + Caractere_Justifie
								Next
								xx + Espace_Justifie + Caractere_Justifie
							EndIf
							
						Next
					EndIf
				EndIf
		EndSelect
		
		y + HauteurTexte ; Passage à la ligne suivante
	Next
	
	DisableExplicit
EndProcedure

;- Début du programme

Restore ExempleDeTexte
For n = 1 To 7
	Read.s Ligne.s
	If Texte.s
		Texte.s + Chr(10)
	EndIf
	Texte.s + Ligne
Next

;- Police par défaut de windows
FontID = GetStockObject_(#DEFAULT_GUI_FONT)

; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 600, 440, "Texte étendu", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
	End
EndIf

OptionGadget(1, 400, 10, 200, 20, "A gauche / Left")
OptionGadget(2, 400, 30, 200, 20, "Centré / Centered")
OptionGadget(3, 400, 50, 200, 20, "A droite / Right")
OptionGadget(4, 400, 70, 200, 20, "Justifié / Justified")

ComboBoxGadget(8, 400, 210, 200, 20)
For i = 0 To 10
	AddGadgetItem(8, -1, "Interligne / Space-line : " + Str(i))
Next

OptionGadget(5, 400, 110, 200, 20, "En haut / Top")
OptionGadget(6, 400, 130, 200, 20, "Centré / Centered")
OptionGadget(7, 400, 150, 200, 20, "En bas / Bottom")

Centrage_Horizontal = 0
SetGadgetState(1, 1)
Centrage_Vertical = 0
SetGadgetState(5, 1)
Interligne = 0
SetGadgetState(8, 0)

CreateImage(0, 400, 440, 32 | #PB_Image_Transparent)
ImageGadget(0, 0, 0, 320, 320, ImageID(0))
Dessine = 1

Repeat
	Event = WaitWindowEvent()
	
	If Event = #PB_Event_Gadget
		Select EventGadget()
			Case 1
				Centrage_Horizontal = 0
			Case 2
				Centrage_Horizontal = 1
			Case 3
				Centrage_Horizontal = 2
			Case 4
				Centrage_Horizontal = 3
				
			Case 5
				Centrage_Vertical = 0
			Case 6
				Centrage_Vertical = 1
			Case 7
				Centrage_Vertical = 2
				
			Case 8
				Interligne = GetGadgetState(8)
		EndSelect
		Dessine = 1
	EndIf
	
	If Dessine
		
		StartDrawing(ImageOutput(0))
			DrawingMode(#PB_2DDrawing_AlphaChannel)
			Box(0, 0, OutputWidth(), OutputHeight(), 0)
			
			DrawingMode(#PB_2DDrawing_AlphaBlend | #PB_2DDrawing_Transparent)
			DrawingFont(FontID)
			
			Box(10, 20, 300, 400, $20000000)
			DrawTextExtended(10, 20, 300, 400, Texte, $FF000000, Centrage_Horizontal, Centrage_Vertical, Interligne)
			
			Box(320, 20, 40, 400, $20000000)
			DrawTextExtended(320, 20, 40, 400, Texte, $FF000000, Centrage_Horizontal, Centrage_Vertical, Interligne)
			
		StopDrawing()
		SetGadgetState(0, ImageID(0))
		
		Dessine = 0
	EndIf
	
Until Event = #PB_Event_CloseWindow

End

DataSection
	ExempleDeTexte :
		Data.s "PureBasic est un langage de programmation basé sur les règles du langage BASIC. Ses caractéristiques majeures sont :"
		Data.s ""
		Data.s "- Portabilité: PureBasic fonctionne actuellement pleinement sous Windows, AmigaOS et Linux."
		Data.s "- Rapidité: PureBasic est un véritable compilateur qui produit des exécutables compacts et optimisés."
		Data.s "- Simplicité: PureBasic utilise la syntaxe du langage BASIC, très répandue et simple à apprendre."
		Data.s ""
		Data.s "PureBasic a été conçu aussi bien pour les débutants que pour les programmeurs expérimentés. Nous avons consacré beaucoup de temps et d'efforts pour vous proposer un langage rapide, fiable et convivial. Malgré sa syntaxe de base simple et rapidement assimilable, les possibilités de PureBasic sont infinies, grâce à de nombreuses caractéristiques évoluées comme, entre autres, les pointeurs, structures, procédures, listes dynamiques, etc. Le programmeur expérimenté n'aura aucune difficulté à accéder aux structures du système d'exploitation et aux API's."
EndDataSection
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Pour justifier ses DrawText()

Message par graph100 »

Ça te tournais dans la tête depuis le temps :lol:

L'écartement entre les caractères donne bien !
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Répondre