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 ><)
Pour justifier ses DrawText()
Re: Pour justifier ses DrawText()
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel
)
Mon site : CeriseCode (Attention Chantier perpétuel

Re: Pour justifier ses DrawText()
essaie #PB_2DDrawing_Transparent
If this flag is set then the background will be transparent with the DrawText() command.
If this flag is set then the background will be transparent with the DrawText() command.
Re: Pour justifier ses DrawText()
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 

_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel
)
Mon site : CeriseCode (Attention Chantier perpétuel

-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
Re: Pour justifier ses DrawText()
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
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)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Re: Pour justifier ses DrawText()
exactement !
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel
)
Mon site : CeriseCode (Attention Chantier perpétuel

-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
Re: Pour justifier ses DrawText()
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
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)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Re: Pour justifier ses DrawText()
Ça te tournais dans la tête depuis le temps
L'écartement entre les caractères donne bien !

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