OVH Cloud OVH Cloud

api CreatePopupMenu

2 réponses
Avatar
Raymond Fournier
Bonjour a tous,
Je voudrais créer un popup menu sur un MSFlexgrid. J'ai trouvé une
API qui est "CreatePopupMenu" avec un exemple sur le site allapi.net.

Dans l'exemple on montre comment créé le popup mais pas comment détecter
sur quelle menu on a cliqué. Comme les API c'est assez nouveau pour moi,
est ce que quelqu'un pourrait m'aider.

Merci d'avance. Raymond Fournier

2 réponses

Avatar
François Picalausa
Hello,

Ne peux-tu pas créer ton popup menu avec les méthodes traditionnelles de VB?
1°/ Créer un nouvel élément de menu avec la propriété Visible = False. (Je
le nommerai pour cet exemple mnuPopup)
2°Lors du click, afficher le menu:
Private Sub MSFlexGrid1_MouseDown(Button As Integer, Shift As Integer, x As
Single, y As Single)
'On affiche le menu ssi il s'agit d'un click droit
If Button = vbRightButton Then
Me.PopupMenu mnuPopup
End If
End Sub

Sinon, par API, lors de l'affichage du menu par TrackPopupMenu, tu dois
avoir préalablement sousclassé la fenêtre parente (argument ByVal hwnd As
Long).
Ta procédure de sousclassement devrait avoir a peu près cette tête là:
Dim ItemIndex As Integer
Dim Flags As Integer


Select Case Msg
Case WM_MENUSELECT
ItemIndex = LOWORD(wParam)
Flags = HIWORD(wParam)

If Flags = &HFFFF And lParam = 0 Then
'Le menu vient d'être fermé
ElseIf lParam = mhMenu Then
'L'item du menu ayant l'index ItemIndex vient d'être
sélectionné
End If
Case WM_COMMAND
If lParam = 0 And HIWORD(wParam) = 0 Then
'On a clické sur le menu portant l'index LOWORD(wParam)
End If

LOWORD et HIWORD sont définit comme ceci:

Public Function LOWORD(dwValue As Long) As Integer
If dwValue And &H8000& Then
LOWORD = dwValue Or &HFFFF0000
Else
LOWORD = dwValue And &HFFFF&
End If
End Function

Public Function HIWORD(dwValue As Long) As Integer
HIWORD = (dwValue And &HFFFF0000) &H10000
End Function

Pour différencier les messages de menus "normaux" de la form de ton menu
personnalisé, tu peux créer une nouvelle classe de fenêtre de messages et
employer celle ci au lieu de la form.

--
François Picalausa

"Raymond Fournier" <duracelle(Enlever-ceci)@sympatico.ca> a écrit dans
le message de news:
Bonjour a tous,
Je voudrais créer un popup menu sur un MSFlexgrid. J'ai trouvé une
API qui est "CreatePopupMenu" avec un exemple sur le site allapi.net.

Dans l'exemple on montre comment créé le popup mais pas comment
détecter sur quelle menu on a cliqué. Comme les API c'est assez
nouveau pour moi, est ce que quelqu'un pourrait m'aider.


Avatar
Raymond Fournier
"François Picalausa" wrote in
news:O#:

Hello,

Ne peux-tu pas créer ton popup menu avec les méthodes traditionnelles
de VB? 1°/ Créer un nouvel élément de menu avec la propriété Visible > False. (Je le nommerai pour cet exemple mnuPopup)
2°Lors du click, afficher le menu:
Private Sub MSFlexGrid1_MouseDown(Button As Integer, Shift As Integer,
x As Single, y As Single)
'On affiche le menu ssi il s'agit d'un click droit
If Button = vbRightButton Then
Me.PopupMenu mnuPopup
End If
End Sub

Sinon, par API, lors de l'affichage du menu par TrackPopupMenu, tu
dois avoir préalablement sousclassé la fenêtre parente (argument ByVal
hwnd As Long).
Ta procédure de sousclassement devrait avoir a peu près cette tête là:
Dim ItemIndex As Integer
Dim Flags As Integer


Select Case Msg
Case WM_MENUSELECT
ItemIndex = LOWORD(wParam)
Flags = HIWORD(wParam)

If Flags = &HFFFF And lParam = 0 Then
'Le menu vient d'être fermé
ElseIf lParam = mhMenu Then
'L'item du menu ayant l'index ItemIndex vient
d'être
sélectionné
End If
Case WM_COMMAND
If lParam = 0 And HIWORD(wParam) = 0 Then
'On a clické sur le menu portant l'index
LOWORD(wParam)
End If

LOWORD et HIWORD sont définit comme ceci:

Public Function LOWORD(dwValue As Long) As Integer
If dwValue And &H8000& Then
LOWORD = dwValue Or &HFFFF0000
Else
LOWORD = dwValue And &HFFFF&
End If
End Function

Public Function HIWORD(dwValue As Long) As Integer
HIWORD = (dwValue And &HFFFF0000) &H10000
End Function

Pour différencier les messages de menus "normaux" de la form de ton
menu personnalisé, tu peux créer une nouvelle classe de fenêtre de
messages et employer celle ci au lieu de la form.




Merci beaucoup François

Je crois que je vais tenter de le faire avec le sous classement pour
apprendre comment sa fonctionne.

Raymond Fournier