releasemouse + openwindowscreen

Programmation d'applications complexes
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

releasemouse + openwindowscreen

Message par Patrick88 »

salut,

cette application ouvre une fenetre windows avec un screen à l'intérieur
dans le but de créer un prog de dessin
j'ai donc un cuseur graphique qui se balade avec la souris

mon problème est le suivant ( j'ai cherché hier et la je séche )
lorsque la souris "sort" de l'écran je veux pouvoir acceder aux gadget windows ( ça marche , je teste les limites de l'écran et si oui je fait un releasemouse )

mais pour rerentré dans le screen, je vois pas !!!
pour l'instant , si je fais un clic gauche je rerentre dans l'écran en recentrant le curseur .... pas glop

qq a une idée ?

Code : Tout sélectionner

;- déclaration constante
#WINDOW_DEPLACED = 161

Enumeration
  #WIN_MAIN
  #GDT_STATUSBAR
  #GDT_STATUSBAR_COORDX
  #GDT_STATUSBAR_COORDY
EndEnumeration

;- déclaration structure
Structure STRU_INFO_WINDOW
  ;relatif à la fenêtre principale
  main_x.w
  main_y.w
  main_width.w
  main_height.w
  main_flag.l
  main_version.s
  
  ;relatif à la zone de dessin
  draw_x.w 
  draw_y.w 
  draw_width.w
  draw_height.w
  draw_AutoStretch.l
  draw_RightOffset.w
  draw_BottomOffset.w
  draw_TopOffset.w
  
  etat.w
EndStructure

;- déclaration variable
Global INFO_WINMAIN.STRU_INFO_WINDOW
Global a_qui_est_la_souris.b

