Problème avec une Procedure IsMouseOverGadget

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Problème avec une Procedure IsMouseOverGadget

Message par Lord Nelson »

Salut,

Je rencontre un soucis avec cette procédure
Elle fait appel à des API, je crois bien que le problème vient de là, elle foire la réactualisation d'affichage d'une image sur mon ScrollAreaGadget

Je peut pas posté d’exemple, trop long :wink:

Je voudrait simplement savoir s'il avais un équivalent sans API ?
Je voudrait savoir si la souris est sur un gadget :)

Il me semble avoir vue un équivalent un jour mais impossible de savoir ou c'est, c'est comme rechercher une aiguille dans une meule de foin :mrgreen:
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Problème avec une Procedure IsMouseOverGadget

Message par majikeyric »

En utilisant un CanvasGadget tu as accès à plein d'evènements:

Code : Tout sélectionner

  #PB_EventType_MouseEnter      : Le curseur de la souris est entré dans le gadget 
  #PB_EventType_MouseLeave      : Le curseur de la souris est sorti du gadget
  #PB_EventType_MouseMove       : Le curseur de la souris a bougé
  #PB_EventType_MouseWheel(*)   : La molette de la souris a bougé
  
  #PB_EventType_LeftButtonDown  : Le bouton gauche de la souris a été pressé
  #PB_EventType_LeftButtonUp    : Le bouton gauche de la souris a été relâché
  #PB_EventType_LeftClick       : Un clic avec le bouton gauche de la souris
  #PB_EventType_LeftDoubleClick : Un double-clic avec le bouton gauche de la souris
  #PB_EventType_RightButtonDown : Le bouton droit de la souris a été pressé
  #PB_EventType_RightButtonUp   : Le bouton droit de la souris a été relâché
  #PB_EventType_RightClick      : Un clic avec le bouton droit de la souris
  #PB_EventType_RightDoubleClick: Un double-clic avec le bouton droit de la souris
  #PB_EventType_MiddleButtonDown: Le bouton central de la souris a été pressé
  #PB_EventType_MiddleButtonUp  : Le bouton central de la souris a été relâché
  
  #PB_EventType_Focus           : Le gadget a obtenu le focus clavier
  #PB_EventType_LostFocus       : Le gadget a perdu le focus clavier
  #PB_EventType_KeyDown(*)      : Une touche clavier a été pressée 
  #PB_EventType_KeyUp(*)        : Une touche clavier a été relâchée 
  #PB_EventType_Input(*)        : Du texte a été entré dans le gadget 
ça peut peut être t'aider...

Tu passes un flag à 1 quand tu as un #PB_EventType_MouseEnter, et tu le repasses à 0 quand tu as un #PB_EventType_MouseLeave.
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Re: Problème avec une Procedure IsMouseOverGadget

Message par Patrick88 »

en utilisant WindowMouseX et ...Y, tu peux connaitre la position de la souris dans ta fenêtre, comme tu connais la position de tes gadgets et leur taille, pas bien difficile de trouver sur quel gadget tu te trouves

Pat
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Problème avec une Procedure IsMouseOverGadget

Message par Lord Nelson »

Hum...

Merci pour ses idées :)
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Problème avec une Procedure IsMouseOverGadget

Message par majikeyric »

J'ai pas testé mais ça doit marcher...

Code : Tout sélectionner

