Imiter vbfixedsingle avec une feuille mdi

Contenu du snippet

C'est une question récurrente dans le forum : comment faire pour imiter vbFixedSingle avec une feuille MDI ? Pour préciser un peu, il s'agit de faire apparaître une feuille MDI avec le seul bouton Fermer et avec un menu système (le menu que vous obtenez en cliquant sur l'icône de la feuille en haut à gauche) réduit aux deux lignes "Déplacer" et "Fermer". Ces quelques lignes vous apportent une réponse possible à l'aide de plusieurs API. On peut bien sûr discuter l'intérêt de cette méthode sur des feuilles MDI... mais le but est avant tout de répondre à une question qui a été posée sur le forum.

Source / Exemple :


'DECLARATIONS DES APIS (à placer dans un module)

'API utilisée ici pour définir les paramètres d'une fenêtre
Declare Function Paramètres Lib "user32" Alias "SetWindowLongA" ( _
                        ByVal hwnd As Long, _
                        ByVal nIndex As Long, _
                        ByVal dwNewLong As Long) As Long
'API utilisée pour récupérer le descripteur du menu système d'une fenêtre
'(le menu obtenu en cliquant sur l'icône du programme, en haut à gauche)
Declare Function MenuSystème Lib "user32" Alias "GetSystemMenu" ( _
                        ByVal hwnd As Long, _
                        ByVal bRevert As Long) As Long
'API utilisée pour récupérer le nombre d'éléments d'un menu
Declare Function ElémentsMenu Lib "user32" Alias "GetMenuItemCount" ( _
                        ByVal lDescripteur As Long) As Long
'API utilisée pour supprimer un élément d'un menu
Declare Function EffacerMenu Lib "user32" Alias "RemoveMenu" ( _
                        ByVal lDescripteur As Long, _
                        ByVal nPosition As Long, _
                        ByVal wFlags As Long) As Long
'API utilisée pour rafraîchir le menu d'une feuille
Declare Function Rafraîchir Lib "user32" Alias "DrawMenuBar" ( _
                        ByVal hwnd As Long) As Long

'QUELQUES CONSTANTES

Const MF_BYPOSITION = &H400&
Const MF_REMOVE = &H1000&
Const WS_SYSMENU = &H80000
Const WS_CAPTION = &HC00000
    
Dim lDescripteur As Long, lEléments As Long

'Evénement de chargement de la feuille
Private Sub MDIForm_Load()
    'On demande la modification de la feuille
    ModifierFeuille
End Sub

'Fonction de modification de la feuille
Sub ModifierFeuille()

'A. BARRE DE TITRE
    'Dans un premier temps, on va modifier la barre de titre :
    '   1.  On affiche la barre de titre XP habituelle SANS boutons
    '(réduire, agrandir, fermer) ni icône de fenêtre.(&HC00000).
    '   2. On ajoute l'icône de la feuille dans la barre de titre 
    '(avec le menu système !) ainsi que le bouton fermer (&H80000).
    Paramètres hwnd, -16, WS_CAPTION Or WS_SYSMENU
    
'B. MENU SYSTEME
    'On vient de modifier la barre de titre. Cependant, le menu
    'système qui a été ajouté avec la constante WS_SYSMENU 
    'contient trois entrées qui nous sont inutiles : agrandissement,
    'réduction et restauration. Nous allons les supprimer.
    
    'D'abord, récupérons le descripteur (= handle) du menu système
    lDescripteur = MenuSystème(hwnd, 0)
    'Ensuite, récupérons le nombre d'éléments du menu système
    lEléments = ElémentsMenu(lDescripteur)

    'Nous avons donc trois appels à effectuer, destinés à :
    '   1. Enlever l'élément de menu "Agrandissement"
    '   2. Enlever l'élément de menu "Réduction"
    '   3. Enlever l'élément de menu "Restauration"
    EffacerMenu lDescripteur, lEléments - 3, MF_REMOVE Or MF_BYPOSITION
    EffacerMenu lDescripteur, lEléments - 4, MF_REMOVE Or MF_BYPOSITION
    EffacerMenu lDescripteur, lEléments - 7, MF_REMOVE Or MF_BYPOSITION
    'Enfin, mettons à jour la fenêtre
    Rafraîchir hwnd
End Sub

Conclusion :


J'ai choisi le niveau 2 (initié) en raison de l'appel à des APIS... mais bon pour peu qu'on comprenne en gros ce qui se passe, ce n'est pas difficile à mettre en oeuvre.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.