'déclaration des types privés à l'objet Private Type MENUITEMINFO cbSize As Long fMask As Long fType As Long fState As Long wID As Long hSubMenu As Long hbmpChecked As Long hbmpUnchecked As Long dwItemData As Long dwTypeData As String cch As Long End Type Private Type POINTAPI x As Long y As Long End Type 'déclaration des fonctions API privées à l'objet Private Declare Function CreatePopupMenu Lib "user32" () As Long Private Declare Function InsertMenuItem Lib "user32.dll" Alias "InsertMenuItemA" (ByVal hMenu As Long, ByVal uItem As Long, ByVal fByPosition As Long, lpmii As MENUITEMINFO) As Long Private Declare Function TrackPopupMenuEx Lib "user32" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal x As Long, ByVal y As Long, ByVal hWnd As Long, ByVal lptpm As Any) As Long Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Private Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long 'déclaration des constantes API privées à l'objet Private Const MIIM_ID = &H2 Private Const MIIM_TYPE = &H10 Private Const MIIM_STATE = &H1 Private Const MIIM_SUBMENU = &H4 Private Const TPM_LEFTALIGN = &H0& Private Const TPM_RETURNCMD = &H100& Private Const TPM_RIGHTBUTTON = &H2& Private Const MFT_RADIOCHECK = &H200& Private Const MFT_CHECKED = &H8& Private Const MFT_STRING = &H0 Private Const MFS_ENABLED = &H0 'déclaration des variables privées à l'objet Private LNG_Handle_Menu As Long 'stocke le handle du menu Private LNG_Handle_Sous_Menu() As Long 'stocke les handles des sous-menus de flèches Private LNG_Handle_Sous_Sous_Menu() As Long 'stocke les handles des sous-sous-menus de volées Private BOL_Affiche_Fleche() As Boolean 'stocke l'état d'affichage des flèches
Public Property Get Affiche_Fleche(ByVal INT_Index_Fleche As Integer, ByVal INT_Index_Volee As Integer) As Boolean '============================================================= 'permet de définir l'état d'affichage d'une flèche ' 'renvoie l'état d'affichage de la flèche spécifiée '============================================================= 'renvoie l'état d'affichage de la flèche spécifiée Affiche_Fleche = BOL_Affiche_Fleche(INT_Index_Fleche, INT_Index_Volee) End Property Public Property Let Affiche_Fleche(ByVal INT_Index_Fleche As Integer, ByVal INT_Index_Volee As Integer, ByVal BOL_Affichage As Boolean) '============================================================= 'Permet de définir l'état d'affichage de la flèche spécifiée '============================================================= 'on définit l'état d'affichage de la flèche spécifiée BOL_Affiche_Fleche(INT_Index_Fleche, INT_Index_Volee) = BOL_Affichage End Property Public Function FUN_Afficher_Menu(ByVal FRM_FENETRE As Form) As Long '====================================================== 'Permet de créer le menu, puis de l'afficher ' 'Renvoie l'ID du menu cliqué 'Renvoie -1 en cas d'erreur '====================================================== 'on active la routine de traitement d'erreur On Error GoTo erreur0 'déclaration des variables privées Dim TYP_Menu_Info As MENUITEMINFO 'définit les info de l'item de menu ajouté Dim PNT_Position_Curseur As POINTAPI 'stocke la position actuelle du curseur Dim LNG_Retour As Long 'stocke le retour des fonctions Dim INT_For1 As Integer 'stocke les valeurs de la boucle For->Next Dim INT_For2 As Integer 'stocke les valeurs de la boucle For->Next Dim INT_Position(1) As Integer 'stocke la position à laquelle on doit ajouter le menu INT_Position(0) = 0 INT_Position(1) = 0 'on définit le handle du menu popup LNG_Handle_Menu = CreatePopupMenu 'on crée les menus selon les flèches affichables For INT_For1 = 0 To OBJ_Fleche.Nombre_Fleches - 1 LNG_Handle_Sous_Menu(INT_For1) = CreatePopupMenu For INT_For2 = 0 To OBJ_Fleche.Nombre_Volees - 1 If BOL_Affiche_Fleche(INT_For1, INT_For2) = True Then LNG_Handle_Sous_Sous_Menu(INT_For1, INT_For2) = CreatePopupMenu 'on définit le nouveau sous-sous-menu : With TYP_Menu_Info .cbSize = Len(TYP_Menu_Info) .fType = MFT_STRING .fState = MFS_ENABLED If OBJ_Fleche.Fleche_Active(INT_For1, INT_For2) True Then .fState .fState & MFT_CHECKED .dwTypeData = "Activée" .cch = Len(TYP_Menu_Info.dwTypeData) .wID = (INT_For2 + 1) + (INT_For1 + 1) * 100 .fMask = MIIM_ID Or MIIM_TYPE Or MIIM_STATE End With InsertMenuItem LNG_Handle_Sous_Sous_Menu(INT_For1, INT_For2), 0, True, TYP_Menu_Info 'on insère un nouveau menu dans le sous-menu : With TYP_Menu_Info .cbSize = Len(TYP_Menu_Info) .fType = MFT_STRING .fState = MFS_ENABLED .dwTypeData = "Volée n°" & INT_For2 + 1 .cch = Len(TYP_Menu_Info.dwTypeData) .wID = 0 .fMask = MIIM_ID Or MIIM_TYPE Or MIIM_STATE Or MIIM_SUBMENU .hSubMenu = LNG_Handle_Sous_Sous_Menu(INT_For1, INT_For2) End With InsertMenuItem LNG_Handle_Sous_Menu(INT_For1), INT_Position(0), True, TYP_Menu_Info INT_Position(0) = INT_Position(0) + 1 End If Next INT_For2 For INT_For2 = 0 To OBJ_Fleche.Nombre_Volees - 1 If BOL_Affiche_Fleche(INT_For1, INT_For2) = True Then 'on insère un nouveau menu dans le menu courant : With TYP_Menu_Info .cbSize = Len(TYP_Menu_Info) .fType = MFT_STRING .fState = MFS_ENABLED .dwTypeData = "Flèche n°" & INT_For1 + 1 .cch = Len(TYP_Menu_Info.dwTypeData) .wID = 0 .fMask = MIIM_ID Or MIIM_TYPE Or MIIM_STATE Or MIIM_SUBMENU .hSubMenu = LNG_Handle_Sous_Menu(INT_For1) End With InsertMenuItem LNG_Handle_Menu, INT_Position(1), True, TYP_Menu_Info INT_Position(1) = INT_Position(1) + 1 Exit For End If Next INT_For2 Next INT_For1 'on affiche le menu crée GetCursorPos PNT_Position_Curseur LNG_Retour = TrackPopupMenuEx(LNG_Handle_Menu, TPM_LEFTALIGN Or TPM_RIGHTBUTTON Or TPM_RETURNCMD, PNT_Position_Curseur.x, PNT_Position_Curseur.y, FRM_FENETRE.hWnd, ByVal 0&) DestroyMenu hMenu 'la fonction a réussie FUN_Afficher_Menu = LNG_Retour Exit Function 'routine de traitement d'erreur erreur0: 'Problème : On n'a pas pu afficher le menu ou on ne connaît pas l'ID du menu sélectionné 'Solution : On renvoie une valeur d'erreur : -1 FUN_Afficher_Menu = -1 End Function
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question