Что нового

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

Атос

Новичок
Сообщения
85
Репутация
0
Привет.
Как мне сделать так, чтобы пункты контекстного меню имели другие подпункты?
В данном примере, надо сделать так, чтобы "AAA" - была подпунктом для "111", "BBB" для "222" и "CCC" для "333".


Код:
#include <GUIConstantsEx.au3>
#include <GuiMenu.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
Global Enum $e_idOpen = 1000, $e_idSave, $e_idInfo
Example()
Func Example()
	GUICreate("Menu", 400, 300)
	GUISetState(@SW_SHOW)
	GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
	GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTMENU")
	Do
	Until GUIGetMsg() = $GUI_EVENT_CLOSE
EndFunc

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
	#forceref $hWnd, $iMsg, $lParam
	Switch $wParam
		Case $e_idOpen
			_WinAPI_ShowMsg("Open")
		Case $e_idSave
			_WinAPI_ShowMsg("Save")
		Case $e_idInfo
			_WinAPI_ShowMsg("Info")
	EndSwitch
EndFunc

Func WM_CONTEXTMENU($hWnd, $iMsg, $wParam, $lParam)
	#forceref $hWnd, $iMsg, $lParam
	Local $hMenu
	$hMenu = _GUICtrlMenu_CreatePopup()
	_GUICtrlMenu_InsertMenuItem($hMenu, 0, "111", $e_idOpen)
	_GUICtrlMenu_InsertMenuItem($hMenu, 0, "AAA", $e_idOpen)
	_GUICtrlMenu_InsertMenuItem($hMenu, 1, "222", $e_idSave)
	_GUICtrlMenu_InsertMenuItem($hMenu, 0, "BBB", $e_idOpen)
	_GUICtrlMenu_InsertMenuItem($hMenu, 3, "", 0)
	_GUICtrlMenu_InsertMenuItem($hMenu, 3, "333", $e_idInfo)
	_GUICtrlMenu_InsertMenuItem($hMenu, 0, "CCC", $e_idInfo)
	_GUICtrlMenu_TrackPopupMenu($hMenu, $wParam)
	_GUICtrlMenu_DestroyMenu($hMenu)
	Return True
EndFunc
 

Andrey_A

Продвинутый
Сообщения
323
Репутация
68
Атос
Код:
#include <GUIConstantsEx.au3>
#include <GuiMenu.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
Global Enum $e_idOpen = 1000, $e_idSave, $e_idInfo
Example()
Func Example()
    GUICreate("Menu", 400, 300)
    GUISetState(@SW_SHOW)
    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
    GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTMENU")
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
EndFunc

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $lParam
    Switch $wParam
        Case $e_idOpen
            _WinAPI_ShowMsg("Open")
        Case $e_idSave
            _WinAPI_ShowMsg("Save")
        Case $e_idInfo
            _WinAPI_ShowMsg("Info")
    EndSwitch
EndFunc

Func WM_CONTEXTMENU($hWnd, $iMsg, $wParam, $lParam)
    #forceref $hWnd, $iMsg, $lParam
    Local $hMenu,$hMenu2,$hMenu3,$hMenu4
    $hMenu = _GUICtrlMenu_CreatePopup()
    __SetMenuColor($hMenu,0xE0EEE0)
    
    $hMenu2 = _GUICtrlMenu_CreatePopup()
    __SetMenuColor($hMenu2,0x5EF7F7)
    _GUICtrlMenu_InsertMenuItem($hMenu, 0, "111", $e_idOpen,$hMenu2)
    _Set_Menu_Icon($hMenu,0,5)
    _GUICtrlMenu_InsertMenuItem($hMenu2, 0, "AAA 0",$e_idOpen)
    _Set_Menu_Icon($hMenu2,0,247)
    _GUICtrlMenu_InsertMenuItem($hMenu2, 1, "AAA 1",$e_idOpen)
    _Set_Menu_Icon($hMenu2,1,248)
    
    $hMenu3 = _GUICtrlMenu_CreatePopup()
    __SetMenuColor($hMenu3,0x01FB7D)
    _GUICtrlMenu_InsertMenuItem($hMenu, 1, "222", $e_idSave,$hMenu3)
    _Set_Menu_Icon($hMenu,1,5)
    _GUICtrlMenu_InsertMenuItem($hMenu3, 0, "BBB 0", $e_idOpen)
    _Set_Menu_Icon($hMenu3,0,23)
    _GUICtrlMenu_InsertMenuItem($hMenu3, 1, "BBB 1", $e_idOpen)
    _Set_Menu_Icon($hMenu3,1,44)
    
    _GUICtrlMenu_InsertMenuItem($hMenu, 2, "", 0)
    
    $hMenu4 = _GUICtrlMenu_CreatePopup()
    __SetMenuColor($hMenu4,0x7F00FF)
    _GUICtrlMenu_InsertMenuItem($hMenu, 3, "333", $e_idInfo,$hMenu4)
    _Set_Menu_Icon($hMenu,3,5)
    _GUICtrlMenu_InsertMenuItem($hMenu4, 0, "CCC", $e_idInfo)
    _Set_Menu_Icon($hMenu4,0,42)
    
    _GUICtrlMenu_TrackPopupMenu($hMenu, $wParam)
    _GUICtrlMenu_DestroyMenu($hMenu)
    Return True
EndFunc
 
Func _Set_Menu_Icon($hMenu,$iIndex,$n,$sFile='shell32.dll')
  _GUICtrlMenu_SetItemBmp($hMenu,$iIndex,_WinAPI_CreateBitmapFromIcon($sFile,$n-1,16,16))
EndFunc

Func _WinAPI_CreateBitmapFromIcon($sFile,$iIndex=1,$iWidth=16,$iHeight=16)
  $aRet=DllCall('shell32.dll','long','ExtractAssociatedIcon','int',0,'str',$sFile,'word*',$iIndex)
  If @error Then Return SetError(@error,@extended,0)
  Local $hIcon=$aRet[0],$hDC=_WinAPI_GetDC(0),$b=_WinAPI_CreateCompatibleDC($hDC),$hBitmap=_WinAPI_CreateSolidBitmap(0,_WinAPI_GetSysColor(4),$iWidth,$iHeight),$h=_WinAPI_SelectObject($b,$hBitmap),$0=_WinAPI_DrawIconEx($b,0,0,$hIcon,$iWidth,$iHeight,0,0,3)&_WinAPI_DestroyIcon($hIcon)&_WinAPI_SelectObject($b,$h)&_WinAPI_ReleaseDC(0,$hDC)&_WinAPI_DeleteDC($b)
  Return $hBitmap
EndFunc

Func __SetMenuColor($hWnd,$iBRG)
  Local $hBrush=DllCall('gdi32.dll','hwnd','CreateSolidBrush','int',$iBRG)[0],$fLine=DllStructCreate('dword;dword;dword;uint;ptr;dword;ptr'),$0=DllStructSetData($fLine,1,DllStructGetSize($fLine))&DllStructSetData($fLine,2,BitOR(0x80000000,2))&DllStructSetData($fLine,5,$hBrush)&DllCall('user32.dll','int','SetMenuInfo','hwnd',$hWnd,'ptr',DllStructGetPtr($fLine))
EndFunc
 
Верх