Что нового

Работа с контекстным меню

Атос

Новичок
Сообщения
85
Репутация
0
Привет.
Как мне привязывать контекстное меню к определённым элементам, а не ко всему окну?

Т.е, меню GUICtrlCreateListView и меню статических элементов должны различаться.

Код:
#include <GuiMenu.au3>
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
Global $idOpen = 1000, $idSave, $idInfo
_MList()
Func _MList()
Global $hList = GUICreate('111')
$iButton = GUICtrlCreateListView("QQQQQQQQQQQQ", 0, 0, 200, 327)
global $mlist = GUICtrlGetHandle($iButton)
GUISetState()
GUIRegisterMsg(0x0111, "WM_COMMAND")
GUIRegisterMsg(0x007B, "WM_CONTEXTMENU_111")
GUIRegisterMsg(0x007B, "WM_CONTEXTMENU_222")
    Do
    Until GUIGetMsg() = -3
GUIDelete()
EndFunc

Func WM_CONTEXTMENU_111($hList, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $lParam
    Local $hMenu
    $hMenu = _GUICtrlMenu_CreatePopup ()
    _GUICtrlMenu_InsertMenuItem ($hMenu, 0, "1111111", $idOpen)
    _GUICtrlMenu_InsertMenuItem ($hMenu, 1, "2222222", $idSave)
    _GUICtrlMenu_InsertMenuItem ($hMenu, 3, "", 0)
    _GUICtrlMenu_InsertMenuItem ($hMenu, 3, "3333333", $idInfo)
    _GUICtrlMenu_TrackPopupMenu ($hMenu, $mlist)
; MsgBox(0, 'Menu' & '', @CRLF & $wParam & @CRLF & $lParam)
    _GUICtrlMenu_DestroyMenu ($hMenu)
    Return True
EndFunc

Func WM_CONTEXTMENU_222($mlist, $iMsg)
    #forceref $hWnd, $iMsg, $lParam
    Local $hMenu
    $hMenu = _GUICtrlMenu_CreatePopup(32)
    _GUICtrlMenu_InsertMenuItem ($hMenu, 3, "AAAAAAA", $idInfo)
    _GUICtrlMenu_TrackPopupMenu ($hMenu, $mlist)
; MsgBox(0, 'Menu' & '', @CRLF & $wParam & @CRLF & $lParam)
    _GUICtrlMenu_DestroyMenu ($hMenu)
    Return True
EndFunc

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
; MsgBox(0, 'Command' & '',@CRLF & $wParam & @CRLF & $lParam)
    #forceref $hWnd, $iMsg, $lParam
    Switch $wParam
        Case $idOpen
              MsgBox(0, '' & '', 'Открыть')
        Case $idSave
              MsgBox(0, '' & '', 'Сохранить')
        Case $idInfo
              MsgBox(0, '' & '', 'Информация')
    EndSwitch
EndFunc
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Вот так можно :
Код:
#include <GuiMenu.au3>
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
Global $idOpen = 1000, $idSave, $idInfo, $iButton, $hList
_MList()
Func _MList()
	Global $hList = GUICreate('111')
	$iButton = GUICtrlCreateListView("QQQQQQQQQQQQ", 0, 0, 200, 327)

	Global $mlist = GUICtrlGetHandle($iButton)
	GUISetState()
	GUIRegisterMsg(0x0111, "WM_COMMAND")
	GUIRegisterMsg(0x007B, "WM_CONTEXTMENU_111")
	;GUIRegisterMsg(0x007B, "WM_CONTEXTMENU_222")
	Do
	Until GUIGetMsg() = -3
	GUIDelete()
EndFunc   ;==>_MList

Func WM_CONTEXTMENU_111($hList, $iMsg, $wParam, $lParam)

	Switch $wParam
		Case $mlist
			; #forceref $hWnd, $iMsg, $lParam

			$hMenu = _GUICtrlMenu_CreatePopup()
			_GUICtrlMenu_InsertMenuItem($hMenu, 0, "1111111", $idOpen)
			_GUICtrlMenu_InsertMenuItem($hMenu, 1, "2222222", $idSave)
			_GUICtrlMenu_InsertMenuItem($hMenu, 3, "", 0)
			_GUICtrlMenu_InsertMenuItem($hMenu, 3, "3333333", $idInfo)
			_GUICtrlMenu_TrackPopupMenu($hMenu, $mlist)
			; MsgBox(0, 'Menu' & '', @CRLF & $wParam & @CRLF & $lParam)
			_GUICtrlMenu_DestroyMenu($hMenu)

		Case $hList

			$hMenu = _GUICtrlMenu_CreatePopup(32)
			_GUICtrlMenu_InsertMenuItem($hMenu, 3, "AAAAAAA", $idInfo)
			_GUICtrlMenu_TrackPopupMenu($hMenu, $mlist)
			; MsgBox(0, 'Menu' & '', @CRLF & $wParam & @CRLF & $lParam)
			_GUICtrlMenu_DestroyMenu($hMenu)
	EndSwitch

	Return True
EndFunc   ;==>WM_CONTEXTMENU_111


Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
	; MsgBox(0, 'Command' & '',@CRLF & $wParam & @CRLF & $lParam)
	#forceref $hWnd, $iMsg, $lParam
	Switch $wParam
		Case $idOpen
			MsgBox(0, '' & '', 'Открыть')
		Case $idSave
			MsgBox(0, '' & '', 'Сохранить')
		Case $idInfo
			MsgBox(0, '' & '', 'Информация')
	EndSwitch
EndFunc   ;==>WM_COMMAND
в "$wParam" содержится дескриптор окна или элемента, на котором вызвано меню, в зависимости от него и создавайте нужные пункты меню.
 
Автор
А

Атос

Новичок
Сообщения
85
Репутация
0
ra4o, почему-то теперь не срабатывают вызовы функции.
 
A

Alofa

Гость
Код:
#include <GuiMenu.au3>
Global $idOpen = 111, $idSave = 222, $idInfo = 333, $idInfo_2 = 444

Global $hGUI = GUICreate('111')
Global $hListViewMenu = GUICtrlGetHandle(GUICtrlCreateListView("QQQQQQ", 0, 0, 200, 327))

$hMenu_1 = _GUICtrlMenu_CreatePopup()
_GUICtrlMenu_InsertMenuItem($hMenu_1, 0, "1111111", $idOpen)
_GUICtrlMenu_InsertMenuItem($hMenu_1, 1, "2222222", $idSave)
_GUICtrlMenu_InsertMenuItem($hMenu_1, 2, "", 0)
_GUICtrlMenu_InsertMenuItem($hMenu_1, 3, "3333333", $idInfo)

$hMenu_2 = _GUICtrlMenu_CreatePopup()
_GUICtrlMenu_InsertMenuItem($hMenu_2, 3, "AAAAAAA", $idInfo_2)

GUISetState()
GUIRegisterMsg(0x0111, "WM_COMMAND")
GUIRegisterMsg(0x007B, "WM_CONTEXTMENU")
Do
Until GUIGetMsg() = -3

Func WM_CONTEXTMENU($hWnd, $Msg, $wParam, $lParam)
	Switch $wParam
		Case $hListViewMenu
			_GUICtrlMenu_TrackPopupMenu($hMenu_1, $hWnd)
		Case $hGUI
			_GUICtrlMenu_TrackPopupMenu($hMenu_2, $hWnd)
	EndSwitch
EndFunc   ;==>WM_CONTEXTMENU

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
	Switch BitAND($wParam, 0x0000FFFF)
		Case $idOpen
			MsgBox(0, Default, '$idOpen = ' & $idOpen, 0.5)
		Case $idSave
			MsgBox(0, Default, '$idSave = ' & $idSave, 0.5)
		Case $idInfo_2
			MsgBox(0, Default, '$idInfo_2 = ' & $idInfo_2, 0.5)
	EndSwitch
EndFunc   ;==>WM_COMMAND
 
Автор
А

Атос

Новичок
Сообщения
85
Репутация
0
У меня почему-то не получается вызвать функцию.


Код:
#include <GuiMenu.au3>
Global $id_111, $id_222, $id_333, $id_444
Global $hGUI = GUICreate('111')
Global $hListViewMenu = GUICtrlCreateListView("QQQQQQ", 0, 0, 200, 327)
Global $hListViewMenu1 = GUICtrlGetHandle($hListViewMenu)
$hMenu_1 = _GUICtrlMenu_CreatePopup()
; _GUICtrlMenu_InsertMenuItem($hMenu_1, 2, "", 0)
_GUICtrlMenu_InsertMenuItem($hMenu_1, 3, "111111", $id_111)
_GUICtrlMenu_InsertMenuItem($hMenu_1, 3, "222222", $id_222)
_GUICtrlMenu_InsertMenuItem($hMenu_1, 3, "333333")
; _GUICtrlMenu_InsertMenuItem($hMenu_1, 3, "Sport", _Show())
$hMenu_2 = _GUICtrlMenu_CreatePopup()
_GUICtrlMenu_InsertMenuItem($hMenu_2, 0, "AAAAAAAAA__444", $id_444)
GUISetState()
GUIRegisterMsg(0x0111, "WM_COMMAND")
GUIRegisterMsg(0x007B, "WM_CONTEXTMENU")
Do
Until GUIGetMsg() = -3

Func WM_CONTEXTMENU($hWnd, $Msg, $wParam, $lParam)
    Switch $wParam
        Case $hListViewMenu1
            _GUICtrlMenu_TrackPopupMenu($hMenu_1, $hWnd)
        Case $hGUI
            _GUICtrlMenu_TrackPopupMenu($hMenu_2, $hWnd)
    EndSwitch
EndFunc

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    Switch BitAND($wParam, 0x0000FFFF)
        Case $id_111
            _Show(111)
        Case $id_222
            _Show(22222222)
        Case $id_333
            _Show(3333333333333333)
        Case $id_333
            _Show(44444444444444444444444444)
    EndSwitch
EndFunc

Func _Show($a = 'Sport')
MsgBox(0, 'Title', $a, 1)
EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
у вас в коде каша
пробуй так
вместо
Код:
GUICtrlSetData($LBL, '')

запиши свою функцию
Код:
#include <GuiMenu.au3>
Global Enum $id_111 = 1000, $id_222, $id_333, $id_444
Global $hGUI = GUICreate('111')
Global $hListViewMenu = GUICtrlCreateListView("QQQQQQ", 0, 0, 200, 327)
Global $LBL = GUICtrlCreateLabel('', 205, 10, 200, 20)
Global $hListViewMenu1 = GUICtrlGetHandle($hListViewMenu)
GUISetState()
GUIRegisterMsg(0x0111, "WM_COMMAND")
GUIRegisterMsg(0x007B, "WM_CONTEXTMENU")
Do
Until GUIGetMsg() = -3

Func WM_CONTEXTMENU($hWnd, $iMsg, $wParam, $lParam)
	#forceref $hWnd, $iMsg, $lParam
	Switch $wParam
		Case $hGUI
			_WinMenu($hWnd)
		Case $hListViewMenu1
			_ItemMenu($hWnd)
	EndSwitch
	Return True
EndFunc   ;==>WM_CONTEXTMENU

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
	#forceref $hWnd, $iMsg, $lParam
	Switch _WinAPI_LoWord($wParam)
		Case $id_111
			GUICtrlSetData($LBL, 'Выбран первый пункт')
		Case $id_222
			GUICtrlSetData($LBL, 'Выбран второй пункт')
		Case $id_333
			GUICtrlSetData($LBL, 'Выбран третий пункт')
		Case $id_444
			GUICtrlSetData($LBL, 'Выбрано меню окна')
	EndSwitch
EndFunc   ;==>WM_COMMAND

Func _ItemMenu($hw)
	Local $hMenu
	$hMenu = _GUICtrlMenu_CreatePopup()
	_GUICtrlMenu_InsertMenuItem($hMenu, 0, "Первый пункт", $id_111)
	_GUICtrlMenu_InsertMenuItem($hMenu, 1, "Второй пункт", $id_222)
	_GUICtrlMenu_InsertMenuItem($hMenu, 2, "Третий пункт", $id_333)
	_GUICtrlMenu_TrackPopupMenu($hMenu, $hw)
	_GUICtrlMenu_DestroyMenu($hMenu)
EndFunc   ;==>_ItemMenu

Func _WinMenu($hw)
	Local $hMenu
	$hMenu = _GUICtrlMenu_CreatePopup()
	_GUICtrlMenu_InsertMenuItem($hMenu, 0, "Меню окна", $id_444)
	_GUICtrlMenu_TrackPopupMenu($hMenu, $hw)
	_GUICtrlMenu_DestroyMenu($hMenu)
EndFunc   ;==>_WinMenu
 
A

Alofa

Гость
Атос сказал(а):
... не получается вызвать функцию.
Подумайте, почему я прописал так:
Код:
Global $idOpen = 111, $idSave = 222, $idInfo = 333, $idInfo_2 = 444

и где это пригодится в коде?
 
Автор
А

Атос

Новичок
Сообщения
85
Репутация
0
joiner, мне надо что-нибудь проще.

Мне надо просто вызвать нужную функцию.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Атос [?]
мне надо что-нибудь проще.
Атос, я написал такой же код, как у тебя, только сформировал отдельно функции меню. у тебя они разбросаны по коду.
что может быть проще?
смотри справку по текущей версии языка. да, там на английском, но есть примеры.



Добавлено:
Сообщение автоматически объединено:

у тебя в коде могут появиться еще элементы и ты захочешь им присвоить отдельные контекстные меню. по примеру моего кода ты сможешь это сделать.
старайся заключать законченные действия в функции. Так будет проще их менять в будущем
 
Автор
А

Атос

Новичок
Сообщения
85
Репутация
0
Ребята, подскажите, а как мне получать индекс элемента?

Код:
#include <GuiMenu.au3>
ma()
Func ma()
Global Enum $id_aaa = 1000, $id_bbb, $id_ccc, $id_ddd
Global $hList = GUICreate('111')
Global $mlist = GUICtrlCreateListView("QQQQQQ", 0, 0, 200, 327)
Global $mlisth = GUICtrlGetHandle($mlist)
Local $item1 = GUICtrlCreateListViewItem("VVV", $mlist)
Local $item2 = GUICtrlCreateListViewItem("WWW", $mlist)
Local $item3 = GUICtrlCreateListViewItem("XXX", $mlist)
Local $item4 = GUICtrlCreateListViewItem("YYY", $mlist)
Local $item5 = GUICtrlCreateListViewItem("ZZZ", $mlist)
GUISetState()
GUIRegisterMsg(0x0111, "WM_COMMAND")
GUIRegisterMsg(0x007B, "WM_CONTEXTMENU")
Do
Until GUIGetMsg() = -3
EndFunc

Func WM_CONTEXTMENU($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $lParam
;MsgBox(0, 'WM_CONTEXTMENU     ' & $hWnd, $iMsg & '' & '' & @CRLF & $wParam & @CRLF & $lParam)
    Switch $wParam
        Case $hList
            _WinMenu($hWnd)
        Case $mlisth
            _ItemMenu($hWnd)
    EndSwitch
    Return True
EndFunc

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $lParam
;MsgBox(0, 'WM_COMMAND      ' & $hWnd, $iMsg & '' & '' & @CRLF & $wParam & @CRLF & $lParam)
    Switch _WinAPI_LoWord($wParam)
        Case $id_aaa
            _Show('111')
        Case $id_bbb
            _Show('22222222')
        Case $id_ccc
            _Show('3333333333333333')
        Case $id_ddd
            _Show('ffwefwefw')
    EndSwitch
EndFunc

Func _ItemMenu($hw)
    Local $hMenu
    $hMenu = _GUICtrlMenu_CreatePopup()
    _GUICtrlMenu_InsertMenuItem($hMenu, 0, "Первый пункт", $id_aaa)
    _GUICtrlMenu_InsertMenuItem($hMenu, 1, "Второй пункт", $id_bbb)
    _GUICtrlMenu_InsertMenuItem($hMenu, 2, "Третий пункт", $id_ccc)
    _GUICtrlMenu_InsertMenuItem($hMenu, 3, "4 пункт", $id_ddd)
    _GUICtrlMenu_TrackPopupMenu($hMenu, $hw)
    _GUICtrlMenu_DestroyMenu($hMenu)
EndFunc

Func _WinMenu($hw)
    Local $hMenu
    $hMenu = _GUICtrlMenu_CreatePopup()
    _GUICtrlMenu_InsertMenuItem($hMenu, 0, "Меню окна", $id_555)
    _GUICtrlMenu_TrackPopupMenu($hMenu, $hw)
    _GUICtrlMenu_DestroyMenu($hMenu)
EndFunc
 
Func _Show($a = 'Sport')
MsgBox(0, 'Title', $a, 1)
EndFunc


Я так понял, что WM_CONTEXTMENU не содержит такую информацию.
А WM_CONTEXTMENU, вроде как, содержит.
Но я что-то не могу доехать, как мне получать индекс/имя кликнутого элемента.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Я так понял - индекс элемента LisView ? Вот так можно :
Код:
#include <GuiMenu.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>

Global $IndexLV
ma()
Func ma()
Global Enum $id_aaa = 1000, $id_bbb, $id_ccc, $id_ddd, $id_555
Global $hList = GUICreate('111')
Global $mlist = GUICtrlCreateListView("QQQQQQ", 0, 0, 200, 327)
Global $mlisth = GUICtrlGetHandle($mlist)
Local $item1 = GUICtrlCreateListViewItem("VVV", $mlist)
Local $item2 = GUICtrlCreateListViewItem("WWW", $mlist)
Local $item3 = GUICtrlCreateListViewItem("XXX", $mlist)
Local $item4 = GUICtrlCreateListViewItem("YYY", $mlist)
Local $item5 = GUICtrlCreateListViewItem("ZZZ", $mlist)
GUISetState()
GUIRegisterMsg(0x0111, "WM_COMMAND")
GUIRegisterMsg(0x007B, "WM_CONTEXTMENU")
GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
Do
Until GUIGetMsg() = -3
EndFunc

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
	#forceref $hWnd, $iMsg, $wParam
    $IndexLV=-1
	Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $tInfo

	$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
	$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
	$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
	$iCode = DllStructGetData($tNMHDR, "Code")
	Switch $hWndFrom
		Case $mlisth
			Switch $iCode

				Case $NM_RCLICK ; правый клик мышкой по пункту
					$tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
					$IndexLV = DllStructGetData($tInfo, "Index")
			EndSwitch

	EndSwitch

	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY


Func WM_CONTEXTMENU($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $lParam
;MsgBox(0, 'WM_CONTEXTMENU     ' & $hWnd, $iMsg & '' & '' & @CRLF & $wParam & @CRLF & $lParam)
    Switch $wParam
        Case $hList
            _WinMenu($hWnd)
        Case $mlisth
            _ItemMenu($hWnd)
    EndSwitch
    Return True
EndFunc

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $lParam
;MsgBox(0, 'WM_COMMAND      ' & $hWnd, $iMsg & '' & '' & @CRLF & $wParam & @CRLF & $lParam)
    Switch _WinAPI_LoWord($wParam)
        Case $id_aaa
            _Show('111')
        Case $id_bbb
            _Show('22222222')
        Case $id_ccc
            _Show('3333333333333333')
        Case $id_ddd
            _Show('ffwefwefw')
    EndSwitch
EndFunc

Func _ItemMenu($hw)
    Local $hMenu
    $hMenu = _GUICtrlMenu_CreatePopup()
    _GUICtrlMenu_InsertMenuItem($hMenu, 0, "Первый пункт", $id_aaa)
    _GUICtrlMenu_InsertMenuItem($hMenu, 1, "Второй пункт", $id_bbb)
    _GUICtrlMenu_InsertMenuItem($hMenu, 2, "Третий пункт", $id_ccc)
    _GUICtrlMenu_InsertMenuItem($hMenu, 3, "4 пункт", $id_ddd)
    _GUICtrlMenu_TrackPopupMenu($hMenu, $hw)
    _GUICtrlMenu_DestroyMenu($hMenu)
EndFunc

Func _WinMenu($hw)
    Local $hMenu
    $hMenu = _GUICtrlMenu_CreatePopup()
    _GUICtrlMenu_InsertMenuItem($hMenu, 0, "Меню окна", $id_555)
    _GUICtrlMenu_TrackPopupMenu($hMenu, $hw)
    _GUICtrlMenu_DestroyMenu($hMenu)
EndFunc

Func _Show($a = 'Sport')
MsgBox(0, 'Title', $a&@CR&'Index = '&$IndexLV, 1)
EndFunc
Если нужно имя - по индексу не сложно и его получить.
 
Верх