Usercontrol et les Messages WM_MOUSEHOVER et WM_MOUSELEAVE
Mew27
Messages postés44Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention23 février 2008
-
23 janv. 2007 à 06:17
adalgur
Messages postés2Date d'inscriptionlundi 21 juin 2004StatutMembreDernière intervention26 avril 2007
-
26 avril 2007 à 11:13
Salut, j'ai un activex qui sert de Label, dont je voudrais ajouter le MouseHover et MouseLeave, j'ai trouvé quelques sources comment sous-classer, mais dans ma sub qui capte les messages je ne reçoit jamais les messages MouseLeave et MouseHover, pourtant j'ai bien applé l'API TrackMouseEvent
A moins que ces messages ne soient jamais passé a un usercontrol ?
Quelqu'un aurait-il une solution ? :)
Voici le code de mon label:
Option Explicit
'Constant for Windows Message used in sample.
Private Const WM_MOUSEHOVER = &H2A1
Private Const WM_MOUSELEAVE = &H2A3
Public Event MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
Public Event MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
Public Event MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
Public Event MouseLeave()
Public Event MouseHover()
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Declare Function DrawText Lib "user32" Alias "DrawTextA" _
(ByVal hDC As Long, ByVal lpStr As String, ByVal nCount As Long, _
lpRect As RECT, ByVal wFormat As Long) As Long
Private m_Caption As String
Private m_WordWrap As Integer
Private m_Alignment As ATLblAlignmentConst
Public iHeight As Integer
Private Sub UserControl_Click()
RaiseEvent Click
End Sub
Private Sub UserControl_DblClick()
RaiseEvent DblClick
End Sub
'Private Sub UserControl_HitTest(x As Single, y As Single, HitResult As Integer)
' c'était pour pouvoir le rendre transparent, mais pour sous-classer on doit avoir
un hwnd alors le windowless doit être a false donc pas de transparence.
' If HitResult = vbHitResultOutside Then
'
' HitResult = vbHitResultHit
'
' End If
'
'End Sub
Private Sub UserControl_InitProperties()
On Error Resume Next
m_Caption = Extender.Name
Set UserControl.Font = Ambient.Font
m_Alignment = m_def_Alignment
End Sub
Private Sub UserControl_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
RaiseEvent MouseDown(Button, Shift, x, y)
End Sub
Private Sub UserControl_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
RaiseEvent MouseMove(Button, Shift, x, y)
End Sub
Private Sub UserControl_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
RaiseEvent MouseUp(Button, Shift, x, y)
End Sub
Private Sub UserControl_Paint()
RePaint
End Sub
Public Property Get Caption() As String
Caption = m_Caption
End Property
Public Property Let Caption(ByVal New_Caption As String)
Private Function ISubClasser_ProcessMessages(ByVal hWnd As Long, ByVal uMsg As MessageConstants, ByVal wParam As Long, ByVal lParam As Long, veBehavior As MsgBehaviorConstants) As Long
If uMsg = WM_MOUSEHOVER then
debug.pring "mouseover"
elseif uMsg = WM_MOUSELEAVE then
debug.print "mouseleave"
End If
End Function
Et quand je lance l'application j'ai tout de suite "mouseleave" qui apparait une seule fois seulement.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Mew27
Messages postés44Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention23 février 2008 24 janv. 2007 à 12:38
Ok :)
Mais quand j'essaie de démarrer mon projet j'ai l'erreur suivante:
Private Enum Type and Enum Type defined in standard modules or private class cannot be used in public project as parameters or return type for public procedures as public data members or as field or public user defined types
Il fait ça sur Public Function ProcessMessages(ByVal hWnd As Long, ByVal uMsg As MessageConstants, ByVal wParam As Long, ByVal lParam As Long, veBehavior As MsgBehaviorConstants) As Long
Dans la class ISubclasser, j'ai essayé de le mettre à Multiuse et j'ai mit les enum public dans le module ModSubclasser, mais j'ai toujours cette erreur.
Mew27
Messages postés44Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention23 février 2008 24 janv. 2007 à 14:14
Bonjour, là j'ai mit les enum public du modules modSubclasser et je les ait placés dans le usercontrol au lieu du module, maintenant j'ai une erreur: Dépendances circulaires des modules.
Mew27
Messages postés44Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention23 février 2008 24 janv. 2007 à 23:18
Ok, mais c'était déjà le cas, mais ça ne fonctionnait pas plus. Le module modSubclasser tout les enums dedans sont public et dans la classe ISubclass la fonction est public aussi et ça donne toujours l'erreur:
Private Enum Type and Enum Type defined in standard modules or private class cannot be used in public project as parameters or return type for public procedures as public data members or as field or public user defined types
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 25 janv. 2007 à 00:09
je ne vois pas trop où es ton soucis....
j'ai repris mon projet du module SubClasser,
j'aii ajouté un usercontrol, et j'y ai mis :
Option Explicit
Implements ISubClasser
Private Const SC_MINIMIZE As Long = &HF020&
Public Enum TrackMouseEventFlags
TME_HOVER = &H1
TME_LEAVE = &H2
TME_NONCLIENT = &H10
TME_QUERY = &H40000000
TME_CANCEL = &H80000000
End Enum
Private Type TRACKMOUSESTRUCT
cbSize As Long
dwFlags As TrackMouseEventFlags '\\ TrackMouseEvents
hwndTrack As Long '\\ Target window
dwHoverTime As Long '\\ Mouse hover timeout in milliseconds
End Type
Private Declare Function TrackMouseEvent Lib "user32" (lpTrackMouseStruct As TRACKMOUSESTRUCT) As Long
Private mousestruct As TRACKMOUSESTRUCT
Public Sub UserControl_Initialize()
mousestruct.cbSize = Len(mousestruct)
mousestruct.dwFlags = TME_HOVER Or TME_LEAVE
mousestruct.hwndTrack = UserControl.hWnd
mousestruct.dwHoverTime = 1000
ModSubClasser.StartGenericCallBack Me, UserControl.hWnd
End Sub
Private Function ISubClasser_ProcessMessages(ByVal hWnd As Long, ByVal uMsg As MessageConstants, ByVal wParam As Long, ByVal lParam As Long, veBehavior As MsgBehaviorConstants) As Long
Select Case uMsg
Case WM_MOUSEHOVER
Debug.Print Timer, "mouseover"
Case WM_MOUSELEAVE
Debug.Print Timer, "mouseleave"
Case wm_mousemove
Call TrackMouseEvent(mousestruct)
End Select
End Function
adalgur
Messages postés2Date d'inscriptionlundi 21 juin 2004StatutMembreDernière intervention26 avril 2007 26 avril 2007 à 11:13
Il y a un truc plus simple pour MouseEnter et MouseLeave (je l'utilise toujours) sans subclasser
'Private Declare Function GetCapture Lib "user32" () As Long
'Private Declare Function ReleaseCapture Lib "user32" () As Long
'Private Declare Function SetCapture Lib "user32" (ByVal hwnd As Long) As Long
'Public Event MouseEnter()
'Public Event MouseLeave()
'Private gbMouseIn as boolean
Private Sub UserControl_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 0 Then
If GetCapture() <> UserControl.hwnd Then ' si la fenetre qui a la capture n'est pas le controle
SetCapture UserControl.hwnd ' alors la lui donner, de façon à garder le message
RaiseEvent MouseEnter ' mousemove meme en dehors du controle
gbMouseIn = True
'redessiner si besoin en f(gbMouseIn)
ElseIf x < 0 Or Y < 0 Or X > UserControl.ScaleWidth Or Y > UserControl.ScaleHeight) Then
ReleaseCapture ' on sort des limites
' on rend la main aux autres
RaiseEvent MouseLeave
gbMouseIn = False
'redessiner si besoin en f(gbMouseIn)
End If
End Sub
'rem: si Button=1 un controle garde toujours la capture