Après avoir farfouillé dans l'API, j'ai réalisé ce petit truc qui permet de faire défiler page/page avec les touches PgUp et PgDn (ça existe surement déjà sur le forum)
Le défilement se fait toujours par page même si on change la taille de la fenêtre.
Code : Tout sélectionner
; Faire défiler un EditorGadget page par page
; Basé sur un code de Srod
; https://www.purebasic.fr/english/viewtopic.php?p=115944#p115944
; et sur l'API
; EM_SCROLL message
; https://docs.microsoft.com/en-us/windows/win32/controls/em-scroll
; Nécessite une version de PB enregistrée (API)
; Windows only
EnableExplicit
Enumeration
#Win
#Edt
#Pg_Up
#Pg_Dn
EndEnumeration
OpenWindow(#Win, 0, 0, 322, 150, "Page Up / Page Down",
#PB_Window_SystemMenu |
#PB_Window_ScreenCentered |
#PB_Window_SizeGadget)
EditorGadget(#Edt, 8, 8, 306, 133)
; Raccourcis clavier
AddKeyboardShortcut(#Win, #PB_Shortcut_PageUp, 1)
AddKeyboardShortcut(#Win, #PB_Shortcut_PageDown, 2)
; Remplissage pour exemple
Define a.a
For a = 0 To 50
AddGadgetItem(#Edt, a, "Ligne "+Str(a))
Next
; Redimensionne l'éditeur selon la taille de la fenêtre
Procedure Resize_Window()
ResizeGadget(#Edt, 8, 8, WindowWidth(#Win) - 16, WindowHeight(#Win) - 16)
EndProcedure
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
Case #PB_Event_SizeWindow
Resize_Window()
Case #PB_Event_Menu
Select EventMenu()
Case 1
SendMessage_(GadgetID(#Edt),
#WM_VSCROLL , #SB_PAGEUP, 0)
Case 2
SendMessage_(GadgetID(#Edt),
#WM_VSCROLL, #SB_PAGEDOWN, 0)
EndSelect
EndSelect
ForEver
End
Version un peu plus élaborée
Code : Tout sélectionner
; Faire défiler un EditorGadget page par page
; Basé sur un code de Srod
; https://www.purebasic.fr/english/viewtopic.php?p=115944#p115944
; et sur l'API
; EM_SCROLL message
; https://docs.microsoft.com/en-us/windows/win32/controls/em-scroll
; Nécessite une version de PB enregistrée (API)
; Windows only
EnableExplicit
Enumeration
#Win
#Edt
#Pg_Up
#Pg_Dn
#Btn_First
#Btn_Up
#Btn_Dn
#Btn_Last
#Stb
EndEnumeration
OpenWindow(#Win, 0, 0, 450, 250, "Page Up / Page Down",
#PB_Window_SystemMenu |
#PB_Window_ScreenCentered |
#PB_Window_SizeGadget)
EditorGadget(#Edt, 8, 38, WindowWidth(#Win) - 16, WindowHeight(#Win) - 68)
ButtonGadget(#Btn_First, 8, 8, 100, 25, "Première Ligne")
ButtonGadget(#Btn_Up, 110, 8, 100, 25, "Page Précédente")
ButtonGadget(#Btn_Dn, 212, 8, 100, 25, "Page Suivante")
ButtonGadget(#Btn_Last, 314, 8, 100, 25, "Dernière Ligne")
; Statusbar pour afficher des infos (et montrer le grip)
CreateStatusBar(#Stb, WindowID(#Win))
AddStatusBarField(#PB_Ignore)
; Raccourcis clavier
AddKeyboardShortcut(#Win, #PB_Shortcut_PageUp, 1)
AddKeyboardShortcut(#Win, #PB_Shortcut_PageDown, 2)
; Remplissage pour exemple
Define a.a
For a = 0 To 100
AddGadgetItem(#Edt, a, "Ligne "+Str(a))
Next
; Redimensionne l'éditeur selon la taille de la fenêtre
Procedure Resize_Window()
ResizeGadget(#Edt, #PB_Ignore, #PB_Ignore, WindowWidth(#Win) - 16, WindowHeight(#Win) - 68)
EndProcedure
Procedure Scroll_Page(Direction.c)
Select Direction
Case 1
SendMessage_(GadgetID(#Edt),
#WM_VSCROLL , #SB_PAGEUP, 0)
Case 2
SendMessage_(GadgetID(#Edt),
#WM_VSCROLL, #SB_PAGEDOWN, 0)
Case 3
SendMessage_(GadgetID(#Edt),
#EM_SETSEL, 0, 0)
Case 4
SendMessage_(GadgetID(#Edt),
#EM_SETSEL, -1, -1)
EndSelect
EndProcedure
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
Case #PB_Event_SizeWindow
Resize_Window()
Case #PB_Event_Gadget
Select EventGadget()
Case #Btn_Up
Scroll_Page(1)
Case #Btn_Dn
Scroll_Page(2)
Case #Btn_First
Scroll_Page(3)
Case #Btn_Last
Scroll_Page(4)
EndSelect
Case #PB_Event_Menu ; (raccourcis clavier)
Select EventMenu()
Case 1
Scroll_Page(1)
Case 2
Scroll_Page(2)
EndSelect
EndSelect
ForEver
End
Le défilement se fait page /page même si on ajoute/supprime des lignes
(on peut bloquer en lecture seule avec #PB_Editor_ReadOnly)

Du code facile à maintenir (pas d'ID numérique et obligation de déclarer les type de variables (EnableExplicit))
