j'ai repris ce code de LSI que j'ai transformé pour fonctionner avec la bibliothèque VectorDrawing
j'espère que ça intéressera quelqu'un.
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 5.0
; Repris par Micoute pour la bibliothèque VectorDrawing
; Version de PB : 5.60 B6
; Explication du programme :
; Centrage de texte verticalement et horizontalement
Procedure.s DrawVectorTextExtended(x.l, y.l, Width.l, Height.l, Text.s, Color.l = $FF000000, 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 = VectorTextHeight(" ") + SpaceLine
Espace_Largeur = VectorTextWidth(" ") ; 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 VectorTextWidth(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 VectorTextWidth(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())
MovePathCursor(x, y)
VectorSourceColor(Color)
DrawVectorText(Ligne())
Case 1 ; On dessine le texte centrer
Ligne() = RTrim(Ligne(), Chr(10))
Ligne() = RTrim(Ligne())
MovePathCursor(x + (Width - VectorTextWidth(Ligne())) / 2, y)
VectorSourceColor(Color)
DrawVectorText(Ligne())
Case 2 ; On dessine le texte à droite
Ligne() = RTrim(Ligne(), Chr(10))
Ligne() = RTrim(Ligne())
MovePathCursor(x + Width - VectorTextWidth(Ligne()), y)
VectorSourceColor(Color)
DrawVectorText(Ligne())
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)
MovePathCursor(x, y)
VectorSourceColor(Color)
DrawVectorText(Ligne()) ; 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 - VectorTextWidth(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 - VectorTextWidth(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
MovePathCursor(xx, y)
VectorSourceColor(Color)
DrawVectorText(Mot) ; Dessin du mot complet
xx + VectorTextWidth(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)
MovePathCursor(xx, y)
VectorSourceColor(Color)
DrawVectorText(Caractere) ; Dessin du caractère du mot
xx + VectorTextWidth(Caractere) + Caractere_Justifie
Next
xx + Espace_Justifie + Caractere_Justifie
EndIf
Next
EndIf
EndIf
EndSelect
y + HauteurTexte ; Passage à la ligne suivante
Next
DisableExplicit
EndProcedure
CompilerIf #PB_Compiler_IsMainFile
;- 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
StartVectorDrawing(ImageVectorOutput(0))
VectorSourceColor($FFFFFFFF)
AddPathBox(0, 0, VectorOutputWidth(), VectorOutputHeight())
FillPath()
VectorFont(FontID)
VectorSourceColor($20000000)
AddPathBox(10, 20, 300, 400)
FillPath()
DrawVectorTextExtended(10, 20, 300, 400, Texte, $FF000000, Centrage_Horizontal, Centrage_Vertical, Interligne)
VectorSourceImage($20000000)
AddPathBox(320, 20, 40, 400)
FillPath()
DrawVectorTextExtended(320, 20, 40, 400, Texte, $FF000000, Centrage_Horizontal, Centrage_Vertical, Interligne)
StopVectorDrawing()
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
CompilerEndIf