Что нового

Элементы GUI Создание кастомного контекстного меню окна и элементов

joiner

Модератор
Локальный модератор
Сообщения
3 354
Репутация
581
Версия AutoIt
3.3.12.0
Версия
0.2
AutoIT 3.3.12.0+
SDMenuPopup.au3 это библиотека для создания кастомного контекстного меню. Возможность устанавливать свой шрифт для каждого подменю, цвет фона меню и отдельно строчек меню. По умолчанию строки создаются с прозрачностью.
Можно назначать функции пунктам меню непосредственно при создании меню, а можно привязать функции позднее. Возможно создавать меню с иконками и без них в одном вызове
Выборочная подсветка пунктов
функция _GetStringDimensions взята с этого форума.
в архиве библиотека и пример
Список пользовательских функций
_SD_MenuCreate()
_SD_MenuCreateItem()
_SD_CreatePopupMenu()
_SD_CallFuncFromItem()
Код:
#include <SDMenuPopup.au3>

Global $stext = '', $iIDItemMenu, $iIDItemMenu2, $iFL, $iIDItemMenu11

Global $Form1 = GUICreate('Form1', 500, 200, -1, -1, $WS_POPUP)
GUICtrlCreateLabel('  Title', 0, 0, 480, 20, $SS_CENTERIMAGE, $GUI_WS_EX_PARENTDRAG)
GUICtrlSetBkColor(-1, 0x808080)
GUICtrlSetColor(-1, 0xF0F8Ff)
GUICtrlSetFont(-1, 12, 400, 0, 'Ravie')
Global $Close = GUICtrlCreateLabel('X', 480, 0, 20, 20, $SS_CENTERIMAGE)
GUICtrlSetBkColor(-1, 0x808080)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetFont(-1, 12, 400, 0, 'Ravie')
Global $BT = GUICtrlCreateButton('Кнопка раз', 10, 40, 100, 20)

Global $BT1 = GUICtrlCreateLabel('Строка', 10, 70, 100, 20)

_GuiSetDropShadow($Form1)
GUISetState()
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
GUIRegisterMsg($WM_SETCURSOR, 'WM_SETCURSOR')

While 1
;~     If $iFL Then; к варианту 2
;~         $iFL = 0
;~         _flsf()
;~     EndIf
    _SD_CallFuncFromItem();вариант 1
    Switch GUIGetMsg()
        Case -3
            Exit
        Case $Close
            Exit
        Case $BT
            _Menu()
    EndSwitch
WEnd

Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
    Local $nID = BitAND($wParam, 0x0000FFFF) ; _WinAPI_LoWord
;~     Local $iItemId = _SD_CallFuncFromItem($nID, 1); вариант 2
;~     If $iItemId Then
;~         Switch $iItemId
;~             Case $iIDItemMenu
;~                 ConsoleWrite('func 1 exec var 3 from item $iIDItemMenu' & @LF)
;~             Case $iIDItemMenu2
;~                 $iFL = 1
;~         EndSwitch
;~     Else
;~     EndIf
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

Func WM_SETCURSOR($hWnd, $Msg, $wParam, $lParam)
    Local $MouseMsg = BitShift($lParam, 16) ; _WinAPI_HiWord
    If $hWnd = $Form1 Then
        Switch $MouseMsg
            Case 517, 520;клик колесиком мыши или правой кнопкой в окне Form1
                _Menu()
        EndSwitch
    EndIf
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SETCURSOR

