Что нового

Динамический фильтр элементов в динамически созданном меню

Suppir

Продвинутый
Сообщения
967
Репутация
62
Добрый день!

Программа создает меню в трее динамическим способом из элементов, прописанных в ini-файле.

Но проблема - элементов в меню слишком много. Их сложно искать по закладкам. Возникла идея добавить динамический фильтр в контекстное меню.

Суть: пользователь кликает правой мышкой по иконке программы - появляется меню. В этом меню есть стандартные элементы, которые пользователь может выбрать мышкой. Самый нижний элемент меню представляет собой inputbox с фильтром. Пользователь вводит в этот inputbox слова (или части слов), а при этом все меню динамически перестраивается - таким образом, чтобы оставались только элементы, в которых есть слова, указанные в фильтре. Как думаете, реально ли такое написать на AutoIt? У кого есть идеи, просьба откликнуться.

Я приложил текст функции (работающей) и ini-файл в архиве.
http://files.mail.ru/1F7069DA88A74A8295412AFD1F3B50D6

Сама функция выглядит так:

Код:
#include <GuiRichEdit.au3>
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <Constants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Include <GuiButton.au3>
#include <GuiMenu.au3>
#Include <GUIEdit.au3>
#include <Date.au3>
#include <File.au3>
#include <Array.au3>
#Include <Timers.au3>
#Include <Misc.au3>
#Include <Clipboard.au3>
#Include <String.au3>

Opt("GUIOnEventMode", 1)
Opt("TrayOnEventMode", 1)
Opt("SendAttachMode", 1)
Opt("TrayMenuMode", 3)
Opt("TrayAutoPause", 0)
Opt("WinWaitDelay", 0)
Opt("WinTextMatchMode", 2)
Opt("WinTitleMatchMode", 2)
Opt("WinSearchChildren", 1)
Opt("SendKeyDownDelay", 50)

Global $sCall_FuncName = "Link_Event"

TraySetOnEvent ($TRAY_EVENT_PRIMARYDOWN, "FastMenu")
TraySetClick (8)
$trayExit = TrayCreateItem("Выход")
TrayItemSetOnEvent(-1, "_Exit")

while(1)
	Sleep(50)
WEnd

;~ Меню быстрых ссылок
Func FastMenu()
	Local $hDlg, $cDummy, $nContextMenu, $hContextMenu, $nHide_MItem
	Local $aIni, $aMenuItems, $nExit_MItem, $hTimer, $aMousePos, $nResult
	Local $submenues
	Local $subMenuItems[1000][2]

	$hDlg = GUICreate("", 1, 1, 0, 0, $WS_POPUP, $WS_EX_TOOLWINDOW)
	$cDummy = GUICtrlCreateDummy()
	$nContextMenu = GUICtrlCreateContextMenu($cDummy)
	$hContextMenu = GUICtrlGetHandle($nContextMenu)

	$aIni = IniReadSection(@ScriptDir & "\1.ini", "БЫСТРЫЕ ССЫЛКИ")
	Dim $aMenuItems[$aIni[0][0]+1]
	$aMenuItems[0] = $aIni[0][0]
	For $i = 1 To $aIni[0][0]
		local $aMenu=StringRegExp ( $aIni[$i][0] ,"([^>]*)\s*>\s*([^>]*)\s*", 3)
		if @error = 0 Then
			If Not StringInStr ($submenues, $aMenu[0]) Then
				$hMenu=GUICtrlCreateMenu($aMenu[0], $nContextMenu)
				$submenues = $submenues & $aMenu[0]
			EndIf
			$aMenuItems[$i] = GUICtrlCreateMenuItem($aMenu[1], $hMenu)
		Else
			$aMenuItems[$i] = GUICtrlCreateMenuItem($aIni[$i][0], $nContextMenu)
		EndIf
	Next

	GUISetState(@SW_SHOW, $hDlg)

	$aMousePos = MouseGetPos()
    $hTimer = _Timer_SetTimer($hDlg, 100, "CheckPressed_Proc")
    $nResult = _GUICtrlMenu_TrackPopupMenu($hContextMenu, $hDlg, $aMousePos[0] - 27, $aMousePos[1] - 12, 1, 1, 2, 1)
    _Timer_KillTimer($hDlg, $hTimer)

    sleep(70)
    Switch $nResult
        Case $aMenuItems[1] To $aMenuItems[$aMenuItems[0]]
            For $i = 1 To $aMenuItems[0]
                If $nResult = $aMenuItems[$i] Then
                    Call($sCall_FuncName, $aIni[$i][1])
                    ExitLoop
                EndIf
            Next
		EndSwitch
EndFunc

;~ Нужно для меню быстрых ссылок
Func CheckPressed_Proc($hWnd, $Msg, $iIDTimer, $dwTime)
 	If _IsPressed(01) Then $sCall_FuncName = "CopyLink"
EndFunc

;~ Нужно для меню быстрых ссылок
Func CopyLink($Msg)
	ClipPut($Msg)
	Say("Помещено в буфер: " & $Msg)
EndFunc

;~ Сообщение в трее
Func Say($Say, $SleepTime = 1500)
	TrayTip ("", $Say, 1)
	sleep($SleepTime)
	TrayTip("", "", 0)
EndFunc

Func _Exit()
	Exit
EndFunc
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Suppir [?]
Как думаете, реально ли такое написать на AutoIt?
Оно уже написано, в расширенной версии SciTE есть SciTEJump, при вводе в строку поиска фильтр убирает несоответствующие фильтру по мере набора.

И вот ещё
http://autoit-script.ru/index.php/topic,13743.msg87086.html#msg87086
 
Верх