Procedure.b SourisSurvoleGadget(gadget.i)
	Protected.i SourisPosX, SourisPosY, GadgetPosX, GadgetPosY, GadgetLargeur, GadgetHauteur, FenetreActive
	
	FenetreActive=GetActiveWindow()
	GadgetPosX=GadgetX(gadget,#PB_Gadget_WindowCoordinate)
	GadgetPosY=GadgetY(gadget,#PB_Gadget_WindowCoordinate)
	GadgetLargeur=GadgetWidth(gadget)
	GadgetHauteur=GadgetHeight(gadget)
	SourisPosX=WindowMouseX(FenetreActive)
	SourisPosY=WindowMouseY(FenetreActive)
	
	If SourisPosX<GadgetPosX : ProcedureReturn #False : EndIf
	If SourisPosX>=(GadgetPosX+GadgetLargeur) : ProcedureReturn #False : EndIf
	If SourisPosY<GadgetPosY : ProcedureReturn #False : EndIf
	If SourisPosY>=(GadgetPosY+GadgetHauteur) : ProcedureReturn #False : EndIf
	
	ProcedureReturn #True
	
EndProcedure
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Problème avec une Procedure IsMouseOverGadget

Message par Lord Nelson »

Merci, ya ça aussi que j'ai fais:

Code : Tout sélectionner

Procedure.l IsMouseOverGadget(Fenetre, Gadget) 
  If (IsGadget(Gadget) And IsWindow(Fenetre))
    If (WindowMouseX(Fenetre) >= GadgetX(Gadget) And WindowMouseX(Fenetre) <= GadgetX(Gadget) + GadgetWidth(Gadget)) And WindowMouseY(Fenetre) >= GadgetY(Gadget) And WindowMouseY(Fenetre) <= GadgetY(Gadget) + GadgetHeight(Gadget)
      ProcedureReturn #True 
    Else 
      ProcedureReturn #False 
    EndIf 
  EndIf
EndProcedure 
Avatar de l’utilisateur
majikeyric
Messages : 602
Inscription : dim. 08/déc./2013 23:19
Contact :

Re: Problème avec une Procedure IsMouseOverGadget

Message par majikeyric »

Tu as une erreur de 1 pixel :lol:

If (WindowMouseX(Fenetre) >= GadgetX(Gadget) And WindowMouseX(Fenetre) <GadgetX(Gadget) + GadgetWidth(Gadget)) And WindowMouseY(Fenetre) >= GadgetY(Gadget) And WindowMouseY(Fenetre) < GadgetY(Gadget) + GadgetHeight(Gadget)
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Problème avec une Procedure IsMouseOverGadget

Message par MLD »

@ Bonjour Mr Nelson

Vous pouvez aussi faire comme ceci.

Code : Tout sélectionner

Procedure HookProc(nCode,wParam,lParam)
GetCursorPos_(@point.POINT) 
Handle = WindowFromPoint_(Point\X | (Point\Y << 32))
ParentHandle = GetParent_(Handle)
PbIdGadgetSurvoler = GetDlgCtrlID_(Handle) ; PbId du gadget survolé

Debug PbIdGadgetSurvoler

EndProcedure

OpenWindow(10,0,0,640, 300,"Mouse",#WS_CAPTION | #WS_SYSMENU | 1)
ScrollAreaGadget(6, 0,0,640,300,1000,1000)
ContainerGadget(5, 0, 0, 340, 300,#PB_Container_Single  )
TextGadget    (10,  10,  10, 100, 16, "ListIcon Standard", #PB_Text_Center) 
SetWindowLong_(GadgetID(10), #GWL_STYLE, GetWindowLong_(GadgetID(10), #GWL_STYLE)|#SS_NOTIFY)
ListIconGadget(1,  10,  35, 300, 70, "Column 1", 100) 
TextGadget    (2,  10, 125, 120, 16, "ListIcon with Checkbox", #PB_Text_Center) 
SetWindowLong_(GadgetID(2), #GWL_STYLE, GetWindowLong_(GadgetID(2), #GWL_STYLE)|#SS_NOTIFY)
ListIconGadget(3,  10, 150, 300, 70, "Column 1", 100, #PB_ListIcon_CheckBoxes)  
ButtonGadget  (4, 10, 230, 100, 20, "Add Gadget")
CloseGadgetList()
CloseGadgetList()

StickyWindow(10,1)

hhkLLMouse = SetWindowsHookEx_(#WH_MOUSE_LL,@HookProc(),GetModuleHandle_(0),0)

Repeat
   EventID = WaitWindowEvent()
Until EventID = #PB_Event_CloseWindow 

UnhookWindowsHookEx_(hhkLLMouse)

Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Problème avec une Procedure IsMouseOverGadget

Message par Lord Nelson »

@Bonjour Mr MLD

Merci pour votre code :)

@majikeyric
C'est grave docteur :mrgreen:
Répondre