Ajouter de menu dans un popup menu

FirSteph Messages postés 60 Date d'inscription lundi 21 octobre 2002 Statut Membre Dernière intervention 7 octobre 2007 - 4 nov. 2003 à 03:02
FirSteph Messages postés 60 Date d'inscription lundi 21 octobre 2002 Statut Membre Dernière intervention 7 octobre 2007 - 5 nov. 2003 à 15:38
Bonjour.
Serait-il possible d'ajouter durant l'execution de l'application des menu, pour par exemple faire des acces rapide aux differentes configurations de l'utilisateur (popup menu avec Profil_Utilisateur 1, Profil_Utilisateur2, Profil_Utilisateur3, etc...).
Merci d'avance :)

@ Bientot :)

FirSteph

5 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
4 nov. 2003 à 07:14
Oui, c'est tout a fait possible

pourtant, il faut utiliser des API, et ca peut en rebuter certains....

Si les changements entre les menus sont minimes, le simple fait de masquer ou non (MonMenu.visible = False/True) un menu peut peut-être suffir....

SI tu choisis les API, fais moi signe...

By Renfield

[mailto:thomas_reynald@msn.com thomas_reynald@msn.com]

Aucune touche n'a ete blessee lors de la saisie de ce texte.......... ;)
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
4 nov. 2003 à 08:08
L'utilisation des API CreatePopUpMenu, InsertMenuItem, TrackPopUpMenu et DestroyMenu sont relativement facile à utiliser ! Si tu passe par elles, je pourrais te passer un bout de code.

DarK Sidious

[Responsable de la rubrique API et responsable VB du site www.ProgOtoP.com]
0
FirSteph Messages postés 60 Date d'inscription lundi 21 octobre 2002 Statut Membre Dernière intervention 7 octobre 2007
5 nov. 2003 à 03:31
Merci Renfield mais il me faut les API car je dois reellement creer des nouveaux menus.
Par contre Dark Sidious, merci bcp pour les API, mais je veux bien un exemple, ca serait sympa :) Sinon c pas grave, je ferais une petite recherche sur Google et je devrais pouvoir trouver ca ;)

@ Bientot :)

FirSteph
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
5 nov. 2003 à 06:32
Voici un code que j'avais mis dans un module de classe pour la création d'un menu pour un programme de tir à l'arc, mais tu peux le mettre dans un module ou une form, tu ne devrais pas avoir grand chose à changer :

Déclarations :
'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


Le code permettant de créer et d'afficher le menu (selon les valeurs de la propriété Affiche_Flèche :

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


Bon, c'est un peu long, je sais, mais ce code est sûrement un peu plus complexe que ce que tu demande : il crée des sous-menu pour des sous-menu d'un menu déroulant !

Il te reste plus qu'à l'adapter à ton cas particulier

DarK Sidious

[Responsable de la rubrique API et responsable VB du site www.ProgOtoP.com]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
FirSteph Messages postés 60 Date d'inscription lundi 21 octobre 2002 Statut Membre Dernière intervention 7 octobre 2007
5 nov. 2003 à 15:38
C sur que je v bien l'amputer, mais en tout cas merci bcp bcp bcp, et encore merci =)

@ Bientot :)

FirSteph
0
Rejoignez-nous