Un bout de code trouvé sur le forum anglais
Code : Tout sélectionner
Procedure GetMouseX(gadget)
GetCursorPos_(mouse.POINT)
MapWindowPoints_(0,GadgetID(gadget),mouse,1)
ProcedureReturn mouse\x
EndProcedure
Procedure GetMouseY(gadget)
GetCursorPos_(mouse.POINT)
MapWindowPoints_(0,GadgetID(gadget),mouse,1)
ProcedureReturn mouse\y
EndProcedure
Procedure GetDesktopWidth()
ProcedureReturn GetSystemMetrics_(#SM_CXSCREEN)
EndProcedure
Procedure GetDesktopHeight()
ProcedureReturn GetSystemMetrics_(#SM_CYSCREEN)
EndProcedure
Procedure ResizeCallback(hWnd,Msg,wParam,lParam)
Result = #PB_ProcessPureBasicEvents
If Msg = #WM_SIZE
w = lParam & $FFFF
h = (lParam >> 16 ) & $FFFF
MoveWindow_(GadgetID(1),0,0,w,h,1)
EndIf
ProcedureReturn Result
EndProcedure
OpenWindow( 0,0,0,300,300,#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered,"PB_Scrollpaint")
CreateGadgetList(WindowID())
SetWindowCallback(@ResizeCallback())
AreaX = GetDesktopWidth() : AreaY = GetDesktopHeight()
hImg = CreateImage(0,AreaX,AreaY)
StartDrawing(ImageOutput())
For x = 0 To AreaX Step 40
For y = 0 To AreaY Step 40
Box(x,y,20,20,RGB(0,0,255)) : Box(x+20,y,20,20,RGB(0,0,180))
Box(x,y+20,20,20,RGB(0,0,128)) : Box(x+20,y+20,20,20,RGB(0,0,80))
Next y
Next x
StopDrawing()
ScrollAreaGadget(1,0,0,WindowWidth(),WindowHeight(),AreaX,AreaY,10,#PB_ScrollArea_BorderLess)
ImageGadget(2,0,0,AreaX,AreaY,hImg)
CloseGadgetList()
pendown=0
Repeat
Select WaitWindowEvent():
Case #PB_EventCloseWindow: End
Case #WM_LBUTTONDOWN
mx=GetMouseX(2) : my=GetMouseY(2)
mxx=(mx/20)*20 : myy=(my/20)*20
UseImage(0)
StartDrawing(ImageOutput())
Box(mxx,myy,20,20,RGB(255,180,0))
StopDrawing()
SetGadgetState(2, UseImage(0))
pendown=1
Case #WM_LBUTTONUP
pendown=0
Case #WM_MOUSEMOVE
If pendown=1
mx=GetMouseX(2) : my=GetMouseY(2)
mxx=(mx/20)*20 : myy=(my/20)*20
UseImage(0)
StartDrawing(ImageOutput())
Box(mxx,myy,20,20,RGB(255,180,0))
StopDrawing()
SetGadgetState(2, UseImage(0))
EndIf
Case #PB_EventGadget
Select EventGadgetID()
Case 3
End
EndSelect
EndSelect
ForEver
End
Et Denis m'avait donné une autre façon de faire
en utilisant
; Position curseur de la ScrollArea
PosScrollH.l = GetScrollPos_(GadgetID(0), #SB_HORZ)
PosScrollV.l = GetScrollPos_(GadgetID(0), #SB_VERT)
Code : Tout sélectionner
Procedure.l GetWindowSize(type.l)
; Source http://forum.purebasic.fr/
; type = 1 : largeur de la bordure droite, gauche ou basse d'une fenêtre
; type = 2 : hauteur de la bordure de titre d'une fenêtre
; type = 3 : largeur de la fenêtre
; type = 4 : hauteur de la fenêtre
GetWindowRect_(WindowID(), @Taille_Fenetre.RECT)
Largeur_Fenetre = Taille_Fenetre\Right - Taille_Fenetre\Left
Hauteur_Fenetre = Taille_Fenetre\Bottom - Taille_Fenetre\top
Largeur_Bordure = (Largeur_Fenetre - WindowWidth()) / 2
Hauteur_Titre = Hauteur_Fenetre - WindowHeight() - Largeur_Bordure
Select type
Case 1
ProcedureReturn Largeur_Bordure
Case 2
ProcedureReturn Hauteur_Titre
Case 3
ProcedureReturn Largeur_Fenetre
Case 4
ProcedureReturn Hauteur_Fenetre
EndSelect
EndProcedure
If OpenWindow(0, 0, 0, 500, 500, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget, "TEST")
If CreateGadgetList(WindowID())
ScrollAreaGadget(0, 0, 0, 450, 450, 1000, 1000, 5, #PB_ScrollArea_BorderLess)
CloseGadgetList()
EndIf
If CreateStatusBar(0, WindowID())
AddStatusBarField(100)
AddStatusBarField(100)
EndIf
Repeat
; Position curseur de la ScrollArea
PosScrollH.l = GetScrollPos_(GadgetID(0), #SB_HORZ)
PosScrollV.l = GetScrollPos_(GadgetID(0), #SB_VERT)
; Largeur et hauteur bordures de la fenêtre
Largeur.l = GetWindowSize(1)
Hauteur.l = GetWindowSize(2)
; Calcule la position de la souris sur la ScrollArea
MulotX = PosScrollH + WindowMouseX()-Largeur
MulotY = PosScrollV + WindowMouseY()-Hauteur
StatusBarText(0,0,Str(PosScrollH)+" - " +Str(PosScrollV),#PB_StatusBar_Center)
StatusBarText(0,1,Str(MulotX)+" - " +Str(MulotY),#PB_StatusBar_Center)
Until WaitWindowEvent() = #PB_EventCloseWindow
EndIf
End