Page 1 sur 1

Soucis avec la souris et l'écran 'Screen'

Publié : lun. 06/déc./2010 20:43
par flaith
Bonsoir tout le monde,

Mon soucis est le suivant: dès que je sors de l'écran 'screen', je rend la main à la souris windows et dès que j'y retourne, c'est un sprite qui reprend la main, jusque la pas de soucis, sauf que :
Essayez le code suivant, cliquez et laissez le clic appuyé puis sortez de l'écran, relâchez le clic puis revenez sur le 'screen', le clic de la souris est toujours actif :?

Code : Tout sélectionner

#MAIN_WIN       = 0
#SPR_MOUSE      = 1
#SCREEN_Width   = 280
#SCREEN_Height  = 192

_iInside = #True

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("Error", "Can't open the sprite system", 0)
  End
EndIf

If OpenWindow(#MAIN_WIN, 0, 0, #SCREEN_Width, #SCREEN_Height, "", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
  If OpenWindowedScreen(WindowID(#MAIN_WIN), 0, 0, #SCREEN_Width, #SCREEN_Height, 0, 0, 0)
    ; Ugly mouse
    CreateSprite(#SPR_MOUSE, 10, 10)
    StartDrawing(SpriteOutput(#SPR_MOUSE))
      Box(0,0,10,10,$FFFF00)
    StopDrawing()
  Else
    MessageRequester("Error", "Can't open windowed screen!", 0)
    End
  EndIf
    
  Repeat
    Repeat
      _iEventWindow = WaitWindowEvent(5)
      Select _iEventWindow
        Case #PB_Event_CloseWindow
          _iQuit = 1
      EndSelect
    Until _iEventWindow = 0
  
    FlipBuffers()

    If _iInside = #True : ExamineMouse() : EndIf
    _iBut_left    = MouseButton(#PB_MouseButton_Left)
    _iBut_middle  = MouseButton(#PB_MouseButton_Middle)
    _iBut_right   = MouseButton(#PB_MouseButton_Right)

    If _iInside
      ; Outside the screen ?
      If MouseX() >= #SCREEN_Width - 1 Or MouseY() >= #SCREEN_Height - 1 Or MouseX() < 1 Or MouseY() < 1
        ReleaseMouse(1)
        _iInside = #False
      EndIf
    Else
      _iMousePosX = WindowMouseX(#MAIN_WIN) : _iMousePosY = WindowMouseY(#MAIN_WIN)
      ; Inside the screen ?
      If _iMousePosX < #SCREEN_Width And _iMousePosX > 0 And _iMousePosY > 0 And _iMousePosY < #SCREEN_Height
        ReleaseMouse(0)
        MouseLocate(_iMousePosX, _iMousePosY)
        _iInside = #True
      EndIf
    EndIf

    ExamineKeyboard()
    _iPosX = MouseX() : _iPosY = MouseY()

    ; Clear screen
    ClearScreen(RGB(150,255,150))
    ; Display Mouse only when it's inside the screen
    If _iInside = #True : DisplayTransparentSprite(#SPR_MOUSE, _iPosX, _iPosY) : EndIf
    ; Check Left Button clicked
    If _iBut_left
      StartDrawing(ScreenOutput())
        DrawingMode(#PB_2DDrawing_Transparent)
        DrawText(_iPosX, _iPosY, "Button Left clicked")
      StopDrawing()
    EndIf
    ; 'Esc' ?
    If KeyboardPushed(#PB_Key_Escape)
      _iQuit = #True
    EndIf
  Until _iQuit
EndIf
Le release mouse ne fait qu'une raz des positions de la souris mais pas des boutons
Merci de votre aide :mrgreen:

Re: Soucis avec la souris et l'écran 'Screen'

Publié : lun. 06/déc./2010 20:55
par venom
si tu fait une détection MouseX() et MouseY() sous zéro et supérieure a zéro non ?







@++

Re: Soucis avec la souris et l'écran 'Screen'

Publié : lun. 06/déc./2010 21:26
par flaith
Merci de ta réponse, en fait la vérification n'est pas en cause, la fonction ReleaseMouse se fait correctement en entrant et en sortant de la zone, mon soucis reste que le bouton de la souris est toujours actif même en sortant de l'écran et en relâchant le bouton. Ce qui est étrange c'est qu'en sortant des limites du screen, il conserve l'état des boutons de la souris quand on y retourne, alors qu'il ne conserve pas les coordonnées.

Re: Soucis avec la souris et l'écran 'Screen'

Publié : lun. 06/déc./2010 21:50
par Backup
un flag bien placé aurai pu arranger l'affaire
mais ton code contient trop de conditions inutiles
pour que je puisse de façon sincère,et utile
regarder cette tuile, et plonger dans cette galere


:)

ps: je regarde Cyrano sur Arte :lol:

Re: Soucis avec la souris et l'écran 'Screen'

Publié : lun. 06/déc./2010 22:00
par flaith
Sur le fofo anglais, j'ai fais de plus amples recherches et j'ai trouvé un thread (http://www.purebasic.fr/english/viewtop ... =4&t=26561) qui explique que c'est probablement un soucis lié à DirectX :|

Re: Soucis avec la souris et l'écran 'Screen'

Publié : lun. 06/déc./2010 22:03
par flaith
Dobro a écrit :un flag bien placé aurai pu arranger l'affaire
mais ton code contient trop de conditions inutiles
pour que je puisse de façon sincère,et utile
regarder cette tuile, et plonger dans cette galere


:)

ps: je regarde Cyrano sur Arte :lol:
:D :wink:

Re: Soucis avec la souris et l'écran 'Screen'

Publié : mar. 07/déc./2010 10:30
par Backup
peut etre comme ça :
je force a relacher le bouton pour remettre mon flag a 0 :)

Code : Tout sélectionner

#MAIN_WIN       = 0
#SPR_MOUSE      = 1
#SCREEN_Width   = 280
#SCREEN_Height  = 192

_iInside = #True

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
  MessageRequester("Error", "Can't open the sprite system", 0)
  End
EndIf

If OpenWindow(#MAIN_WIN, 0, 0, #SCREEN_Width, #SCREEN_Height, "", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
  If OpenWindowedScreen(WindowID(#MAIN_WIN), 0, 0, #SCREEN_Width, #SCREEN_Height, 0, 0, 0)
    ; Ugly mouse
    CreateSprite(#SPR_MOUSE, 10, 10)
    StartDrawing(SpriteOutput(#SPR_MOUSE))
      Box(0,0,10,10,$FFFF00)
    StopDrawing()
  Else
    MessageRequester("Error", "Can't open windowed screen!", 0)
    End
  EndIf
  compteur=1 ;ajout par Dobro
  Repeat
    Repeat
      _iEventWindow = WaitWindowEvent(5)
      Select _iEventWindow
        Case #PB_Event_CloseWindow
          _iQuit = 1
        Case  #WM_LBUTTONUP ; force a relacher le bouton pour voir l'ecriture  ; Ajout par Dobro
          flag=0; Ajout par Dobro 
      EndSelect
    Until _iEventWindow = 0
    
    FlipBuffers()
    
    If _iInside = #True : ExamineMouse() : EndIf
    _iBut_left    = MouseButton(#PB_MouseButton_Left) 
    _iBut_middle  = MouseButton(#PB_MouseButton_Middle)
    _iBut_right   = MouseButton(#PB_MouseButton_Right)
    
    
    If _iInside
      ; Outside the screen ?
      If MouseX() >= #SCREEN_Width - 1 Or MouseY() >= #SCREEN_Height - 1 Or MouseX() < 1 Or MouseY() < 1
        ReleaseMouse(1)
        _iInside = #False
        flag=1 ; Ajout par Dobro
      EndIf
    Else
      _iMousePosX = WindowMouseX(#MAIN_WIN) : _iMousePosY = WindowMouseY(#MAIN_WIN)
      ; Inside the screen ?
      If _iMousePosX < #SCREEN_Width And _iMousePosX > 0 And _iMousePosY > 0 And _iMousePosY < #SCREEN_Height
        If compteur=1 ;ajout par Dobro
          compteur=0 ;ajout par Dobro
          flag=0 ;ajout par Dobro
        EndIf
        
        ReleaseMouse(0)
        MouseLocate(_iMousePosX, _iMousePosY)
        _iInside = #True
      EndIf
    EndIf
    
    ExamineKeyboard()
    _iPosX = MouseX() : _iPosY = MouseY()
    
    ; Clear screen
    ClearScreen(RGB(150,255,150))
    ; Display Mouse only when it's inside the screen
    If _iInside = #True : DisplayTransparentSprite(#SPR_MOUSE, _iPosX, _iPosY) : EndIf
    ; Check Left Button clicked
    If _iBut_left And flag=0 ; Ajout par Dobro
      StartDrawing(ScreenOutput())
        DrawingMode(#PB_2DDrawing_Transparent)
        DrawText(_iPosX, _iPosY, "Button Left clicked")
      StopDrawing()
    EndIf
    ; 'Esc' ?
    If KeyboardPushed(#PB_Key_Escape)
      _iQuit = #True
    EndIf
  Until _iQuit
EndIf

Re: Soucis avec la souris et l'écran 'Screen'

Publié : mar. 07/déc./2010 11:30
par flaith
Merci Dobro :)
Manque maintenant à ce que le 1er clic soit pris en compte :wink:

Re: Soucis avec la souris et l'écran 'Screen'

Publié : mar. 07/déc./2010 14:42
par Backup
flaith a écrit :Merci Dobro :)
Manque maintenant à ce que le 1er clic soit pris en compte :wink:
il suffit de conditionner le flag au depart
pour ça j'ai utiliser un autre Flag :lol: (compteur)
qui ne sert qu'au demarrage :D

t'es pris en Flag :)

code ci dessus modifé ;)

Re: Soucis avec la souris et l'écran 'Screen'

Publié : mar. 07/déc./2010 18:42
par flaith
Merci Dobro, ça marche dés le 1er clic, mais recommence en cliquant puis sort et revient puis clic, marche plus ;)
Je vais mis atteler plus tard, y'a plus urgent ;)
Merci encore Dobro :D