multiligne sur un listicongadget

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Bon alors étape par étape parce que sinon on ne va pas s'en sortir...
On fait d'abord une grille

Code : Tout sélectionner

; Auteur : Ollivier, Juin 2008
; 

; Quelques réglages...
; ********************

; Position de la fenêtre
  wx = 100
  wy = 100
  
; Dimensions de la fenêtre
  ww = 512
  wh = 384
  
; Dimensions d'une cellule (au démarrage...)
  celh.L = 24
  celw = 64
  
; Dimensions du tableau (en pixels)
  tw = 10000
  th = 10000
  
; 2 lignes horizontales et verticales pour la fabrication 
; de la grille, le tout stocké dans 2 images
  horiLine = CreateImage(-1, tw, 1)
  vertLine = CreateImage(-1, 1, th)

; Une fenêtre
  win = OpenWindow(-1, wx, wy, ww, wh, "", $cf0001)
  
; Une liste de gadgets dans cette fenêtre
  CreateGadgetList(WindowID(win) )
  
; Un gadget général
  G0 = ScrollAreaGadget(-1, 0, 0, ww, wh, tw, th, 16, 8)
  
; La fabrication de la grille
  For y = 0 To th - 1 Step 24
    ImageGadget(-1, 0, y, tw, 1, ImageID(HoriLine) )
  Next
  For x = 0 To tw - 1 Step 64
    ImageGadget(-1, x, 0, 1, th, ImageID(VertLine) )
  Next

; La boucle principale
  Repeat
    ; Attend un événement
    Event0 = WaitWindowEvent()
    
    ; Vérifie que l'événement fait partie de notre fenêtre
    If EventWindow() = win
      ; si oui, de quoi s'agit-il?
      Select Event0
        ; on veut quitter
        Case 16
          wQuit | 1
        ; on veut déformer la fenêtre
        Case #PB_Event_SizeWindow
          ww = WindowWidth(win)
          wh = WindowHeight(win)
          ResizeGadget(G0, 0, 0, ww, wh)
      EndSelect
    EndIf
  Until wQuit
Dernière modification par Ollivier le jeu. 19/juin/2008 21:12, modifié 1 fois.
coxco
Messages : 92
Inscription : ven. 06/juin/2008 16:04

Message par coxco »

merci pour le coup de main

et ensuite :)
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Ensuite on va récupérer le couteau suisse de Chris structuré par Le Soldat Inconnu : Ces deux passionnés ont posté un code très pratique qui permet d'obtenir des infos sur ta fenêtre en temps réel. Grâce à leur code, on va récupérer les infos nécessaires pour localiser la souris.
Avatar de l’utilisateur
Ouaf-Ouaf
Messages : 212
Inscription : dim. 11/juil./2004 9:07

Message par Ouaf-Ouaf »

Cet homme essaye de t'induire en erreur, preuve flagrante de son appretance à la conspirations des barbiers sodomites bielo-russes. Aquièsce, ne panique pas, mais considère bien ces instructions :

Il faut en réalitée que tu jette le pied-bot de barbie dans la mangrov en criant à l'aide, afin que la ligue bolchevik pour la liberation d'ingrid betancourt intercède en ta faveur auprès du vendeur de bonbon, achète son silence ou 3 livres de haribos (verts) puis assied toi dans l'herbe.

Voilà ( pour que t'ai un taux reglementaire de reponces à côté de la plaque )

Inutile de me remercier 8)
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

:D Ah, il est beau ton lien !!!!

Pardon Coxco...

Donc, grâce à leur code, j'insère ma petite routine suivante dans ma boucle principale Repeat: Until wQuit (Cf ci-dessus il y a... 2 heures... Désolé...)

Code : Tout sélectionner

