Bon Coxco, j'en suis au stade où je me soule moi-même : c'est signe de fatigue...
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()