DrawVectorTextExtended

Programmation d'applications complexes
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

DrawVectorTextExtended

Message par Micoute »

Bonjour à tous,

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
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: DrawVectorTextExtended

Message par Shadow »

Beau travail Micoute :)
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
venom
Messages : 3072
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: DrawVectorTextExtended

Message par venom »

Merci pour cette transformation Micoute :wink:





@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: DrawVectorTextExtended

Message par Micoute »

Tout le mérite en reste tout de même à LSI, j'ai juste fait une conversion.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre