Sign in to follow this  
Followers 0
Luigi

WM_CONTEXTMENU custom for controls does not work

2 posts in this topic

#1 ·  Posted (edited)

Greetings,

I try work with WM_CONTEXT, I take from help's example, and modify to generate a custom context menu to each control (ListView, TreeView or another control).

If you leave with default/generic it work.

If you custom for a specific control, does not work, what is my erro?

When I say work, I want call the Switch...Case from WM_COMMAND.

This is the code:

#include <GUIConstantsEx.au3>
#include <GuiMenu.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

OnAutoItExitRegister("OnExit")

Opt("GUIOnEventMode", 1)
Opt("GUIEventOptions", 1)
Opt("MustDeclareVars", 1)

Global Enum $eOPEN = 1000, $eSAVE, $eINFO

Global $hGui = GUICreate("Menu", 400, 300)
ConsoleWrite("$hGui........[" & $hGui & "]" & @LF)
Global $iListView1 = GUICtrlCreateListView("", 10, 10, 80, 120)
Global $hListView1 = GUICtrlGetHandle($iListView1)
ConsoleWrite("$iTreeView1..[" & $iListView1 & "] $hListView1..[" & $hListView1 & "]" & @LF)
Global $iListView2 = GUICtrlCreateListView("", 100, 10, 80, 120)
Global $hListView2 = GUICtrlGetHandle($iListView2)
ConsoleWrite("$iTreeView1..[" & $iListView2 & "] $hListView2..[" & $hListView2 & "]" & @LF)
Global $iTreeView1 = GUICtrlCreateTreeView(190, 10, 80, 120)
Global $hTreeView1 = GUICtrlGetHandle($iTreeView1)
ConsoleWrite("$iTreeView1..[" & $iTreeView1 & "] $hTreeView1..[" & $hTreeView1 & "]" & @LF)

GUISetOnEvent($GUI_EVENT_CLOSE, "Quit", $hGui)
GUISetState(@SW_SHOW, $hGui)

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTMENU")
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

While Sleep(25)
WEnd

Func Quit()
    Exit
EndFunc   ;==>Quit

Func OnExit()
    GUIDelete($hGui)
EndFunc   ;==>OnExit

; Handle WM_COMMAND messages
Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam, $lParam
    ConsoleWrite("WM_CONTEXTMENU( $hWnd=" & $hWnd & ", $iMsg=" & $iMsg & ", $wParam=" & $wParam & ", $lParam=" & $lParam & " )" & @LF)
    Switch $wParam
        Case $eOPEN
            ConsoleWrite("Open" & @LF)
        Case $eSAVE
            ConsoleWrite("Save" & @LF)
        Case $eINFO
            ConsoleWrite("Info" & @LF)
    EndSwitch
EndFunc   ;==>WM_COMMAND