Procedure initialisation()
  ;relatif à la fenêtre principale
  INFO_WINMAIN\main_x = 50
  INFO_WINMAIN\main_y = 50
  INFO_WINMAIN\main_width = 600
  INFO_WINMAIN\main_height = 350
  INFO_WINMAIN\main_flag = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget
  INFO_WINMAIN\main_version = "Draw-01-00"
  
  ;relatif à la zone de dessin
  INFO_WINMAIN\draw_x = 25
  INFO_WINMAIN\draw_y = 25
  INFO_WINMAIN\draw_RightOffset = 25
  INFO_WINMAIN\draw_BottomOffset = 25
  INFO_WINMAIN\draw_TopOffset = 4
  INFO_WINMAIN\draw_width = INFO_WINMAIN\main_width - INFO_WINMAIN\draw_x-INFO_WINMAIN\draw_RightOffset
  INFO_WINMAIN\draw_height = INFO_WINMAIN\main_height - INFO_WINMAIN\draw_y-INFO_WINMAIN\draw_BottomOffset
  INFO_WINMAIN\draw_AutoStretch = 1
   
  If InitSprite() = 0 Or InitKeyboard()=0 Or InitMouse()  = 0
    MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
    End
  ElseIf OpenWindow(#WIN_MAIN,INFO_WINMAIN\main_x,INFO_WINMAIN\main_y,INFO_WINMAIN\main_width,INFO_WINMAIN\main_height,INFO_WINMAIN\main_flag,INFO_WINMAIN\main_version) = 0
    MessageRequester( "Erreur", "Impossible d'ouvrir la fenêtre")
    End
  EndIf
  If OpenWindowedScreen( WindowID(#WIN_MAIN), INFO_WINMAIN\draw_x,INFO_WINMAIN\draw_y,INFO_WINMAIN\draw_width,INFO_WINMAIN\draw_height, INFO_WINMAIN\draw_AutoStretch, INFO_WINMAIN\draw_RightOffset, INFO_WINMAIN\draw_BottomOffset ) = 0
    MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
    End
  EndIf
  If CreateStatusBar(#GDT_STATUSBAR, WindowID(#WIN_MAIN)) 
    AddStatusBarField(80) 
    AddStatusBarField(80)
  EndIf 
  
   a_qui_est_la_souris=0
  INFO_WINMAIN\etat = 0
EndProcedure

initialisation()
Repeat
  ClearScreen(255,255,255)
  
  result = ExamineMouse()
  
  If INFO_WINMAIN\etat = 0
    INFO_WINMAIN\etat =1
    MouseLocate(INFO_WINMAIN\draw_width/2,INFO_WINMAIN\draw_height/2)
  EndIf
  mx.w = MouseX() : my.w = MouseY()
  
  If StartDrawing(ScreenOutput())
    FrontColor(255,0,0)
    LineXY(0,my,INFO_WINMAIN\draw_width,my)
    LineXY(mx,0,mx,INFO_WINMAIN\draw_height)
    StopDrawing()
  EndIf
  
  wmx = WindowMouseX() : wmy = WindowMouseY()
  StatusBarText(#GDT_STATUSBAR, 0, "X:"+Str(mx)) 
  StatusBarText(#GDT_STATUSBAR, 1, "Y:"+Str(my)) 
  
  If mx=0 Or mx=INFO_WINMAIN\draw_width-1
    a_qui_est_la_souris = ReleaseMouse(1)
  EndIf
  If my=0 Or my=INFO_WINMAIN\draw_height-1
    a_qui_est_la_souris = ReleaseMouse(1)
  EndIf
  
  ;- gestion des évenement windows
  Select WindowEvent()
    Case #PB_Event_CloseWindow 
      Quit = 1
      
    Case #WM_LBUTTONDOWN
      If  a_qui_est_la_souris = 1
        a_qui_est_la_souris = ReleaseMouse(0)
        INFO_WINMAIN\etat =0
      EndIf
       
      ;-Gadgets
    Case #PB_Event_Gadget
      Select EventGadgetID()

      EndSelect
      
    Default
       
  EndSelect
 
  FlipBuffers()
  
  Delay(1)
Until Quit>0
End
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Un bout de code de test que j'avais fait il y a un moment sur le même thème.

Si tu arrives à l'adapter...!
Il faudra aussi penser à redétecter la position de la fenêtre si tu la bouges.

Code : Tout sélectionner

#Window = 0
#Width = 600
#Height = 600
#Timer = 0

;- Initialisation de DirectX
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("Erreur", "Impossible d'initialiser DirectX", 0)
  CloseWindow(#Window) : End
EndIf

;- Ouverture de la fenêtre et de l'écran
hwnd = OpenWindow(#Window, 0, 0, #Width, #Height, #PB_Window_TitleBar | #PB_Window_ScreenCentered, "")
OpenWindowedScreen(hwnd, 0, 0, #Width, #Height, 0, 0, 0)

l = WindowX() : r = WindowX()+WindowWidth()
t = WindowY() : b = WindowY()+WindowHeight()

;- Début de la boucle
Repeat
  GetCursorPos_(Pos.POINT)
  x = Pos\x : y = Pos\y
  
  ClearScreen(0, 0, 0) : ExamineKeyboard() : ExamineMouse()
  SetWindowTitle(#Window, Str(x)+" - "+Str(y)+" <---> "+Str(l)+" - "+Str(r)+" - "+Str(t)+" - "+Str(b))
  
  StartDrawing(ScreenOutput())
  Circle(MouseX(),MouseY(),6,RGB($C0,$C0,$C0))
  StopDrawing()
  
  If x <= l+5 Or x >= r-5 Or y <= t +30  Or y >= b -5
    ReleaseMouse(1)
  Else
    ReleaseMouse(0)
  EndIf
  
  FlipBuffers()
  Delay(1)
  If KeyboardPushed(#PB_Key_Escape) : quit = 1 : EndIf
  
  While WindowEvent():Wend
  
Until quit = 1
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

grmblbl !

ça marche avec ton bout de code et pas avec le mien, m'int'nant j'arrive à rerentrer dans mon screen mais je perd le curseur ! groumphh !

comprends pas !!!!

bof, mystère de l'informatique...

pat
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Ben je te l'ai dit, faudra adapter, parce que c'est un truc que j'avais fait il y a un bon moment, je ne sais même plus pour quelle raison j'avait fait ça.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Tiens, un début de solution en utilisant ton code.

Le curseur a un peu la maladie de Parkinson au moment de retourner dans le Screen, et il faut le faire rentre à coups de savate, mais c'est déjà un début de piste :lol:

Code : Tout sélectionner

;- déclaration constante 
#WINDOW_DEPLACED = 161 

Enumeration 
  #WIN_MAIN 
  #GDT_STATUSBAR 
  #GDT_STATUSBAR_COORDX 
  #GDT_STATUSBAR_COORDY 
EndEnumeration 

;- déclaration structure 
Structure STRU_INFO_WINDOW 
  ;relatif à la fenêtre principale 
  main_x.w 
  main_y.w 
  main_width.w 
  main_height.w 
  main_flag.l 
  main_version.s 
  
  ;relatif à la zone de dessin 
  draw_x.w 
  draw_y.w 
  draw_width.w 
  draw_height.w 
  draw_AutoStretch.l 
  draw_RightOffset.w 
  draw_BottomOffset.w 
  draw_TopOffset.w 
  
  etat.w 
EndStructure 

;- déclaration variable 
Global INFO_WINMAIN.STRU_INFO_WINDOW 
Global a_qui_est_la_souris.b 

Procedure initialisation() 
  ;relatif à la fenêtre principale 
  INFO_WINMAIN\main_x = 50 
  INFO_WINMAIN\main_y = 50 
  INFO_WINMAIN\main_width = 600 
  INFO_WINMAIN\main_height = 350 
  INFO_WINMAIN\main_flag = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget 
  INFO_WINMAIN\main_version = "Draw-01-00" 
  
  ;relatif à la zone de dessin 
  INFO_WINMAIN\draw_x = 25 
  INFO_WINMAIN\draw_y = 25 
  INFO_WINMAIN\draw_RightOffset = 25 
  INFO_WINMAIN\draw_BottomOffset = 25 
  INFO_WINMAIN\draw_TopOffset = 4 
  INFO_WINMAIN\draw_width = INFO_WINMAIN\main_width - INFO_WINMAIN\draw_x-INFO_WINMAIN\draw_RightOffset 
  INFO_WINMAIN\draw_height = INFO_WINMAIN\main_height - INFO_WINMAIN\draw_y-INFO_WINMAIN\draw_BottomOffset 
  INFO_WINMAIN\draw_AutoStretch = 1 
  
  If InitSprite() = 0 Or InitKeyboard()=0 Or InitMouse()  = 0 
    MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 ) 
    End 
  ElseIf OpenWindow(#WIN_MAIN,INFO_WINMAIN\main_x,INFO_WINMAIN\main_y,INFO_WINMAIN\main_width,INFO_WINMAIN\main_height,INFO_WINMAIN\main_flag,INFO_WINMAIN\main_version) = 0 
    MessageRequester( "Erreur", "Impossible d'ouvrir la fenêtre") 
    End 
  EndIf 
  If OpenWindowedScreen( WindowID(#WIN_MAIN), INFO_WINMAIN\draw_x,INFO_WINMAIN\draw_y,INFO_WINMAIN\draw_width,INFO_WINMAIN\draw_height, INFO_WINMAIN\draw_AutoStretch, INFO_WINMAIN\draw_RightOffset, INFO_WINMAIN\draw_BottomOffset ) = 0 
    MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 ) 
    End 
  EndIf 
  If CreateStatusBar(#GDT_STATUSBAR, WindowID(#WIN_MAIN)) 
    AddStatusBarField(80) 
    AddStatusBarField(80) 
  EndIf 
  
  a_qui_est_la_souris=0 
  INFO_WINMAIN\etat = 0 
EndProcedure 

initialisation() 
Repeat 
  ClearScreen(255,255,255) 
  
  result = ExamineMouse() 
  
  If INFO_WINMAIN\etat = 0 
    INFO_WINMAIN\etat =1 
    MouseLocate(INFO_WINMAIN\draw_width/2,INFO_WINMAIN\draw_height/2) 
  EndIf 
  mx.w = MouseX() : my.w = MouseY() 
  
  If StartDrawing(ScreenOutput()) 
    FrontColor(255,0,0) 
    LineXY(0,my,INFO_WINMAIN\draw_width,my) 
    LineXY(mx,0,mx,INFO_WINMAIN\draw_height) 
    StopDrawing() 
  EndIf 
  
  StatusBarText(#GDT_STATUSBAR, 0, "X:"+Str(mx)) 
  StatusBarText(#GDT_STATUSBAR, 1, "Y:"+Str(my)) 
  
  wmx = WindowMouseX() : wmy = WindowMouseY() 
  
  If wmx <= INFO_WINMAIN\draw_x Or wmx >=INFO_WINMAIN\draw_width + INFO_WINMAIN\draw_x Or wmy <= INFO_WINMAIN\draw_y Or wmy >=INFO_WINMAIN\draw_height + INFO_WINMAIN\draw_y
    ReleaseMouse(1)
  Else
    ReleaseMouse(0)
  EndIf

  ; If mx=0 Or mx=INFO_WINMAIN\draw_width-1 
    ; a_qui_est_la_souris = ReleaseMouse(1) 
  ; EndIf 
  ; If my=0 Or my=INFO_WINMAIN\draw_height-1 
    ; a_qui_est_la_souris = ReleaseMouse(1) 
  ; EndIf 
  
  ;- gestion des évenement windows 
  Select WindowEvent() 
    Case #PB_Event_CloseWindow 
      Quit = 1 
      
    Case #WM_LBUTTONDOWN 
      If  a_qui_est_la_souris = 1 
        a_qui_est_la_souris = ReleaseMouse(0) 
        INFO_WINMAIN\etat =0 
      EndIf 
      
      ;-Gadgets 
    Case #PB_Event_Gadget 
      Select EventGadgetID() 
        
      EndSelect 
      
    Default 
      
  EndSelect 
  
  FlipBuffers() 
  
  Delay(1) 
Until Quit>0 
End 
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

c'est marrant il arrive mieux à rentrer en venant de la droite

bizarre ce machin...

j'ai pas bien compris le coup du releasemouse()

ça libère la souris pour les autres applis que la nôtre ??? c'est ça ?
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Ca libère la souris quand elle est capturée par le WindowedScreen() avec ExamineMouse().

Après, t'en fais ce que tu veux.
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

bon, j'ai exploré un peu ailleur , et j'ai un peu bidouillé l'exemple "image.pb"
ça le fait aussi, et là plus de problème avec les releasemouse()

je suis quand même vachement bon :mrgreen: :mrgreen:

Code : Tout sélectionner

;
; ------------------------------------------------------------
;
;   PureBasic - Image example file
;
;    (c) 2001 - Fantaisie Software
;
; ------------------------------------------------------------
;
;
; Some 2D graphics functions...
;

Procedure Create_Image()

If CreateImage(0, 500, 300)
  
  StartDrawing(ImageOutput())
  
  For k=0 To 500
    FrontColor(k,0, k)  ; a rainbow, from black to pink
    Line(0, k, 300, 0)
  Next
  
  DrawingMode(1)
  Locate(40, 50)
  FrontColor(255,255,255) ; print the text to white !
  DrawText("An image created easely...")
  
  StopDrawing() ; This is absolutely needed when the drawing operations are finished !!! Never forget it !
  
EndIf
  
;CopyImage(0, 1)
;ResizeImage(1, 100, 100)
  
;GrabImage(0, 2, 100, 60, 150, 40)
EndProcedure

Procedure WindowCallback(WindowID, Message, lParam, wParam)
  If Message = #WM_PAINT
    StartDrawing(WindowOutput())
    DrawImage(UseImage(0), 0, 0)
    ;DrawImage(UseImage(1), 320, 80)
    ;DrawImage(UseImage(2), 320, 200)
    StopDrawing()
  EndIf
  
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure


If OpenWindow(0, 100, 100, 500, 300, #PB_Window_SystemMenu, "PureBasic - Image")
  
  Create_Image()
  
  SetWindowCallback(@WindowCallback())
  
  Repeat
    EventID = WaitWindowEvent()
    StartDrawing(WindowOutput())
      DrawImage(UseImage(0), 0, 0)
    StopDrawing()
    
    StartDrawing(WindowOutput())
      FrontColor(255,255,255)
      LineXY(0,WindowMouseY(),500,WindowMouseY())
      LineXY(WindowMouseX(),0,WindowMouseX(),300)
    StopDrawing()
  Until EventID = #PB_EventCloseWindow  ; If the user has pressed on the close button
  
EndIf

End   ; All the opened windows are closed automatically by PureBasic
Répondre