cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201578 22 janv. 2009 à 13:34
Salut
Non, il existe bien un code permettant de déplacer un item de menu vers la droite, mais il n'existe pas de constante équivalente pour le centrage.
Si tu veux tester, place ce code dans un module judicieusement appelé "modMenuDroite.bas" et appelle la fonction depuis ta forme comme ceci :
Call Menu_Droite(Me.mnuzHelp)
Ici, mon l'item "Aide" de mon menu se retrouve à droite de la forme.
Module :
Option Explicit
'-------------
' Déclarations nécessaires pour le passage d'un des Menus à droite de la forme
Private Declare Function GetMenu Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
' Dans les deux fonctions qui suivent :
' Si ItemPosition = True : uItem désigne la position de l'item.
' False : uItem désigne l'identifier
Private Declare Function GetMenuItemInfo Lib "user32" Alias "GetMenuItemInfoA" ( _
ByVal hMenu As Long, _
ByVal uItem As Long, _
ByVal itemPosition As Boolean, _
lpMenuItemInfo As MENUITEMINFO) As Long
Private Declare Function SetMenuItemInfo Lib "user32" Alias "SetMenuItemInfoA" ( _
ByVal hMenu As Long, _
ByVal uItem As Long, _
ByVal itemPosition As Boolean, _
lpcMenuItemInfo As MENUITEMINFO) As Long
Private Const MIIM_TYPE As Long = &H10
Private Const MIIM_STRING As Long = &H40
Private Const MFT_RIGHTJUSTIFY As Long = &H4000
Private Const MFT_STRING As Long = &H0
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
'
Public Sub Menu_Droite(ByRef Menu As Control)
' Menu est ici l'Item de type menu à placer sur la droite
Dim MnuInfo As MENUITEMINFO
Dim hWnd As Long
Dim Ret As Long
Dim No As Integer
' Récupère le handle du menu à partir du handle de la forme (parent)
hWnd = GetMenu(Menu.Parent.hWnd)
Ret = 1
No = 0 ' No d'ordre du menu
Do While Ret = 1 ' Scrute tous les menus de la forme
' Prépare la variable et récupère ces caractéristiques
' -1- Fait un 1er appel pour connaitre la longueur du texte (cch)
MnuInfo.dwTypeData = vbNullChar
MnuInfo.cch = 0
MnuInfo.fMask = MIIM_TYPE
MnuInfo.fType = MIIM_STRING
MnuInfo.cbSize = Len(MnuInfo)
Ret = GetMenuItemInfo(hWnd, No, True, MnuInfo) If Ret 0 Or MnuInfo.cch 0 Then Exit Do
' -2- Refait la même demande en ayant préparé un buffer
' d'une longueur de cch + 1 (pour le vbNull)
MnuInfo.cch = MnuInfo.cch + 1
MnuInfo.dwTypeData = String(MnuInfo.cch, " ")
MnuInfo.fMask = MIIM_TYPE
MnuInfo.fType = &H40
MnuInfo.cbSize = Len(MnuInfo)
Ret = GetMenuItemInfo(hWnd, No, True, MnuInfo)
If Ret = 0 Then Exit Do
'-3- Compare avec le Menu que l'on cherche
If MnuInfo.dwTypeData = (Menu.Caption & vbNullChar) Then
' Modifie les données et les ré-écrit
MnuInfo.fType = MFT_RIGHTJUSTIFY Or MFT_STRING
MnuInfo.cbSize = Len(MnuInfo)
Ret = SetMenuItemInfo(hWnd, No, True, MnuInfo)
' Met à jour l'affichage
Ret = DrawMenuBar(Menu.Parent.hWnd)
Exit Do
End If
No = No + 1
DoEvents
Loop
End Sub
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
<hr />
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201578 22 janv. 2009 à 13:36
PS : La prochaine fois, ne poste pas deux questions sur le même sujet, ça ne sert à rien.
Applique toi à mettre un titre à tes question : "Aide" ou "Code" n'inciteront pas les membres à lire ton message.