microdevweb a écrit :Encore merci pour toutes ces solutions, je suis cependant retourné vers un CanvasGadget, je dois également géré le DragAndDrop, des SroolAreas et des Splitters cela risque de devenir le foutoir avec un Screen...
Avec le screen, j'ai aussi trouvé une solution pour les resizeScreen()
Une petite procédure que je lance dès qu'on fait certaines actions (resize fenêtre, ou si besoin resize les splitters):
Code : Tout sélectionner
Procedure ResizeScreen(x,y,w,h)
; la nouvelle position et taille de mon screen
ScreenX = x
ScreenY = y
ScreenW= w
ScreenH = h
; j'utilise un tableau appelé layer(), mais tu peux utiliser une liste si tu préfères et l'appeler objet(), comme les objets dans GameMaker.
For i = 0 To ArraySize(layer())-1 ; je supprime mes sprites affichés
FreeSprite(layer(i)\Sprite)
Next i
; si tu as d'autres sprites (pas contenu dans ton tableau ou ta liste), tu les supprimes aussi
; on ferme l'écran
CloseScreen()
; on le réouvre, en fonction des nouvelles dimensions que tu auras modifé
If OpenWindowedScreen(WindowID(#WinMain), ScreenX, ScreenY, ScreenW, ScreenH)=0
MessageRequester("Error","unable to open a new screen ! (Please report this bug with your OS and graphic card.)")
End
EndIf
; puis, je recrée tous mes sprites
For i = 0 To ArraySize(layer())-1
layer(i)\Sprite = CreateSprite(#PB_Any, layer(i)\w, layer(i)\h,#PB_Sprite_AlphaBlending)
Next i
; pareil, si tu as d'autres sprites à créer, tu le fais ici.
; puis, j'update chaque Sprite
For i = 0 To ArraySize(layer())-1
if Startdrawing(spriteoutput(layer(i)\sprite)
DrawAlphaImage(imageid(Layer(i)\image,0,0)
; tu peux dessiner ici ce que tu veux en fait ;)
Stopdrawing()
endif
Next i
EndProcedure
Voilà c'est vraiment tout simple

.
L'idéal étant de ne relancer ce screenUpdate() que si tu mets à nouveau ta souris dans le screen par exemple, avec un flag true/false pour éviter que ça se relance en boucle.
[Edit] par contre pas de prise en compte de MouseX() et MouseY()
Bien évidement, c'était le but de ne pas utiliser MouseX() et MouseY() car avec les tablettes graphiques, ça bug

.
Mais rien ne t'empêche de l'utiliser quand même, auquel cas, il faut mettre un flag si tu es sur le screen et un autre si tu n'y es plus, avec un releaseMouse() 1 ou 0 en fonction de là où tu te trouves. (ReleaseMouse(1) si tu sors du screen par exemple, et ReleaseMouse(0) si tu y entres.
Exemple :
Code : Tout sélectionner
InitSprite()
InitMouse()
InitKeyboard()
screenwidth = 1024
screenheight = 768
ScreenX = 50
ScreenY = 50
If OpenWindow(0, 0, 0, screenwidth, screenheight, "Antialiased Line Demo", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) : EndIf
If OpenWindowedScreen(WindowID(0),ScreenX,ScreenY,screenwidth-100, screenheight-100)=0
MessageRequester("Error", "Can't Open Screen!", 0)
End
EndIf
ShowCursor_(1)
Repeat
mx = WindowMouseX(0) - ScreenX
my = WindowMouseY(0) - ScreenY
; d'abord je vérifie les event gadgets, menus, mouse, etc..
Repeat
; il faut ça pour vérifier les events, afin de ne pas bloquer la fenêtre
Event = WaitWindowEvent(1)
EventMenu = EventMenu()
EventGadget = EventGadget()
EventType = EventType()
EventWindow = EventWindow()
If Event >0
Select Event
Case #PB_Event_Menu ; les events menus à tester
Case #PB_Event_Gadget ; les event gadgets à tester
Case #WM_LBUTTONDOWN
MouseClic = 1
Case #WM_LBUTTONUP
MouseClic = 0
Case #PB_Event_CloseWindow
quit = 1
EndSelect
EndIf
Until Event = 0 Or event = #WM_LBUTTONDOWN Or Event = #WM_LBUTTONUP
; puis je vérifie ce que je fais sur le screen
If Mx>0 And My>0 And Mx<ScreenWidth()-1 And My<ScreenHeight()-1
If Inscreen = 0
Inscreen = 1
ReleaseMouse(0)
; peut être un
MouseLocate(mx-canvasX, My-canvasY) ; serait nécessaire
EndIf
If MouseClic ; on a cliqué, on peut faire des actions sur le screen.
ReleaseMouse(0)
Inscreen = 1
ExamineMouse()
x = MouseX()
y = MouseY()
Debug Str(x)+"/"+Str(y)
;Debug "on clique sur le screen"
ClearScreen(0)
; ici, on display les sprites par exemple
FlipBuffers()
Else ; ou d'autres actions ne nécessitant pas de rester cliqué
; si besoin, on release la souris
ReleaseMouse(1)
;Debug "on est sur le screen, mais on ne clique pas dessus"
ClearScreen(0)
; ici, on display les sprites par exemple
FlipBuffers()
EndIf
Else
;Debug "on n'est plus sur le screen, mais l'interface, gadget, etc..)"
If inscreen = 1
Inscreen = 0
ReleaseMouse(1)
EndIf
EndIf
; SI besoin, on vérifie les event keyboard
If ExamineKeyboard()
EndIf
Until quit = 1