; Avec 
    DMx = DesktopMouseX()
    DMy = DesktopMouseY()
    hWnd = GetParent_(WindowFromPoint_(DMx, DMy) )
    If hWnd = GadgetID(G0)
      GetWindowRect_(hWnd, GetGadget.RECT)
      Mx = GetGadgetAttribute(G0, #PB_ScrollArea_X) + DMx - GetGadget\Left
      My = GetGadgetAttribute(G0, #PB_ScrollArea_Y) + DMy - GetGadget\Top
    ; ICI VA ETRE INSEREE MA ROUTINE DE TEST
    EndIf
Grâce à cela, Mx et My te donnent la position exacte de ta souris dans le ScrollArea quelque soit la position des ascenseurs.

On va donc pouvoir comparer cette position avec le voisinage d'une des barres noires (horizontales ou bien verticales) de notre grille.

MAIS ATTENTION !!!

Nous ne savons pas où sont ces barres... Donc stockons aussi leurs Handles (je commenterai les 2 lignes concernées) dans un tableau (d'où apparation d'un Global Dim HndBar(xxx) )
Dernière modification par Ollivier le mar. 17/juin/2008 21:44, modifié 1 fois.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Donc voici le code d'un prog qui détecte quelle barre verticale avoisine la souris. On peut voir dans cet exemple qu'il y a cohérence entre les valeurs détectées et les barres verticales frôlées par la souris.

J'ai fait apparaître une structure BAR que Global Dim utilise pour stocker le handle et la direction de la barre (verticale ou horizontale).

Et tout est fourgué dans une procédure en vue de son partage.

Code : Tout sélectionner

; Par Ollivier
; Avec l'aide de Chris et Le Soldat Inconnu

#HorizBar = 0
#VertBar = 1

Structure BAR ; Pour chaque barre, on aura :
  Hnd.L ; un handle (n° unique que l'OS attribue à chaque objet qui le compose)
  Dir.L ; Direction : 0 = Horizontale ; 1 = Vertical
EndStructure

Procedure Tabloide()

; Quelques réglages...
; ********************

; Position de la fenêtre
  wx = 10
  wy = 100
  
; Dimensions de la fenêtre
  ww = 512
  wh = 384
  
; Dimensions d'une cellule (au démarrage...)
  celh.L = 24
  celw = 64
  
; Dimensions du tableau (en pixels)
  tw = 10000
  th = 10000
  
; Allocation d'un tableau (dans le sens du langage)
  Global Dim Bar.BAR(9999) ; 9999 est un nombre large qu'il faudra préciser clairement plus tard
  
; 2 lignes horizontales et verticales pour la fabrication 
; de la grille, le tout stocké dans 2 images
  horiLine = CreateImage(-1, tw, 1)
  vertLine = CreateImage(-1, 1, th)

; Une fenêtre
  win = OpenWindow(-1, wx, wy, ww, wh, "", $cf0000)
  Debug Win
  
; Une liste de gadgets dans cette fenêtre
  CreateGadgetList(WindowID(win) )
  
; Un gadget général
  G0 = ScrollAreaGadget(-1, 0, 0, ww, wh, tw, th, 16, 8)
  Debug "Handle gadget = " + Str(GadgetID(G0) )
  
; La fabrication de la grille
  HndBarCount = 0
  For x = 0 To tw - 1 Step 64
    ; Ici on enregistre le handle de chaque barre verticale
    Bar(HndBarCount)\Hnd = ImageGadget(-1, x, 0, 1, th, ImageID(VertLine) )
    Bar(HndBarCount)\Dir = #VertBar
    HndBarCount + 1 ; Et HndBarCount contiendra le total des handles à tester
  Next
  For y = 0 To th - 1 Step 24
    ; Ici on enregistre le handle de chaque barre horizontale
    Bar(HndBarCount)\Hnd = ImageGadget(-1, 0, y, tw, 1, ImageID(HoriLine) )
    Bar(HndBarCount)\Dir = #HorizBar
    HndBarCount + 1
  Next
  HndBarCount - 1 ; Au final, il y en a un de trop, donc on corrige...
  
; La boucle principale
  Repeat
    ; Attend un événement
    Event0 = WaitWindowEvent()
    
    ; Vérifie que l'événement fait partie de notre fenêtre
    If EventWindow() = win
      ; si oui, de quoi s'agit-il?
      Select Event0
        ; on veut quitter
        Case 16
          wQuit | 1
        ; on veut déformer la fenêtre
        Case #PB_Event_SizeWindow
          ww = WindowWidth(win)
          wh = WindowHeight(win)
          ResizeGadget(G0, 0, 0, ww, wh)
      EndSelect
    EndIf
    
    DMx = DesktopMouseX()
    DMy = DesktopMouseY()
    hWnd = GetParent_(WindowFromPoint_(DMx, DMy) )
    If hWnd = GadgetID(G0)
      GetWindowRect_(hWnd, GetGadget.RECT)
      Mx = GetGadgetAttribute(G0, #PB_ScrollArea_X) + DMx - GetGadget\Left
      My = GetGadgetAttribute(G0, #PB_ScrollArea_Y) + DMy - GetGadget\Top
      
      For i = 0 To HndBarCount
        If Bar(i)\Dir = #VertBar
          If Abs(GadgetX(Bar(i)\Hnd) - Mx) < 5
            Debug "Barre n°" + Str(i)
            Break
          EndIf
        EndIf
      Next
      
    EndIf    
    
  Until wQuit
EndProcedure

  Tabloide()
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Bon Coxco, j'en suis au stade où je me soule moi-même : c'est signe de fatigue...

Voilà où j'en suis :

Code : Tout sélectionner

;***************************************************************
; Par Ollivier 18 Juin 2008 /!\ EN TRAVAUX
;***************************************************************
; Ressources nécessaires à la création : 
; **************************************
; De l'huile de coude durant 8 heures pour l'instant...
;  (à raison d'un caractère/minute)
; 1 bière (L'abus d'alcool est dangereux pour la santé)
; 1 barbecue
; 1 chasse aux moustiques
; 1 chat qui fait ronron devant les saucisses
; 1 plantage de PC
; 1 blog Skyrock-Fantaisie
; De la viande calcinée
;***************************************************************
; Avec l'aide de :
; ****************
; * Srod : Conseiller en ListIcon et ses limites
; http://www.purebasic.fr/english/viewtopic.php?p=248335
; * Chris et Le Soldat Inconnu : détection sérieuse de la souris
; http://www.purebasic.fr/french/viewtopic.php?t=667
; * Progi1984 : Afficher un autre type de curseur souris
; http://www.purebasic.fr/english/viewtopic.php?t=24012
; * Flype : Détecter un clic de la souris sous Windows
; http://www.purebasic.fr/french/viewtopic.php?t=687
; * Dobro : Présentation du code source
; http://www.purebasic.fr/french/viewtopic.php?t=8205
; >> J'ai pas encore testé ta bête. ça arrive...
; ***********
; Ainsi que :
; ***********
; * Brossden : Assistant au post, spécialité Retour Chariot
; * Ouaf x2 : Analyse d'impact sur l'utilisateur
; * Coxco : Inspection des travaux finis
;***************************************************************

#HorizBar = 0 
#VertBar = 1 
#MoveBar = 2

Structure BAR ; Pour chaque barre, on aura : 
  Hnd.L ; un handle (n° unique que l'OS attribue à chaque objet qui le compose) 
  Dir.L ; Direction : 0 = Horizontale ; 1 = Vertical 
EndStructure 

Procedure Tabloide() 

  HorizontalCurs = LoadCursor_(0, 32645) ; horiz
  VerticalCursor = LoadCursor_(0, 32644) ; verti

; Quelques réglages... 
; ******************** 

; Position de la fenêtre 
  wx = 10 
  wy = 100 
  
; Dimensions de la fenêtre 
  ww = 512 
  wh = 384 
  
; Dimensions d'une cellule (au démarrage...) 
  celh.L = 24 
  celw = 64 
  
; Dimensions du tableau (en pixels) 
  tw = 10000 
  th = 10000 
  
; Allocation d'un tableau (dans le sens du langage) 
  Global Dim Bar.BAR(9999) ; 9999 est un nombre large qu'il faudra préciser clairement plus tard 
  
; 2 lignes horizontales et verticales pour la fabrication 
; de la grille, le tout stocké dans 2 images 
  horiLine = CreateImage(-1, tw, 1) 
  vertLine = CreateImage(-1, 1, th) 

; Une fenêtre 
  win = OpenWindow(-1, wx, wy, ww, wh, "", $cf0000) 
  
; Une liste de gadgets dans cette fenêtre 
  CreateGadgetList(WindowID(win) ) 
  
; Un gadget général 
  G0 = ScrollAreaGadget(-1, 0, 0, ww, wh, tw, th, 16, 8) 
  
; La fabrication de la grille 
  HndBarCount = 0 
  For x = 0 To tw - 1 Step 64 
    ; Ici on enregistre le handle de chaque barre verticale 
    Bar(HndBarCount)\Hnd = ImageGadget(-1, x, 0, 1, th, ImageID(VertLine) ) 
    Bar(HndBarCount)\Dir = #VertBar 
    HndBarCount + 1 ; Et HndBarCount contiendra le total des handles à tester 
  Next 
  For y = 0 To th - 1 Step 24 
    ; Ici on enregistre le handle de chaque barre horizontale 
    Bar(HndBarCount)\Hnd = ImageGadget(-1, 0, y, tw, 1, ImageID(HoriLine) ) 
    Bar(HndBarCount)\Dir = #HorizBar 
    HndBarCount + 1 
  Next 
  HndBarCount - 1 ; Au final, il y en a un de trop, donc on corrige... 
  
; La boucle principale 
  Define GetGadget.RECT
  Repeat 
    ; Attend un événement 
    Event0 = WaitWindowEvent() 

    DMx = DesktopMouseX() 
    DMy = DesktopMouseY() 
    If EventMouse = 0
      Action = 0

    hWnd = GetParent_(WindowFromPoint_(DMx, DMy) )
    If hWnd <> GadgetID(G0)
      hWnd = GetParent_(hWnd)
    EndIf
    If hWnd = GadgetID(G0) 
      GetWindowRect_(hWnd, GetGadget) 
      Mx = GetGadgetAttribute(G0, #PB_ScrollArea_X) + DMx - GetGadget\Left 
      My = GetGadgetAttribute(G0, #PB_ScrollArea_Y) + DMy - GetGadget\Top 
      For i = 0 To HndBarCount 
        If Bar(i)\Dir = #VertBar 
          If Abs(GadgetX(Bar(i)\Hnd) - Mx) < 5 
            SetCursor_(VerticalCursor)
            Action = #VertBar | #MoveBar
            EventBar = i
            Break 
          EndIf 
        EndIf 
        If Bar(i)\Dir = #HorizBar 
          If Abs(GadgetY(Bar(i)\Hnd) - My) < 5 
            SetCursor_(HorizontalCurs)
            Action = #HorizBar | #MoveBar
            EventBar = i
            Break 
          EndIf 
        EndIf 
      Next       
    EndIf    


    Else
      Mx = GetGadgetAttribute(G0, #PB_ScrollArea_X) + DMx - GetGadget\Left 
      My = GetGadgetAttribute(G0, #PB_ScrollArea_Y) + DMy - GetGadget\Top 
    EndIf

    ; Vérifie que l'événement fait partie de notre fenêtre 
    If EventWindow() = win 
      ; si oui, de quoi s'agit-il? 
      Select Event0 
      
        ; on veut quitter 
        Case 16 
          wQuit | 1 
          
        ; on veut déformer la fenêtre 
        Case #PB_Event_SizeWindow 
          ww = WindowWidth(win) 
          wh = WindowHeight(win) 
          ResizeGadget(G0, 0, 0, ww, wh) 
          
        ; on clique sur la souris
        Case #WM_LBUTTONDOWN
          EventMouse = 1
          
        Case #WM_LBUTTONUP
          EventMouse = 0
          
      EndSelect 
      If EventMouse = 1
          ; Est-ce une action de déplacement de barre ? (= déformation de cellule)
          If Action & #MoveBar ; oui...
            If (Action & 1) = #HorizBar
              yDelta = My - GadgetY(Bar(EventBar)\Hnd)
              For i = EventBar To HndBarCount
                If Bar(i)\Dir = #HorizBar
                  ResizeGadget(Bar(i)\Hnd, #PB_Ignore, GadgetY(Bar(i)\Hnd) + yDelta, #PB_Ignore, #PB_Ignore)
                EndIf
              Next
            Else
              xDelta = Mx - GadgetX(Bar(EventBar)\Hnd)
              For i = EventBar To HndBarCount
                If Bar(i)\Dir = #VertBar
                  ResizeGadget(Bar(i)\Hnd, GadgetX(Bar(i)\Hnd) + xDelta, #PB_Ignore, #PB_Ignore, #PB_Ignore)
                EndIf
              Next
            EndIf
          EndIf
      EndIf
    EndIf 
    
  Until wQuit 
EndProcedure 

  Tabloide() 
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Maintenant que l'on a ça, on va pouvoir passer à la partie virtuelle du système. En effet, imaginons que l'on remplisse près de 800 cases de texte, on ne contrôle plus les ressources CPU que l'OS a besoin pour mettre à jour les centaines de données qui ne sont pas visibles à l'écran.

Ce non-contrôle s'aperçoit déjà, les cases vides (barres dégradées temporairement pendant la modif). Au lieu de forcer l'OS à maintenir un graphisme parfait, il faut lui dégager l'idée qu'il a affaire à un ScrollArea de 10 000 x 10 000 pixels.

Une première étape va consister à créer un buffer suffisamment structuré pour stocker et récupérer rapidement la configuration de la grille là où l'on souhaite en voir une partie.

Une seconde étape va consister à créer un fichier suffisament structuré pour... (idem que § précédent)

ScrollArea <<-->> Buffer mémoire <<-->> Fichier

Ainsi, même si le document est gigantesque, sa manipulation sera aise.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Coxco ?
Avatar de l’utilisateur
Mindphazer
Messages : 695
Inscription : mer. 24/août/2005 10:42

Message par Mindphazer »

Je crois qu'il est parti se chercher un (même plusieurs) dolipranes, au vu de ce qu'une simple question d'1 ligne a apporté comme réponse.....
...pas sûr qu'il revienne....
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

T'as une solution pour le réanimer ?

Ollivier
Avatar de l’utilisateur
Mindphazer
Messages : 695
Inscription : mer. 24/août/2005 10:42

Message par Mindphazer »

Sais pas....
p'têt bien qu'il a eu tellement peur qu'il est parti en courant...
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Bon ben Coxco, si tu repasses par là, n'hésite pas à faire un petit signe de vie.
coxco
Messages : 92
Inscription : ven. 06/juin/2008 16:04

Message par coxco »

oui je suis là
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Je continue ?
Répondre