; Handle WM_CONTEXTMENU messages
Func WM_CONTEXTMENU($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam, $lParam
    ConsoleWrite("WM_CONTEXTMENU( $hWnd=" & $hWnd & ", $iMsg=" & $iMsg & ", $wParam=" & $wParam & ", $lParam=" & $lParam & " )" & @LF)
    Local $hMenu = _GUICtrlMenu_CreatePopup()
    _GUICtrlMenu_InsertMenuItem($hMenu, 0, "Generic Open", $eOPEN)
    _GUICtrlMenu_InsertMenuItem($hMenu, 1, "Generic Save", $eSAVE)
    _GUICtrlMenu_InsertMenuItem($hMenu, 2, "Generic Info", $eINFO)
    _GUICtrlMenu_TrackPopupMenu($hMenu, $wParam)
    _GUICtrlMenu_DestroyMenu($hMenu)
    Return True


    ; does not work
    #cs
        #forceref $hWnd, $iMsg, $wParam, $lParam
        ConsoleWrite("WM_CONTEXTMENU( $hWnd=" & $hWnd & ", $iMsg=" & $iMsg & ", $wParam=" & $wParam & ", $lParam=" & $lParam & " )" & @LF)
        Local $hMenu = _GUICtrlMenu_CreatePopup()
        Switch $wParam
        Case $hListView1
        _GUICtrlMenu_InsertMenuItem($hMenu, 0, "$hListView1 Open", $eOPEN)
        _GUICtrlMenu_InsertMenuItem($hMenu, 1, "$hListView1 Save", $eSAVE)
        _GUICtrlMenu_InsertMenuItem($hMenu, 2, "$hListView1 Info", $eINFO)
        Case $hListView2
        _GUICtrlMenu_InsertMenuItem($hMenu, 0, "$hListView2 Open", $eOPEN)
        _GUICtrlMenu_InsertMenuItem($hMenu, 1, "$hListView2 Save", $eSAVE)
        _GUICtrlMenu_InsertMenuItem($hMenu, 2, "$hListView2 Info", $eINFO)
        Case $hTreeView1
        _GUICtrlMenu_InsertMenuItem($hMenu, 0, "$hTreeView1 Open", $eOPEN)
        _GUICtrlMenu_InsertMenuItem($hMenu, 1, "$hTreeView1 Save", $eSAVE)
        _GUICtrlMenu_InsertMenuItem($hMenu, 2, "$hTreeView1 Info", $eINFO)
        EndSwitch

        _GUICtrlMenu_TrackPopupMenu($hMenu, $wParam)
        _GUICtrlMenu_DestroyMenu($hMenu)
        Return True
    #ce
EndFunc   ;==>WM_CONTEXTMENU

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam, $lParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
EndFunc   ;==>WM_NOTIFY

 

Edited by Luigi

m(o.O)m

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

I found this way... Is the better?

It not fire WM_COMMAND or WM_MENUCOMMAND, it use only WM_CONTEXTMENU

 

#include <GuiMenu.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>

OnAutoItExitRegister("OnExit")

Opt("GUIOnEventMode", 1)
Opt("GUIEventOptions", 1)
Opt("MustDeclareVars", 1)

Global Enum $eOPEN = 1000, $eSAVE, $eINFO
Global $try
Global $hGui = GUICreate("Menu", 400, 300)
GUISetOnEvent($GUI_EVENT_CLOSE, "Quit", $hGui)
Global $iListView = GUICtrlCreateListView("", 10, 10, 80, 120)
Global $hListView = GUICtrlGetHandle($iListView)

Global $iTreeView = GUICtrlCreateTreeView(100, 10, 80, 120)
Global $hTreeView = GUICtrlGetHandle($iTreeView)

ConsoleWrite("$hGui[" & $hGui & "] $iListView[" & $iListView & "] $hListView[" & $hListView & "] $iTreeView[" & $iTreeView & "] $hTreeView[" & $hTreeView & "]" & @LF)

;~ GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
;~ GUIRegisterMsg($WM_MENUCOMMAND, "WM_MENUCOMMAND")
GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTMENU")

GUISetState(@SW_SHOW, $hGui)

While Sleep(10)
WEnd

;~ Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
;~  #forceref $hWnd, $iMsg, $wParam, $lParam
;~  ConsoleWrite("WM_COMMAND.....( $hWnd=" & $hWnd & ", $iMsg=" & $iMsg & ", $wParam=" & $wParam & ", $lParam=" & $lParam & " )" & @LF)
;~  Switch $hWnd
;~      Case $hGui
;~          Switch $wParam
;~              Case $eOPEN
;~                  ConsoleWrite("Open" & @LF)
;~              Case $eSAVE
;~                  ConsoleWrite("Save" & @LF)
;~              Case $eINFO
;~                  ConsoleWrite("Open" & @LF)
;~          EndSwitch
;~  EndSwitch
;~  Return $GUI_RUNDEFMSG
;~ EndFunc   ;==>WM_COMMAND

;~ Func WM_MENUCOMMAND($hWnd, $iMsg, $wParam, $lParam)
;~  #forceref $hWnd, $iMsg, $wParam, $lParam
;~  ConsoleWrite("WM_MENUCOMMAND..( $hWnd=" & $hWnd & ", $iMsg=" & $iMsg & ", $wParam=" & $wParam & ", $lParam=" & $lParam & " )" & @LF)
;~  ConsoleWrite(_GUICtrlMenu_GetItemText($lParam, $wParam) & @CRLF)

;~  Switch _WinAPI_LoWord($wParam)
;~      Case $eOPEN
;~          ConsoleWrite("Open" & @LF)
;~      Case $eSAVE
;~          ConsoleWrite("Save" & @LF)
;~      Case $eINFO
;~          ConsoleWrite("Open" & @LF)
;~  EndSwitch

;~  Return $GUI_RUNDEFMSG
;~ EndFunc   ;==>WM_MENUCOMMAND

; Handle WM_CONTEXTMENU messages
Func WM_CONTEXTMENU($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $wParam, $lParam
    If Not ($hWnd = $hGui) Then Return
    ConsoleWrite("WM_CONTEXTMENU..( $hWnd=" & $hWnd & ", $iMsg=" & $iMsg & ", $wParam=" & $wParam & ", $lParam=" & $lParam & " )" & @LF)
    Local $hMenu = _GUICtrlMenu_CreatePopup()

    Local $label
    Switch $wParam
        Case $hListView
            $label = "ListView"
            _GUICtrlMenu_InsertMenuItem($hMenu, 0, $label & " Open", $eOPEN)
            _GUICtrlMenu_InsertMenuItem($hMenu, 1, $label & " Save", $eSAVE)
            _GUICtrlMenu_InsertMenuItem($hMenu, 2, $label & " Info", $eINFO)
        Case $hTreeView
            $label = "TreeView"
            _GUICtrlMenu_InsertMenuItem($hMenu, 0, $label & " Open", $eOPEN)
            _GUICtrlMenu_InsertMenuItem($hMenu, 1, $label & " Save", $eSAVE)
            _GUICtrlMenu_InsertMenuItem($hMenu, 2, $label & " Info", $eINFO)
    EndSwitch
    _GUICtrlMenu_SetMenu($hGui, $hMenu)

    $try = _GUICtrlMenu_TrackPopupMenu($hMenu, $wParam, -1, -1, 1, 1, 2, 1)
    ConsoleWrite("@line[" & @ScriptLineNumber & "] @error[" & @error & "] $try[" & $try & "]" & @LF)

    Switch $try
        Case $eOPEN
            ConsoleWrite("Execute " & $label & " Open" & @LF)
        Case $eSAVE
            ConsoleWrite("Execute " & $label & " Save" & @LF)
        Case $eINFO
            ConsoleWrite("Execute " & $label & " Open" & @LF)
        Case Else
            ConsoleWrite("Execute " & $label & " None" & @LF)
    EndSwitch

    _GUICtrlMenu_DestroyMenu($hMenu)
    Return True
EndFunc   ;==>WM_CONTEXTMENU

Func Quit()
    Exit
EndFunc   ;==>Quit

Func OnExit()
    GUIDelete($hGui)
EndFunc   ;==>OnExit

 

Edited by Luigi

m(o.O)m

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0

  • Similar Content

    • ChrisL
      By ChrisL
      #include <GUIConstantsEx.au3> #include <GuiTreeView.au3> #include <WindowsConstants.au3> #include <GuiMenu.au3> Global $g_hTreeView Global Enum $e_idOpen = 1000, $e_idSave, $e_idInfo Example() Func Example() Local $hGUI, $hItem Local $iStyle = BitOR($TVS_EDITLABELS, $TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS, $TVS_CHECKBOXES) $hGUI = GUICreate("(UDF Created) TreeView Create", 400, 300) $g_hTreeView = _GUICtrlTreeView_Create($hGUI, 2, 2, 396, 268, $iStyle, $WS_EX_CLIENTEDGE) GUISetState(@SW_SHOW) GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY") GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTMENU") GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") _GUICtrlTreeView_BeginUpdate($g_hTreeView) For $x = 1 To Random(2, 10, 1) $hItem = _GUICtrlTreeView_Add($g_hTreeView, 0, StringFormat("[%02d] New Item", $x)) For $y = 1 To Random(2, 10, 1) _GUICtrlTreeView_AddChild($g_hTreeView, $hItem, StringFormat("[%02d] New Child", $y)) Next Next _GUICtrlTreeView_EndUpdate($g_hTreeView) ; Loop until the user exits. Do Until GUIGetMsg() = $GUI_EVENT_CLOSE GUIDelete() EndFunc ;==>Example Func WM_CONTEXTMENU($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $lParam ;ConsoleWrite($GUI_RUNDEFMSG & @CRLF) ;Switch $wParam ; Case $hTreeView Local $hMenu $hMenu = _GUICtrlMenu_CreatePopup() _GUICtrlMenu_InsertMenuItem($hMenu, 0, "Open", $e_idOpen) _GUICtrlMenu_InsertMenuItem($hMenu, 1, "Save", $e_idSave) _GUICtrlMenu_InsertMenuItem($hMenu, 3, "", 0) _GUICtrlMenu_InsertMenuItem($hMenu, 3, "Info", $e_idInfo) _GUICtrlMenu_TrackPopupMenu($hMenu, $wParam) _GUICtrlMenu_DestroyMenu($hMenu) Return True ;EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_CONTEXTMENU Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $lParam Switch $wParam Case $e_idOpen _DebugPrint("WM_COMMAND " & $wParam & " Open") Case $e_idSave _DebugPrint("WM_COMMAND " & $wParam & " Save") Case $e_idInfo _DebugPrint("WM_COMMAND " & $wParam & " Info") EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_COMMAND Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam) #forceref $hWnd, $iMsg, $wParam Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndTreeview $hWndTreeview = $g_hTreeView If Not IsHWnd($g_hTreeView) Then $hWndTreeview = GUICtrlGetHandle($g_hTreeView) $tNMHDR = DllStructCreate($tagNMHDR, $lParam) $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom")) $iIDFrom = DllStructGetData($tNMHDR, "IDFrom") $iCode = DllStructGetData($tNMHDR, "Code") Switch $hWndFrom Case $hWndTreeview Switch $iCode Case $NM_CLICK ; The user has clicked the left mouse button within the control _DebugPrint("$NM_CLICK" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _ "-->IDFrom:" & @TAB & $iIDFrom & @CRLF & _ "-->Code:" & @TAB & $iCode) ; Return 1 ; nonzero to not allow the default processing Return 0 ; zero to allow the default processing Case $NM_DBLCLK ; The user has double-clicked the left mouse button within the control _DebugPrint("$NM_DBLCLK" & @CRLF & "--> hWndFrom:" & @TAB & $hWndFrom & @CRLF & _ "-->IDFrom:" & @TAB & $iIDFrom & @CRLF & _ "-->Code:" & @TAB & $iCode) ; Return 1 ; nonzero to not allow the default processing Return 0 ; zero to allow the default processing EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc ;==>WM_NOTIFY Func _DebugPrint($s_Text, $sLine = @ScriptLineNumber) ConsoleWrite( _ "!===========================================================" & @CRLF & _ "+======================================================" & @CRLF & _ "-->Line(" & StringFormat("%04d", $sLine) & "):" & @TAB & $s_Text & @CRLF & _ "+======================================================" & @CRLF) EndFunc ;==>_DebugPrint In the example code I have a treeview and a context/popup menu, I can't use a conventional context menu because I need to use the treeview UDF functions.
      The WM_COMMAND never fires from the context/popup menu selection while there is a treeview using  _GuiCtrlTreeview_Create
      If you comment out _GuiCtrlTreeview_Create line you will then see the right click selection works as expected and the debug is written to the console on selection.
      Autoit Ver 3.3.14.2
      Any ideas why this combination won't work together?
      Thanks
       
    • caleb41610
      By caleb41610
      Here's the code I have, pulled from the examples and a couple things added. I've been trying to implement something like this in one of my scripts with no luck. So I went to the basics and decided to just get this part working.

      #include <GuiMenu.au3> #include <GUIConstantsEx.au3> #include <WinAPI.au3> #include <WindowsConstants.au3> Global Enum $idOpen = 1000, $idSave, $idInfo _Main() Func _Main() ; Create GUI GUICreate("Menu", 400, 300) GUISetState() ; Register message handlers GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTMENU") Global $listview = GUICtrlCreateListView( "test1|test2|test3|test4", 5, 5, 390, 290 ) Global $row1 = GUICtrlCreateListViewItem( "item1|item2|item3|item4", $listview ) Global $row2 = GUICtrlCreateListViewItem( "test1|test2|test3|test4", $listview ) ; Loop until user exits Do Until GUIGetMsg() = $GUI_EVENT_CLOSE EndFunc ;==>_Main ; Handle WM_COMMAND messages Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam) #forceref $hWnd, $iMsg, $ilParam Switch $iwParam Case $idOpen _WinAPI_ShowMsg("Open") Case $idSave _WinAPI_ShowMsg("Save") Case $idInfo _WinAPI_ShowMsg("Info") EndSwitch EndFunc ;==>WM_COMMAND ; Handle WM_CONTEXTMENU messages Func WM_CONTEXTMENU($hWnd, $iMsg, $iwParam, $ilParam) #forceref $hWnd, $iMsg, $ilParam Local $hMenu Local $selected = GUICtrlRead( GUICtrlRead( $listview ) ) If $selected = 0 Then Return 1 $hMenu = _GUICtrlMenu_CreatePopup() _GUICtrlMenu_InsertMenuItem($hMenu, 0, "Open", $idOpen) _GUICtrlMenu_InsertMenuItem($hMenu, 1, "Save", $idSave) _GUICtrlMenu_InsertMenuItem($hMenu, 3, "", 0) _GUICtrlMenu_InsertMenuItem($hMenu, 3, "Info", $idInfo) _GUICtrlMenu_TrackPopupMenu($hMenu, $iwParam) _GUICtrlMenu_DestroyMenu($hMenu) Return True EndFunc ;==>WM_CONTEXTMENU
      I added this to the main function:

      Global $listview = GUICtrlCreateListView( "test1|test2|test3|test4", 5, 5, 390, 290 ) Global $row1 = GUICtrlCreateListViewItem( "item1|item2|item3|item4", $listview ) Global $row2 = GUICtrlCreateListViewItem( "test1|test2|test3|test4", $listview )
      and added this to wm_contextmenu:

      Local $selected = GUICtrlRead( GUICtrlRead( $listview ) ) If $selected = 0 Then Return 1
      The rest is pulled straight from the example script for "_GUICtrlMenu_CreatePopup()"

      Basically I only want the menu to show up if something is selected inside the listview.

      The problem is that it won't show up at all when I have the coded added to WM_CONTEXTMENU. I checked $selected with a traytip and it shows the info correctly.. and if nothing is selected it always displays 0. I'm not sure how to do this.