J'ai cr=E9er un menu par l'interm=E9diaire du cr=E9ateur de menu=20
afin d'afin un menu lorsque l'on fait un clic droit sur le=20
formulaire. Je l'ai donc mis en non visible.
Seul probl=E8me, je voudrais parall=E8lement que mon=20
formulaire soit sans bords, c'est =E0 dire BorderStyle =3D 0.
Mais apparemment vb m'en emp=EAche.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
ng
Salut,
2 solutions :
1/ Utiliser le menu d'une autre form, qui servirait de form de ressources (mais je déconseille).
2/ Utiliser l'API CreatePopupMenu qui sert à ca :
'//Dans un module : Option Explicit Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Public Declare Function CreatePopupMenu Lib "user32" () As Long Public Declare Function TrackPopupMenu Lib "user32" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal x As Long, ByVal y As Long, ByVal nReserved As Long, ByVal hwnd As Long, ByVal lprc As Any) As Long Public Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As eMenuEnum, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) As Long Public Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Const TPM_LEFTALIGN As Long = &H0& Public Const TPM_RIGHTBUTTON As Long = &H2& Public Const TPM_RETURNCMD As Long = &H100& Public Const WM_MENUSELECT As Long = &H11F Public Const GWL_WNDPROC As Long = (-4)
Public Function CallBackProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Static lLastItemSelected As Long If Msg = WM_MENUSELECT Then If lParam Then '//Menu cliqué lLastItemSelected = wParam And 255 Else '//On click le dernier Call Form1.PopupMenuClick(CInt(lLastItemSelected)) lLastItemSelected = 0 End If End If CallBackProc = CallWindowProc(lFormSubclass, hwnd, Msg, wParam, lParam) End Function
'//Dans ta Form :
Option Explicit
Dim hMenu As Long
Private Sub Form_Load() '//Création du menu hMenu = CreatePopupMenu() '//Ajout des éléments Call AppendMenu(hMenu, MF_GRAYED Or MF_DISABLED, 1, "Désactivé") Call AppendMenu(hMenu, MF_STRING, 2, "Cliquez !") Call AppendMenu(hMenu, MF_STRING, 3, "Quitter") Call AppendMenu(hMenu, MF_SEPARATOR, 4, ByVal 0&) '//Séparateur Call AppendMenu(hMenu, MF_CHECKED, 5, "Coché") '//Checked
'//Subclassing : lFormSubclass = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf CallBackProc) End Sub Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single) If Button = 2 Then Dim tPt As POINTAPI '//Coord de la souris Call GetCursorPos(tPt) '//Affiche le menu Call TrackPopupMenu(hMenu, TPM_LEFTALIGN, tPt.x, tPt.y, 0, Me.hwnd, ByVal 0&) End If End Sub Private Sub Form_Unload(Cancel As Integer) Call DestroyMenu(hMenu) Call SetWindowLong(Me.hwnd, GWL_WNDPROC, lFormSubclass) End Sub
Public Sub PopupMenuClick(ByVal Index As Integer) Select Case Index Case 2 MsgBox "Cliqué !" Case 3 Call Unload(Me) End Select End Sub
-- Nicolas G. FAQ VB : http://faq.vb.free.fr API Guide : http://www.allapi.net Google Groups : http://groups.google.fr/ MZ-Tools : http://www.mztools.com/ http://apisvb.europe.webmatrixhosting.net/
Nicolas a écrit :
Bonjour,
J'ai créer un menu par l'intermédiaire du créateur de menu afin d'afin un menu lorsque l'on fait un clic droit sur le formulaire. Je l'ai donc mis en non visible. Seul problème, je voudrais parallèlement que mon formulaire soit sans bords, c'est à dire BorderStyle = 0. Mais apparemment vb m'en empêche.
Comment faire donc pour avoir les deux ?
Merci
Nicolas
Salut,
2 solutions :
1/ Utiliser le menu d'une autre form, qui servirait de form de ressources
(mais je déconseille).
2/ Utiliser l'API CreatePopupMenu qui sert à ca :
'//Dans un module :
Option Explicit
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA"
(ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal
wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CreatePopupMenu Lib "user32" () As Long
Public Declare Function TrackPopupMenu Lib "user32" (ByVal hMenu As Long,
ByVal wFlags As Long, ByVal x As Long, ByVal y As Long, ByVal nReserved As
Long, ByVal hwnd As Long, ByVal lprc As Any) As Long
Public Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal
hMenu As Long, ByVal wFlags As eMenuEnum, ByVal wIDNewItem As Long, ByVal
lpNewItem As Any) As Long
Public Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As
Long
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As
Long
Public Const TPM_LEFTALIGN As Long = &H0&
Public Const TPM_RIGHTBUTTON As Long = &H2&
Public Const TPM_RETURNCMD As Long = &H100&
Public Const WM_MENUSELECT As Long = &H11F
Public Const GWL_WNDPROC As Long = (-4)
Public Function CallBackProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal
wParam As Long, ByVal lParam As Long) As Long
Static lLastItemSelected As Long
If Msg = WM_MENUSELECT Then
If lParam Then
'//Menu cliqué
lLastItemSelected = wParam And 255
Else
'//On click le dernier
Call Form1.PopupMenuClick(CInt(lLastItemSelected))
lLastItemSelected = 0
End If
End If
CallBackProc = CallWindowProc(lFormSubclass, hwnd, Msg, wParam, lParam)
End Function
'//Dans ta Form :
Option Explicit
Dim hMenu As Long
Private Sub Form_Load()
'//Création du menu
hMenu = CreatePopupMenu()
'//Ajout des éléments
Call AppendMenu(hMenu, MF_GRAYED Or MF_DISABLED, 1, "Désactivé")
Call AppendMenu(hMenu, MF_STRING, 2, "Cliquez !")
Call AppendMenu(hMenu, MF_STRING, 3, "Quitter")
Call AppendMenu(hMenu, MF_SEPARATOR, 4, ByVal 0&) '//Séparateur
Call AppendMenu(hMenu, MF_CHECKED, 5, "Coché") '//Checked
'//Subclassing :
lFormSubclass = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf CallBackProc)
End Sub
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y
As Single)
If Button = 2 Then
Dim tPt As POINTAPI
'//Coord de la souris
Call GetCursorPos(tPt)
'//Affiche le menu
Call TrackPopupMenu(hMenu, TPM_LEFTALIGN, tPt.x, tPt.y, 0, Me.hwnd,
ByVal 0&)
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
Call DestroyMenu(hMenu)
Call SetWindowLong(Me.hwnd, GWL_WNDPROC, lFormSubclass)
End Sub
Public Sub PopupMenuClick(ByVal Index As Integer)
Select Case Index
Case 2
MsgBox "Cliqué !"
Case 3
Call Unload(Me)
End Select
End Sub
--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/
Nicolas <nicolasheurtevin@wanadoo.fr> a écrit :
Bonjour,
J'ai créer un menu par l'intermédiaire du créateur de menu
afin d'afin un menu lorsque l'on fait un clic droit sur le
formulaire. Je l'ai donc mis en non visible.
Seul problème, je voudrais parallèlement que mon
formulaire soit sans bords, c'est à dire BorderStyle = 0.
Mais apparemment vb m'en empêche.
1/ Utiliser le menu d'une autre form, qui servirait de form de ressources (mais je déconseille).
2/ Utiliser l'API CreatePopupMenu qui sert à ca :
'//Dans un module : Option Explicit Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Public Declare Function CreatePopupMenu Lib "user32" () As Long Public Declare Function TrackPopupMenu Lib "user32" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal x As Long, ByVal y As Long, ByVal nReserved As Long, ByVal hwnd As Long, ByVal lprc As Any) As Long Public Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As eMenuEnum, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) As Long Public Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Const TPM_LEFTALIGN As Long = &H0& Public Const TPM_RIGHTBUTTON As Long = &H2& Public Const TPM_RETURNCMD As Long = &H100& Public Const WM_MENUSELECT As Long = &H11F Public Const GWL_WNDPROC As Long = (-4)
Public Function CallBackProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Static lLastItemSelected As Long If Msg = WM_MENUSELECT Then If lParam Then '//Menu cliqué lLastItemSelected = wParam And 255 Else '//On click le dernier Call Form1.PopupMenuClick(CInt(lLastItemSelected)) lLastItemSelected = 0 End If End If CallBackProc = CallWindowProc(lFormSubclass, hwnd, Msg, wParam, lParam) End Function
'//Dans ta Form :
Option Explicit
Dim hMenu As Long
Private Sub Form_Load() '//Création du menu hMenu = CreatePopupMenu() '//Ajout des éléments Call AppendMenu(hMenu, MF_GRAYED Or MF_DISABLED, 1, "Désactivé") Call AppendMenu(hMenu, MF_STRING, 2, "Cliquez !") Call AppendMenu(hMenu, MF_STRING, 3, "Quitter") Call AppendMenu(hMenu, MF_SEPARATOR, 4, ByVal 0&) '//Séparateur Call AppendMenu(hMenu, MF_CHECKED, 5, "Coché") '//Checked
'//Subclassing : lFormSubclass = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf CallBackProc) End Sub Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single) If Button = 2 Then Dim tPt As POINTAPI '//Coord de la souris Call GetCursorPos(tPt) '//Affiche le menu Call TrackPopupMenu(hMenu, TPM_LEFTALIGN, tPt.x, tPt.y, 0, Me.hwnd, ByVal 0&) End If End Sub Private Sub Form_Unload(Cancel As Integer) Call DestroyMenu(hMenu) Call SetWindowLong(Me.hwnd, GWL_WNDPROC, lFormSubclass) End Sub
Public Sub PopupMenuClick(ByVal Index As Integer) Select Case Index Case 2 MsgBox "Cliqué !" Case 3 Call Unload(Me) End Select End Sub
-- Nicolas G. FAQ VB : http://faq.vb.free.fr API Guide : http://www.allapi.net Google Groups : http://groups.google.fr/ MZ-Tools : http://www.mztools.com/ http://apisvb.europe.webmatrixhosting.net/
Nicolas a écrit :
Bonjour,
J'ai créer un menu par l'intermédiaire du créateur de menu afin d'afin un menu lorsque l'on fait un clic droit sur le formulaire. Je l'ai donc mis en non visible. Seul problème, je voudrais parallèlement que mon formulaire soit sans bords, c'est à dire BorderStyle = 0. Mais apparemment vb m'en empêche.