Gadget, focus, clavier, souris et shortcut

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Gadget, focus, clavier, souris et shortcut

Message par blendman »

salut

Voilà, dans mon éditeur de scène 3D, j'ai un screen quia ffiche un world 3D, et j'ai des gadgets.
Mais certains paramètres peuvent interférer sur les 2.
Par exemple :
- la molette de la souris permet de zoomer/dézoomer (rapprocher la caméra ou l'éloigner).
- lorsque je suis sur un comboboxgadget() et qu'ensuite, je zoome ça change l'état de mon comboboxgadget().

Comment puis empêcher cela ?
J'ai fait un système qui ne le prend pas en compte si je suis sur la vue 3D, mais l'état du gadget précédemment utilisé change quand même.

Faut-il utiliser le focus et eventtype() sur tous les gadget qui posent ce problème (aie), ou existe-t-il un truc qui ferait de la magie :D ?
Merci.
Dernière modification par blendman le jeu. 03/mai/2012 17:58, modifié 1 fois.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: gadget, focus, clavier, souris

Message par Mesa »

A priori oui, il faut passer par le focus sinon on peut utiliser une fonction qui vérifie quel est le gadget survolé et agir en conséquence.

Le code risque d'être aussi long que celui qui utiliserait le focus.

Il faut faire des recherches sur les forums avec "roll over".
http://www.purebasic.fr/english/viewtop ... 12&t=49073
http://pages.videotron.com/gsaumure/fil ... get_V4.zip

une macro interessante ici http://www.purebasic.fr/french/viewtopi ... =6&t=11559

ou un code tout simple de je ne sais plus qui (désolé)

Code : Tout sélectionner

Enumeration
  #Windows1
  #Bar
  #Gadget1
  #Gadget2
EndEnumeration
;
Macro GadgetHoverCheck(x, y, Gadget)
   (((Not x<GadgetX(Gadget)) & (Not y<GadgetY(Gadget))) & (Not x>=(GadgetX(Gadget)+GadgetWidth(Gadget))) & (Not y>=(GadgetY(Gadget)+GadgetHeight(gadget))))
EndMacro
;
If OpenWindow(#Windows1, 0, 0, 200, 200, "Rectangles", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CreateStatusBar(#Bar,WindowID(#Windows1))
    AddStatusBarField(60)
    AddStatusBarField(60)
    AddStatusBarField(80)
   
    ButtonGadget(#Gadget1,20,20,100,30," Le bouton ")
   
    ButtonGadget(#Gadget2,20,80,100,30,"Autre bouton")

   Repeat
      
        Event = WaitWindowEvent()
      xp=WindowMouseX(0):yp=WindowMouseY(0)
      
      StatusBarText(#Bar,0,"X= "+Str(xp),#PB_StatusBar_Raised)
        StatusBarText(#Bar,1,"Y= "+Str(yp),#PB_StatusBar_Raised)
     
      If GadgetHoverCheck(xp,yp , #Gadget1) Or GadgetHoverCheck(xp,yp , #Gadget2)
        Debug "On survol un gadget"
        StatusBarText(#Bar,2,"IN Gadegt",#PB_StatusBar_Raised)
      Else 
        StatusBarText(#Bar,2,"OUT Gadegt",#PB_StatusBar_Raised)
      EndIf
      
      Select Event
         Case 0
      
      EndSelect
      
   Until Event = #PB_Event_CloseWindow
EndIf
Mesa.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: gadget, focus, clavier, souris

Message par blendman »

merci pour le code.

En fait, Ombre m'a suggéré un SetActiveGadget() sur un gadget n'étant pas touché par un mousewheel() par exemple.
Je l'ai placé dans mon code après les events sur les gadgets que j'ai séparé du reste.

En gros, ma boucle principale ressemble à ça :

Code : Tout sélectionner

Repeat
  
  Repeat
    Event = WindowEvent()
    
    Select Event 
      Case  #PB_Event_Menu
      Case #PB_Event_Gadget
      Case #PB_Event_CloseWindow
        quit = 1
    EndSelect
    
  Until event =0
  
  ; autres events, genre : souris, clavier dans la vue 3D.
   If examinemouse()
       SetActiveGadget(#Gadget_ShowCible)
   Endif
   RenderWorld()     
   FlipBuffers()

Until quit = 1
Et ça marche très bien pour la plupart des cas :D.

Merci.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: gadget, focus, clavier, souris

Message par blendman »

Tiens, j'ai remarqué un truc :
savez-vous comment on fait pour pouvoir écrire sur un stringgadget() si on a un keyboardshortcut sur certaines lettres ?

Par exemple, j'ai des keyboardshortcut() avec comme touche H, A, Z, etc..
Et du coup, dans mon string gadget impossible d'avoir ces touches qui marchent.

une idée de la boulette que j'ai faite ou de l'astuce ?

Code d'essai :

Code : Tout sélectionner

Enumeration
  #Win_0
EndEnumeration

flag = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_WindowCentered
If OpenWindow(#Win_0, 0,0,800, 600, "Shorcut & String gadget", flag)
  
  CreateMenu(0,WindowID(#win_0))
  MenuTitle("File")
  MenuItem(0,"test")
  
  AddKeyboardShortcut(0,#PB_Shortcut_B,0)
  
  StringGadget(0,10,10,120,20,"")
EndIf


Repeat
  EventID  =WaitWindowEvent()
  
  Select EventID 
    Case #PB_Event_Menu
      Select EventMenu()
        Case 0
          If focus = 0
            MessageRequester("info","just to test the menu")
          EndIf
          
      EndSelect
      
    Case #PB_Event_CloseWindow
      quit=1
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 0
          Select EventType()
            Case #PB_EventType_Focus
              focus = 1
              
            Case #PB_EventType_LostFocus
              focus = 0
              
            Case #PB_EventType_Change
              Debug GetGadgetText(0) ; please try to type the B key !
              
          EndSelect
          
      EndSelect
            
  EndSelect
  
Until quit
End
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Gadget, focus, clavier, souris et shortcut

Message par Backup »

c'est pour cette raison , que la plupart du temps un raccourcis se code avec Ctrl+lettre ou ALT+lettre :)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Gadget, focus, clavier, souris et shortcut

Message par Backup »

ceci fonctionne , si tu commence par ecrire une autre lettre que b :)

ps : prends l'habitude d'utiliser des constantes même dans tes tests , parce que tout avec '0' c'est pas évident pour trouver les éventuels bug ;)

Code : Tout sélectionner

Enumeration
	#Win_0
	#menu
	#gadget
	#event
EndEnumeration

flag = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_WindowCentered
If OpenWindow(#Win_0, 0,0,800, 600, "Shorcut & String gadget", flag)
	
	CreateMenu(#menu,WindowID(#win_0))
	MenuTitle("File")
	MenuItem(#menu,"test")
	
	AddKeyboardShortcut(#Win_0,#PB_Shortcut_Control|#PB_Shortcut_B,#event)
	
	StringGadget(#gadget,10,10,120,20,"")
EndIf


Repeat
	EventID  =WaitWindowEvent()
	
	Select EventID
	
	case #WM_LBUTTONUP 
	AddKeyboardShortcut(#Win_0,#PB_Shortcut_B,0) ; on remet le raccourci
		Case #PB_Event_Menu
		Select EventMenu()
			Case #event			
			
				MessageRequester("info","just to test the menu")				
				
		EndSelect
		
		
		
		Case #PB_Event_Gadget
		Select EventGadget()
			Case #gadget		
			
			RemoveKeyboardShortcut(#Win_0,#PB_Shortcut_B )
			
			Debug GetGadgetText(#gadget) ; please try to type the B key !
			;
			
		EndSelect
		Case #PB_Event_CloseWindow
		quit=1
	EndSelect
	
Until quit
End; EPB



j'utilise le bouton gauche qui se releve pour reactualiser le raccourci désactivé
mais en fait j'aurai du utiliser le click ( appuis ) gauche plutot
comme ça on click sur le gadget , qui desactivera le raccourci au premier ecrit
et pour reactualiser le raccourci , il suffirai de cliquer ailleurs sur la fenetre


comme ça :

Code : Tout sélectionner

Enumeration
	#Win_0
	#menu
	#gadget
	#event
EndEnumeration

flag = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_WindowCentered
If OpenWindow(#Win_0, 0,0,800, 600, "Shorcut & String gadget", flag)
	
	CreateMenu(#menu,WindowID(#win_0))
	MenuTitle("File")
	MenuItem(#menu,"test")
	
	AddKeyboardShortcut(#Win_0,#PB_Shortcut_Control|#PB_Shortcut_B,#event)
	
	StringGadget(#gadget,10,10,120,20,"")
EndIf


Repeat
	EventID  =WaitWindowEvent()
	
	Select EventID
	
	case #WM_LBUTTONDown
	AddKeyboardShortcut(#Win_0,#PB_Shortcut_B,0) ; on remet le raccourci
		Case #PB_Event_Menu
		Select EventMenu()
			Case #event			
			
				MessageRequester("info","just to test the menu")				
				
		EndSelect
		
		
		
		Case #PB_Event_Gadget
		Select EventGadget()
			Case #gadget		
			
			RemoveKeyboardShortcut(#Win_0,#PB_Shortcut_B )
			
			Debug GetGadgetText(#gadget) ; please try to type the B key !
			;
			
		EndSelect
		Case #PB_Event_CloseWindow
		quit=1
	EndSelect
	
Until quit
End; EPB



bien sur avec des gadgets suplementaire, aurai facilité le truc

tu peux reserver un bouton pour reactualiser le raccourci ,
comme tu l'a compris , je jongle avec :

Code : Tout sélectionner

RemoveKeyboardShortcut(#Win_0,#PB_Shortcut_B ) ; on retire le raccourci
AddKeyboardShortcut(#Win_0,#PB_Shortcut_B,0) ; on remet le raccourci
l'utilisation d'un timer est possible aussi :)
tu lance le timer lorsque tu desactive le raccourcis , et tu compte un certain temps avant de le réactualiser :)
ça sert a ça aussi les Timers :)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Gadget, focus, clavier, souris et shortcut

Message par Backup »

exemple avec un timer :

Code : Tout sélectionner

Enumeration
	#Win_0
	#menu
	#gadget
	#timer
EndEnumeration
global flag_timer=0

flag = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_WindowCentered
If OpenWindow(#Win_0, 0,0,800, 600, "Shorcut & String gadget", flag)
	
	CreateMenu(#menu,WindowID(#win_0))
	MenuTitle("File")
	MenuItem(#menu,"test")
	
	AddKeyboardShortcut(#Win_0,#PB_Shortcut_B,#menu)
	
	StringGadget(#gadget,10,10,120,20,"")
EndIf


Repeat
	EventID  =WaitWindowEvent()
	
	Select EventID
		; *************************************
		case #PB_Event_Timer 
		if EventTimer() = #timer
			AddKeyboardShortcut(#Win_0,#PB_Shortcut_B,0) ; on remet le raccourci
			RemoveWindowTimer(#Win_0, #timer) ; on arrete le timer 
			
		endif
		; *************************************
		Case #PB_Event_Menu
		
		Select EventMenu()
			Case #menu
			MessageRequester("info","just to test the menu")
		EndSelect
		; *************************************
		Case #PB_Event_Gadget
		Select EventGadget()
			Case #gadget 
			
			AddWindowTimer(#Win_0, #timer, 5000) ; demarre le Timer 
			RemoveKeyboardShortcut(#Win_0,#PB_Shortcut_B ) ; vire le raccourcis
			Debug GetGadgetText(#gadget) ; please try to type the B key !
			
		EndSelect
		
		Case #PB_Event_CloseWindow
		quit=1
	EndSelect
	
Until quit
End





; EPB

la tu as 5 secondes pour ecrire avant la réactualisation du raccourcis
mais si tu clique dans le Gadget et que tu utilise par exemple backspace , tu pourra a nouveau avoir 5 secondes pour ecrire ton b :)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Gadget, focus, clavier, souris et shortcut

Message par Backup »

j'ai corrigé une confusion de ma part dans le dernier code :lol:

ç'est mieux maintenant :)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Gadget, focus, clavier, souris et shortcut

Message par blendman »

Merci Dobro pour tous ces exemples ;).

Je vais essayer de modifier certains raccourcis en ctrl ou alt + le raccourcis.
Et sinon, j'utiliserai la méthode RemoveKeyboardShortcut().
C'est dommage qu'il n'y ait pas de priorité du focus du gadget sur les raccourcis je trouve ^^.

Le timer je connaissais le principe, c'est dommage d'ailleurs qu'il n'y ait pas d'équivalent en fullscreen pour les jeux, ça peut être bien utile (moi, je fais mes timers à la main du coup ^^).

Encore merci pour tes réponses :)D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Gadget, focus, clavier, souris et shortcut

Message par Backup »

blendman a écrit : Le timer je connaissais le principe, c'est dommage d'ailleurs qu'il n'y ait pas d'équivalent en fullscreen pour les jeux, ça peut être bien utile (moi, je fais mes timers à la main du coup ^^).

Encore merci pour tes réponses :)D
les timers, ça marche si tu utilise une Fenetre sans Bordure Plein ecran ...
franchement , je ne vois pas de difference avec le "Fullscreen" Screen

de toute façon, a ce que j'ai compris, ça reste une fenetre ( le Screen )
sous windows, TOUT est fenetre :)
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Gadget, focus, clavier, souris et shortcut

Message par graph100 »

Dobro a écrit :les timers, ça marche si tu utilise une Fenetre sans Bordure Plein ecran ...
franchement , je ne vois pas de difference avec le "Fullscreen" Screen

de toute façon, a ce que j'ai compris, ça reste une fenetre ( le Screen )
sous windows, TOUT est fenetre :)
La différence principale reste la définition de ton écran ^^.
Impossible de faire du 800x600 avec une fenêtre sans bordure plein écran.
Alors avec un pc comme le mien qui a un 1920x1200, va y faire un truc qui manipule des pixels sans lag ou autre :?
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Gadget, focus, clavier, souris et shortcut

Message par Backup »

graph100 a écrit : La différence principale reste la définition de ton écran ^^.
Impossible de faire du 800x600 avec une fenêtre sans bordure plein écran.
Alors avec un pc comme le mien qui a un 1920x1200, va y faire un truc qui manipule des pixels sans lag ou autre :?
tsss! tsss! ne dit pas impossible, sans savoir !! :lol:

cet exemple utilise un timer dans un windowed screen Plein ecran ;
je force la resolution en 800x600 ( en ayant pris soin de noter la resolution avant )

je met le pseudo jeux en route ( une balle qui est tiré toutes les secondes )

lorsque tu appuis sur ESC , le prg remet la resolution qui etait au debut

ni vu , ni connu , je t'embrouille :)

Code : Tout sélectionner


Enumeration
	#Window
	#timer    
	#ball
EndEnumeration

Structure ball
	x.l
	y.l
	sensy.l
EndStructure
Declare  SetResolution(RezX, RezY, NbCoul, Frequence, Memoriser) ; si SetResolution=2 la résolution est identique à l'actuelle, si 1 erreur lors de la recherche des infos, sinon regarder #DISP_CHANG_...




ExamineDesktops()
global x_ecran1=DesktopWidth(0) ; on note la resolution actuelle
global  y_ecran1=DesktopHeight(0) ; on note la resolution actuelle

SetResolution(800,600,32,60,1)  ; on force la resolution en 800x600 
ExamineDesktops()
global x_ecran=DesktopWidth(0) ; recupe la resolution changé pour le jeux
global y_ecran=DesktopHeight(0); recupe la resolution changé pour le jeux

Dim ball.ball(1)
ball(1)\x =x_ecran/2
ball(1)\y=y_ecran
ball(1)\sensy.l=-32 ; sens de deplacement de la balle ( monte )
Global gachette.b,compteur_de_tir


InitSprite():InitKeyboard()




If OpenWindow(#Window, 0, 0, x_ecran, y_ecran,"", #PB_Window_BorderLess     )
	OpenWindowedScreen(WindowID(#Window),0,0,x_ecran, y_ecran,1,0,0)
	StickyWindow(#window,1)
	; ********** creation du sprite ********************
	CreateSprite(#ball,32,32)
	StartDrawing(SpriteOutput(#ball))
		Circle(16,16,16,RGB(255,255,0))
	StopDrawing()
	; **********************************************
	AddWindowTimer(#Window, #timer, 1000)
	SetFrameRate(60)
	
	; *********** boucle principale ******************************************
	Repeat
		
		ExamineKeyboard()
		If compteur_de_tir>50
			beep_(440,100)
			gachette.b=0 ; on a arreté le tir parceque le compteur est superieur a 10
			; mais le timer tourne toujours ..... ;o)
		EndIf
		
		If gachette.b=1   ; le timer a declenché la gachette          
			ball(1)\y=ball(1)\y+ball(1)\sensy.l
			If  ball(1)\y<0
				ball(1)\y=y_ecran
				gachette.b=0 ; la balle est arrivé en haut on la remet a sa place, et la gachette reviens a sa place
			EndIf
			Else
			ball(1)\y=y_ecran
			gachette.b=0 ; on remet la gachette a zero pour le prochain timer  
		EndIf
		
		; ******************* les events *****************************************
		
		select waitWindowEvent(20)  ; le 20 permet de rendre la main au system , sinon il faut creer un evenement pour faire bouger la balle ( en bougeant la souris par ex )
			case #PB_Event_Timer  ; un evenement timer a lieu
			if  EventTimer() = #timer; il s'agit de notre timer (on peut bien sur en avoir plusieurs )
				;Debug "--------------------1 seconde"
				; Ici, le code à executer toutes les secondes
				compteur_de_tir=compteur_de_tir+1 ; on incrmente le nombre de tir , pour pouvoir l'arreter
				gachette.b=1
			endif
		EndSelect
		
		;  CallDebugger
		DisplaySprite(#ball,ball(1)\x,ball(1)\y)
		FlipBuffers()
		ClearScreen(RGB(0,0,0))
		
	Until KeyboardPushed(#PB_Key_Escape) Or Event=#PB_Event_CloseWindow
	; **********************************************************************
EndIf
SetResolution(x_ecran1,y_ecran1,32,60,1)  ; on remet la resolution du debut !!



Procedure SetResolution(RezX, RezY, NbCoul, Frequence, Memoriser)
 ; si SetResolution=2 la résolution est identique à l'actuelle, si 1 erreur lors de la recherche des infos, sinon regarder #DISP_CHANG_...	
	dm.DEVMODE
	If EnumDisplaySettings_ (0, -1, @dm)
		If RezX = dm\dmPelsWidth And RezY = dm\dmPelsHeight And NbCoul = dm\dmBitsPerPel And Frequence=dm\dmDisplayFrequency : ProcedureReturn 2 : EndIf
		dmEcran.DEVMODE
		dmEcran\dmSize = SizeOf (dmEcran)
		dmEcran\dmFields = #DM_PELSWIDTH|#DM_PELSHEIGHT|#DM_BITSPERPEL|#DM_DISPLAYFREQUENCY
		dmEcran\dmPelsWidth = RezX
		dmEcran\dmPelsHeight = RezY
		dmEcran\dmBitsPerPel = NbCoul
		dmEcran\dmDisplayFrequency = Frequence
		If Memoriser=1 : Memoriser= #CDS_UPDATEREGISTRY Or #CDS_NORESET : Else : Memoriser= #CDS_FULLSCREEN : EndIf
		dmx = ChangeDisplaySettings_ (@dmEcran,Memoriser)
		ProcedureReturn dmx
		Else
		ProcedureReturn 1
	EndIf
EndProcedure
; EPB


Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Gadget, focus, clavier, souris et shortcut

Message par graph100 »

et tes icônes ils bougent pas ? (j'ai pas testé car je veux pas foutre le boxon sur mon bureau)
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Gadget, focus, clavier, souris et shortcut

Message par Backup »

graph100 a écrit :et tes icônes ils bougent pas ? (j'ai pas testé car je veux pas foutre le boxon sur mon bureau)

1- je n'ai pas d'icones sur mon bureau !! j'utilise l'un de mes prg "Starter" qui m’évite de les avoir a l’écran ( ils sont dans Starter )

2- je les aient fait réapparaitre sur mon bureau Seven pour voir , ben non rien ne bouge ! :)
ils restent tous a leur place !!

je pense que ça ne redimensionne pas le Bureau , mais juste le prg en cours .. ;)

tu peux tester sans soucis :)
Répondre