OVH Cloud OVH Cloud

API TrackPopupMenu + Menu racine (GetMenu(myForm.hwnd))

1 réponse
Avatar
xx
Bonsoir

Je cherche a afficher le menu racine
(GetMenu(myForm.hwnd)) en un endroit quelconque de la feuille.

Dans la version definitive, il s'agit bien sur de le faire apparaitre dans le System Tray

Dans les deux solutions les plus simples (simplistes) que j'ai ecrites:

-soit (5) l'affichage obtenu est tres particulier: barre verticale sans Caption)

-Soit (4) j'ai des 'fantomes' et eventuellemen un blocage.

J'ai une solution 3 qui fonctionne, mais s'il s'agit uniquement d'un point de detail pour faire fonctionner 4 ou 5 ...



Attribute VB_Name = "Module_HyperMenus"
Option Explicit
Option Compare Text
'############################################################################################
Private Declare Function GetCursorPos Lib "user32" _
(lpPoint As POINTAPI) _
As Long
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Private Declare Function GetMenu Lib "user32" _
(ByVal hwnd As Long) _
As Long
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Private Declare Function GetMenuItemCount Lib "user32" _
(ByVal hMenu As Long) _
As Long
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Private Declare Function GetSubMenu Lib "user32" _
(ByVal hMenu As Long, _
ByVal nPos As Long) _
As Long
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Private Declare Function GetMenuString Lib "user32" _
Alias "GetMenuStringA" _
(ByVal hMenu As Long, _
ByVal wIDItem As Long, _
ByVal lpString As String, _
ByVal nMaxCount As Long, _
ByVal wFlag As Long) _
As Long
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Private Declare Function GetMenuItemID Lib "user32" _
(ByVal hMenu As Long, _
ByVal nPos As Long) _
As Long
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Private Declare Function AppendMenu Lib "user32" _
Alias "AppendMenuA" _
(ByVal hMenu As Long, _
ByVal wFlags As Long, _
ByVal wIDNewItem As Long, _
ByVal lpNewItem As Any) _
As Long
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Private Declare Function CreatePopupMenu Lib "user32" _
() As Long
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Private 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
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'Private Declare Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As Long
'Private Declare Function ModifyMenu Lib "user32" Alias "ModifyMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As
Long, ByVal wIDNewItem As Long, ByVal lpString As Any) As Long
'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 Const TPM_RECURSE As Long = &H1&
'############################################################################################
Private Const MF_BYPOSITION = &H400
Private Const MF_STRING = &H0&
Private Const MF_POPUP = &H10&
Private Const WM_NULL = &H0
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Private Const TPM_NONOTIFY = &H80&
Private Const TPM_RETURNCMD = &H100&
'############################################################################################
Public Sub Build_HyperMenu5(frmfrm As Form)
Dim MP As POINTAPI
Dim tMenuPOPx As Long 'Should always be returned as '1' because *not* TPM_RETURNCMD
Dim hMenu0 As Long 'handle to Menu 0
Dim myForm As Form
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Set myForm = frmfrm
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GetCursorPos MP
hMenu0 = GetMenu(myForm.hwnd)
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'SetForegroundWindow myForm.hwnd
tMenuPOPx = TrackPopupMenu(hMenu0, TPM_NONOTIFY, MP.x, MP.y, 0&, myForm.hwnd, 0&)
'PostMessage myForm.hwnd, WM_NULL, 0, 0
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
End Sub
'############################################################################################

Public Sub Build_HyperMenu4(frmfrm As Form)
Dim MP As POINTAPI
Static hMenuPOP As Long 'handle to POPUP menu
Dim tMenuPOPx As Long 'Should always be returned as '1' because *not* TPM_RETURNCMD
Dim hMenu0 As Long 'handle to Menu 0
Dim myForm As Form
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Set myForm = frmfrm
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GetCursorPos MP
hMenu0 = GetMenu(myForm.hwnd)
If (hMenuPOP = 0) Then
hMenuPOP = CreatePopupMenu()
AppendMenu hMenuPOP, MF_POPUP, hMenu0, vbNullChar
End If
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SetForegroundWindow myForm.hwnd
tMenuPOPx = TrackPopupMenu(hMenuPOP, TPM_NONOTIFY, MP.x, MP.y, 0&, myForm.hwnd, 0&)
PostMessage myForm.hwnd, WM_NULL, 0, 0
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'DestroyMenu hMenuPOP
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
End Sub
'############################################################################################

1 réponse

Avatar
xx
"xx" a écrit dans le message de news:
Bonsoir

Je cherche a afficher le menu racine
(GetMenu(myForm.hwnd)) en un endroit quelconque de la feuille.

Dans la version definitive, il s'agit bien sur de le faire apparaitre dans le System Tray

Dans les deux solutions les plus simples (simplistes) que j'ai ecrites:

-soit (5) l'affichage obtenu est tres particulier: barre verticale sans Caption)

-Soit (4) j'ai des 'fantomes' et eventuellemen un blocage.

J'ai une solution 3 qui fonctionne, mais s'il s'agit uniquement d'un point de detail pour faire fonctionner 4 ou 5 ...



Je suis toujours a la recherche du patch miracle pour faire fonctionner 4) ou 5): j'aime le code court et compact.
Mais c'est un peu indelicat de parler d'une solution 3) sans la montrer.
Voici

'############################################################################################
Public Sub Build_HyperMenu3(frmfrm As Form)
Dim MP As POINTAPI
Static hMenuPOP As Long 'handle to POPUP menu
Dim tMenuPOPx As Long 'Should always be returned as '1' because *not* TPM_RETURNCMD
Dim hMenu0 As Long 'handle to Menu 0
Dim lCnt As Long 'Number of Top-Level Menus
Dim hSubMenu As Long 'wrk Top-Level Menus Handle
Dim sCaption As String 'wrk Top-Level Menus Caption
Dim lWID As Long 'wrk Top-Level Menus wID
Dim idx As Integer 'Index for Array/Loop
Dim myForm As Form
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Set myForm = frmfrm
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GetCursorPos MP
If hMenuPOP Then GoTo TRACK
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
hMenuPOP = CreatePopupMenu()
hMenu0 = GetMenu(myForm.hwnd)
lCnt = GetMenuItemCount(hMenu0)
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
For idx = 1 To lCnt
hSubMenu = GetSubMenu(hMenu0, idx - 1)
sCaption = String$(255, vbNullChar)
GetMenuString hMenu0, idx - 1, sCaption, Len(sCaption), MF_BYPOSITION
sCaption = RTrimNull(sCaption)
lWID = GetMenuItemID(hMenu0, idx - 1)
AppendMenu hMenuPOP, MF_POPUP, hSubMenu, sCaption
Next idx
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TRACK:
SetForegroundWindow myForm.hwnd
tMenuPOPx = TrackPopupMenu(hMenuPOP, TPM_NONOTIFY, MP.x, MP.y, 0&, myForm.hwnd, 0&)
PostMessage myForm.hwnd, WM_NULL, 0, 0
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'DestroyMenu hMenuPOP
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
End Sub
'############################################################################################