Bonjour,
Cela fait une eternité que je n´ai plus posté ici mais je n´ai pas cessé de coder sur pb depuis.
Actuellement je développe un éditeur de texte. On passe au logiciel un fichier binaire et depuis une table de caractère l´editor gadget affiche du texte intelligible.
Je souhaite ajouter un système de pliage et depliage du texte par double clic. Par exemple si on double clic sur le mot "pause" l´expression se deplie en "pause de 10 secondes”.
Y´a t il un moyen de faire ça avec l´API windows?
Je précise que je ne souhaite pas basculer sur scintilla car j´exploite la fonction de mise en forme rtf de l´éditeur classique.
Merci de votre aide car là je sèche.
Plier du texte dans un editor gadget.
-
- Messages : 121
- Inscription : mer. 21/janv./2004 22:18
Plier du texte dans un editor gadget.
10 CLS
20 PRINT "Vive PureBasic"
30 GOTO 20
20 PRINT "Vive PureBasic"
30 GOTO 20
- falsam
- Messages : 7317
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Plier du texte dans un editor gadget.
Bonjour,
dans ton exemple de Pause, pause de 10 secondes est une valeur fixe stockée dans une table ou une liste ou autres ?
dans ton exemple de Pause, pause de 10 secondes est une valeur fixe stockée dans une table ou une liste ou autres ?
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
-
- Messages : 121
- Inscription : mer. 21/janv./2004 22:18
Re: Plier du texte dans un editor gadget.
Pour préciser, ”pause” est un code de controle de texte qui équivaut au word hexa 14BE et qui prend un argument le word suivant).
Depuis une table le programme lit BE14 et affiche dans l´editeur <pause>. Je voudrai qu´en double cliquant dessus il développe en <pause de XXXXh secondes>.
Les textes longs et courts sont stockés dans une liste chaînée de tyoe code à 2 champs de texte.
Depuis une table le programme lit BE14 et affiche dans l´editeur <pause>. Je voudrai qu´en double cliquant dessus il développe en <pause de XXXXh secondes>.
Les textes longs et courts sont stockés dans une liste chaînée de tyoe code à 2 champs de texte.
10 CLS
20 PRINT "Vive PureBasic"
30 GOTO 20
20 PRINT "Vive PureBasic"
30 GOTO 20
- falsam
- Messages : 7317
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Plier du texte dans un editor gadget.
Le double-click n'étant pas détecter dans les évènements avec l'editorgadget, j'utilise un boutongadget pour illustrer ta demande.
Comment ce code fonctionne ?
Tu doubles-click gauche sur le mot que tu souhaites déplier.
Le programme se charge de copier en mémoire ce que tu as sélectionner puis compare cette sélection avec un référentiel. Si trouver, ce résultat est copié en mémoire puis collé à la place de la sélection.
Comment ce code fonctionne ?
Tu doubles-click gauche sur le mot que tu souhaites déplier.
Le programme se charge de copier en mémoire ce que tu as sélectionner puis compare cette sélection avec un référentiel. Si trouver, ce résultat est copié en mémoire puis collé à la place de la sélection.
Code : Tout sélectionner
Enumeration
#mainform
#editor
#Go
EndEnumeration
;Structure pour le referenciel de mots
Structure sWords
key.s
Dependence.s
EndStructure
;Buffer de comparaison avec le référenciel
Buffer.s
;//Quelques mots clé
Dim words.sWords(10)
words(0)\key="B10"
words(0)\Dependence="Pause de 10 secondes"
words(1)\key="B11"
words(1)\Dependence="Je prends un café"
words(2)\key="B12"
words(2)\Dependence="Touché coulé"
;Fenetre principale
OpenWindow(#mainform, 0, 0, 500, 500, "Pliage/dépliage", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ButtonGadget(#Go, 5, 10, 24, 24, "Go")
EditorGadget(#editor, 5, 40, 490, 420)
;Evitons les mauvais effets de la touche tabulation
RemoveKeyboardShortcut(0, #PB_Shortcut_Tab)
SetActiveGadget(#Editor)
Repeat
Event=WaitWindowEvent()
Select Event
Case #PB_Event_Menu
Case #PB_Event_Gadget
Select EventGadget()
Case #editor
Case #Go
;Copy de la selection
SendMessage_(GadgetID(#Editor), #WM_COPY,0,0)
;Que l'on stocke dans un buffer
;aprés transformation en majuscule
Buffer=UCase(GetClipboardText())
;Qui est Rapproché avec le referentiel
For i =0 To 2
If words(i)\key = Trim(Buffer)
SetClipboardText(words(i)\Dependence)
SendMessage_(GadgetID(#editor), #WM_PASTE, 0, 0)
EndIf
If UCase(words(i)\Dependence) = Trim(Buffer)
SetClipboardText(words(i)\key)
SendMessage_(GadgetID(#editor), #WM_PASTE, 0, 0)
EndIf
Next
EndSelect
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
-
- Messages : 121
- Inscription : mer. 21/janv./2004 22:18
Re: Plier du texte dans un editor gadget.
C'est pas mal du tout comme solution ce que tu proposes. Si je remplace le bouton par un menu contextuel via le click droit ça peut même être suffisamment ergonomique.
Je te remercie.
Je te remercie.
10 CLS
20 PRINT "Vive PureBasic"
30 GOTO 20
20 PRINT "Vive PureBasic"
30 GOTO 20
- falsam
- Messages : 7317
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Plier du texte dans un editor gadget.
Tu peux aussi mettre en place une touche de raccourci lié à la fenêtre.
Le code dans ce cas :
Le code dans ce cas :
Code : Tout sélectionner
Enumeration
#mainform
#editor
#Go
#Kbd_F4
EndEnumeration
;Structure pour le referenciel de mots
Structure sWords
key.s
Dependence.s
EndStructure
Global Dim words.sWords(10)
;Buffer de comparaison avec le référenciel
Global Buffer.s
Procedure OpenCloseBbracket()
;Copy de la selection
SendMessage_(GadgetID(#Editor), #WM_COPY,0,0)
;Que l'on stocke dans un buffer
;aprés transformation en majuscule
Buffer=UCase(GetClipboardText())
;Qui est Rapproché avec le referentiel
For i =0 To 2
If words(i)\key = Trim(Buffer)
SetClipboardText(words(i)\Dependence)
SendMessage_(GadgetID(#editor), #WM_PASTE, 0, 0)
EndIf
If UCase(words(i)\Dependence) = Trim(Buffer)
SetClipboardText(words(i)\key)
SendMessage_(GadgetID(#editor), #WM_PASTE, 0, 0)
EndIf
Next
EndProcedure
;//Quelques mots clé
words(0)\key="B10"
words(0)\Dependence="Pause de 10 secondes"
words(1)\key="B11"
words(1)\Dependence="Je prends un café"
words(2)\key="B12"
words(2)\Dependence="Touché coulé"
;Fenetre principale
OpenWindow(#mainform, 0, 0, 500, 500, "Pliage/dépliage", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ButtonGadget(#Go, 5, 10, 24, 24, "Go")
EditorGadget(#editor, 5, 40, 490, 420)
;Evitons les mauvais effets de la touche tabulation
RemoveKeyboardShortcut(0, #PB_Shortcut_Tab)
;Touche F5 à la place du bouton
AddKeyboardShortcut(#mainform, #PB_Shortcut_F4, #Kbd_F4)
SetActiveGadget(#Editor)
Repeat
Event=WaitWindowEvent()
Select Event
Case #PB_Event_Menu
If EventMenu()=#Kbd_F4
OpenCloseBbracket()
EndIf
Case #PB_Event_Gadget
Select EventGadget()
Case #editor
Case #Go
OpenCloseBbracket()
EndSelect
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%