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

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

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

Message 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:
Avatar de l’utilisateur
venom
Messages : 3137
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

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

Message par venom »

si tu fait une détection MouseX() et MouseY() sous zéro et supérieure a zéro non ?







@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

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

Message 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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

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

Message 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:
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

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

Message 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 :|
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

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

Message 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:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

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

Message 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
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

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

Message par flaith »

Merci Dobro :)
Manque maintenant à ce que le 1er clic soit pris en compte :wink:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

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

Message 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é ;)
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

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

Message 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
Répondre