Func _Menu()
    Local $Menu, $item, $Menu1, $Menu2, $Menu3, $iIDItemMenu1, $NT

    $Menu = _SD_MenuCreate(1, '', '', '', '10,400,0,Ravie')
    _SD_MenuCreateItem($Menu, 'Разделитель - 1', '', '', '', '#')
    _SD_MenuCreateItem($Menu, 'Пункт 1', 0xff0000, -2, 'shell32.dll,25')
    _SD_MenuCreateItem($Menu, 'Пункт 2', '', -2, 'shell32.dll,26')
    $iIDItemMenu = _SD_MenuCreateItem($Menu, '$iIDItemMenu вариант WM_', 0xff0000, -2, 'shell32.dll,28')
    _SD_MenuCreateItem($Menu, '', '', '', '', '#')
    _SD_MenuCreateItem($Menu, 'Item menu', 0xff0000, -2, 'shell32.dll,27')
    $item = _SD_MenuCreateItem($Menu, 'Next Menu Popup', 0xFFFFFF, 0xff0000, 'shell32.dll,20')
    _SD_MenuCreateItem($Menu, 'NewItem 3', 0xff0000, -2, 'shell32.dll,28')
    If $stext <> '' Then
        _SD_MenuCreateItem($Menu, $stext, 0xff0000, -2, 'shell32.dll,22', '_FLPD')
    Else
        _SD_MenuCreateItem($Menu, 'NewItem 4 + func', 0xff0000, -2, 'shell32.dll,22', '_FLPD')
    EndIf

    $Menu1 = _SD_MenuCreate(0, $Menu, $item); подменю без иконок
    $NT = _SD_MenuCreateItem($Menu1, 'Пункт с подменю 1', 0xff0000, '', 'shell32.dll,12')
    _SD_MenuCreateItem($Menu1, '', '', '', '', '#')
    $iIDItemMenu1 = _SD_MenuCreateItem($Menu1, 'Пункт с подменю 2', 0x0000ff, -2, 'shell32.dll,10')

    $Menu2 = _SD_MenuCreate(1, $Menu1, $NT); подменю без иконок. иконки не указаны, хотя и установлен флаг 1 в параметре функции
    _SD_MenuCreateItem($Menu2, 'Первый пункт второго подменю', 0xFFFFFF, 0x0000ff)
    _SD_MenuCreateItem($Menu2, 'Item with func варианты ', 0xFFFFFF, 0xff0000, '', '_func')
    _SD_MenuCreateItem($Menu2, 'Item + func варианты ', 0xFFFFFF, 0x000000, '', '_func')

    $Menu3 = _SD_MenuCreate(1, $Menu1, $iIDItemMenu1);, '', '12,400,0,arial')
    $iIDItemMenu2 = _SD_MenuCreateItem($Menu3, '$iIDItemMenu2 вариант WM_', 0xFFFFAA, 0xB22222, 'shell32.dll,54')
    _SD_MenuCreateItem($Menu3, 'Item with func варианты ', 0xFFFFFF, 0xFF6347, 'shell32.dll,45', '_msg')
    _SD_MenuCreateItem($Menu3, 'Item + func варианты ', 0xDCDCDC, 0x4B0082, '', '_msg')
    For $i = 1 To 20
        If $i = 1 Then
            _SD_MenuCreateItem($Menu3, 'Пункты 1', 0xCC8080, '', '', '#')
            ContinueLoop
        EndIf
        If $i = 11 Then
            _SD_MenuCreateItem($Menu3, '', 0x0000FF, '', '', '#')
            ContinueLoop
        EndIf
        Switch $i
            Case 13, 15, 17, 19
                _SD_MenuCreateItem($Menu3, 'Item ' & $i, '', '', 'shell32.dll,' & $i, '_func')
            Case 12
                _SD_MenuCreateItem($Menu3, 'Пункты 2', 0xFF0000, '', '', '#')
            Case 14, 16, 18, 20
                _SD_MenuCreateItem($Menu3, 'Item ' & $i, '', '', '', '_func')
            Case Else
                _SD_MenuCreateItem($Menu3, 'Item ' & $i, '', '', 'shell32.dll,' & $i, '_func')
        EndSwitch
    Next
    _SD_CreatePopupMenu($Form1, $Menu)
EndFunc   ;==>_Menu

Func _flsf()
    Local $fslf = FileSelectFolder('', '', 0, '', $Form1)
    If @error Then Return
EndFunc   ;==>_flsf

Func _func()
    ConsoleWrite('execute func ctrl menu ' & Random(1, 200, 1) & @LF)
EndFunc   ;==>_func

Func _FLPD()
    $stext = FileOpenDialog('', '', '(*.*)', 0, '', $Form1)
    If @error Then $stext = ''
EndFunc   ;==>_FLPD

Func _msg()
    MsgBox(64, '', 'execute func ctrl menu', 0, $Form1)
EndFunc   ;==>_msg
Сообщение автоматически объединено:

обновление библиотеки
добавлена настраиваемая подсветка пунктов при наведении мышью
добавлена возможность создавать разделитель между пунктами одного меню
исправлены некоторые ошибки
исправлен пример
 
Автор
joiner
Источник
Ссылка на источник

Вложения

Последнее редактирование:
Верх