Что нового

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

joiner

Модератор
Локальный модератор
Сообщения
3,422
Репутация
597
Версия 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
Источник
Ссылка на источник

Вложения

  • Безымянный.jpg
    Безымянный.jpg
    58 КБ · Просмотры: 64
  • Безымянный1.jpg
    Безымянный1.jpg
    91.2 КБ · Просмотры: 61
  • SDMenuPopup.7z
    6.7 КБ · Просмотры: 21
Последнее редактирование:
Верх