Page 2 sur 3
Publié : mar. 17/juin/2008 16:23
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
Publié : mar. 17/juin/2008 17:57
par coxco
merci pour le coup de main
et ensuite

Publié : mar. 17/juin/2008 19:21
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.
Publié : mar. 17/juin/2008 20:22
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

Publié : mar. 17/juin/2008 20:44
par Ollivier

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) )
Publié : mar. 17/juin/2008 21:43
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()
Publié : mer. 18/juin/2008 1:19
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()
Publié : mer. 18/juin/2008 10:11
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.
Publié : jeu. 19/juin/2008 13:55
par Ollivier
Coxco ?
Publié : jeu. 19/juin/2008 15:53
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....
Publié : jeu. 19/juin/2008 21:07
par Ollivier
T'as une solution pour le réanimer ?
Ollivier
Publié : ven. 20/juin/2008 8:10
par Mindphazer
Sais pas....
p'têt bien qu'il a eu tellement peur qu'il est parti en courant...
Publié : ven. 20/juin/2008 9:51
par Ollivier
Bon ben Coxco, si tu repasses par là, n'hésite pas à faire un petit signe de vie.
Publié : ven. 20/juin/2008 17:28
par coxco
oui je suis là
Publié : ven. 20/juin/2008 18:27
par Ollivier
Je continue ?