Как создать выпадающий список своих программ в контекстном меню и упорядочить их по категориям
Эта статья является неким продолжением серии статей о настройке контекстного меню рабочего стола.
Если вам здесь будет что-либо не понятно, тогда прочитайте другие статьи, в которых описывались данные действия.
Размещать необходимые значки на панели задач – далеко не единственный способ повысить удобство работы за компьютером. Все больше у продвинутых пользователей получает распространение идея размещать часто используемые программы в контекстном меню, и на рабочем столе таким способом чтобы они не занимали много места и, в то же время были всегда под рукой. Почему именно у продвинутых пользователей? – потому что для того, что бы осуществить эту идею необходимо покопаться в реестре операционной системы, и покопаться немало. На такой шаг отважится не каждый, и это вполне объяснимо. Поэтому эта статья и предназначена для более узкого круга людей, для тех, кто знает, что делает, уверен в себе и своих силах. Способ является универсальным, поэтому подойдёт не только владельцам Windows 8.1, но и пользователям прошлых версий данной ОС, в частности Windows 7. Наиболее удобным вариантом размещения программ в контекстном меню является способ создания вкладок, которые, в свою очередь, показывают своё собственное раскрывающееся меню.
Как можно заметить на рисунке, в контекстном меню значки не просто разбросаны в разнобой, а укомплектованы по категориям. Добиться этого не сложно, нужно лишь внимательно следовать инструкции. Для начала, необходимо зарегистрировать те самые программы, которые будут запускаться из контекстной вкладки. Для этого следует открыть «Редактор реестра» и перейти по адресу;
Как открыть редактор реестра описывалось в предыдущей статье данного цикла (ссылка вверху). Именно здесь нужно создать «адреса» тех самых программ. Для этого необходимо в разделе «Shell» для каждой программы создать свой подраздел. Названия подразделов – только английскими буквами, и, желательно, небольшое название, что бы легче было запомнить в дальнейшем.
В каждом таком подразделе будет строковый параметр «По умолчанию» — туда следует вбить название, которое и будет отображаться в контекстном меню. Здесь же можно создать параметр «Icon» и адрес любой желаемой иконки. Теперь необходимо в каждом подразделе создать свой подраздел с именем «command». В нем будет один единственный строковый параметр «По умолчанию», в котором следует занести адрес исполняемого файла программы.
Ну вот, полдела сделано. Теперь, когда программы прописаны в реестре, можно приступать к созданию меню. Для этого необходимо найти в редакторе реестра ветку «HKEY_CLASSES_ROOT».
После этого следует решить – где будет появляться контекстное меню. Если на рабочем столе – то перейти нужно по адресу
Если в папке «Этот компьютер» — то адрес будет
Далее в разделе «Shell» нужно создать подраздел. Название – любое, но только английскими буквами. Данное действие подробнее описывалось в первой статье данного цикла (ссылка выше).
В созданном разделе теперь нужно создать строковый параметр «MUIVerb», в котором необходимо указать, как будет называться главная вкладка, в которой и прячутся все эти программы. Теперь необходимо создать еще один параметр там же: параметр «SubCommands». В нем через точку с запятой, без пробела, перечислить те самые английские имена программ из Рисунка 3. То есть получится «StikyNot;SnippingTool;mspaint;osk;charmap».
При желании, здесь же можно назначить иконку параметром «Icon», если программа системная то будет достаточно прописать только имя утилиты, если нет тогда полный путь до иконки (иконка должна быть обязательно формата .ico). Также можно указать расположение параметром «Position» («Top» – утилита находиться в самом верху списка или «Bottom» – внизу). На этом процесс можно считать законченным.
Для тех, кто не желает заморачиваться со всей этой работой к этой статье прилагаю папку с файлами реестра (скачать её можно нажав на кнопку «Скачать» ниже), с выпадающим меню как на картинке в самом верху. Для установки, разархивируйте папку, а затем на каждом из файлов реестра кликните правой кнопкой мышки и выберите параметр «Слияние».
К этой статье нет коментариев. Вы можете быть первым
Выпадающее меню Windows в приложениях Notes
Николай Норкин,
Вятские Информационные Технологии, Киров
Domino Designer предоставляет в распоряжение разработчика богатый выбор средств организации взаимодействия пользователя с приложением. Различные типы полей, облегчающие ввод информации и поддерживающие возможность проверки правильности введенных значений, поддержка кнопок как на постоянно видимой «непрокручиваемой» части — панели действий (Action Bar), так и гиперобъектов в контексте документа. Например, одной из приятных новинок в R5 стала поддержка выпадающего меню в панели действий, позволившая «уплотнить» интерфейс, объединив схожие наборы действий в одну видимую кнопку.
Подробности об арсенале средств, предоставляемых в распоряжение разработчика Domino Designer R5, можно узнать из книги Евгения Полякова Средства разработки приложений в Lotus Domino R5: Domino Designer (М: Светотон, 2002)
Но возможности разработчика не ограничиваются выпадающим меню только в Action bar. В данном материале предлагается реализовать «выпадающее меню» (pop-up menu) при помощи использования Windows API.
Использование функций Windows API в коде LotusScript
При щелчке левой кнопкой мыши на элементах дизайна объектов Notes выполняется событие Click
Код этого события — самое подходящее место для использования обращений к функциям Windows API:
Declare Function CreatePopupMenu Lib «user32» Alias «CreatePopupMenu» () As Long ‘ Создание объекта выпадающего меню, возвращает handle объекта
Declare Function AppendMenu Lib «user32» Alias «AppendMenuA» (Byval hMenu As Long, Byval wFlags As Long, Byval wIDNewItem As Integer, Byval lpNewItem As Any) As Long ‘ Добавление нового пункта (item’а) в меню
Declare Function TrackPopupMenu Lib «user32» Alias «TrackPopupMenu» (Byval hMenu As Long, Byval wFlags As Long, Byval x As Long, Byval y As Long, Byval nReserved As Long, Byval hwnd As Long, lprc As Rect) As Long ‘ Визуализация окна меню
Declare Function DestroyMenu Lib «user32» Alias «DestroyMenu» (Byval hMenu As Long) As Long ‘ Закрытие окна меню
Declare Function GetMessage Lib «user32» Alias «GetMessageA» (lpMsg As MSG, Byval hwnd As Long, Byval wMsgFilterMin As Long, Byval wMsgFilterMax As Long) As Long Подписка на отслеживание событий в пределах окна
Declare Function GetCursorPos Lib «user32» Alias «GetCursorPos» (lpPoint As POINTAPI) As Long ‘ Получение координат курсора мыши
Declare Function GetActiveWindow Lib «user32» Alias «GetActiveWindow» () As Long ‘ Возвращение handle активного окна
Declare Function GetClientRect Lib «user32» Alias «GetClientRect» (Byval hwnd As Long, lpRect As RECT) As Long ‘ Возвращение координат областей окна
Declare Function GetWindowRect Lib «user32» Alias «GetWindowRect» (Byval hwnd As Long, lpRect As RECT) As Long ‘ Возвращение координат областей окна
Функция PopMenuList, формирующая окно выпадающего меню и обрабатывающая реакцию пользователя (см. также файл PopupMenu.lss). Это переработанный вариант функции PopMenu с Sandbox). В отличие от оригинала, пункты меню передаются не в виде строки, а в виде массива строк strItem разделитель (сепаратор) пунктов передается в виде строки «-«. Координаты окна меню передаются в переменных mx и my. Если mx=my=0, то значение координат окна берется от текущего положения курсора мыши с поправкой на величину «кнопки» (x — 20, y + 10). Функция возвращает номер выбранного пункта меню, начиная с 1 и не включая сепараторы. или 0 в случае нажатия кнопки мыши за пределами окна меню или нажатия клавиши Esc клавиатуры:
Function PopMenuList (strItem As Variant, mx As Long, my As Long) As Long
Const MF_ENABLED = &H0
Const TPM_LEFTALIGN = &H0
Const MF_SEPARATOR = &H800
Dim msgdata As MSG
Dim rectdata As RECT
Dim Cursor As POINTAPI
Dim i As Long
Dim j As Long
Dim last As Long
Dim hMenu As Long ‘хэндл объекта окна меню
Dim id As Integer
Dim junk As Long
hMenu = CreatePopupMenu() ‘Создание объекта окна меню
‘ Счетчик, задающий значение, которое вернет функция при выборе соответствующего пункта меню
Forall str1 In strItem ‘ Добавление в меню пунктов
If str1 <> «-» Then
junk = AppendMenu(hMenu, MF_ENABLED, id, str1) ‘ Добавление нового пункта меню
+ 1
Else
junk = AppendMenu(hMenu, MF_SEPARATOR, 0, «») ‘ Добавление сепаратора
End If
End Forall
If mx = 0 And my = 0 Then
Call GetCursorPos(Cursor) ‘ Получение текущих координат курсора мыши
mx = Cursor.x — 20 ‘ Поправка
my = Cursor.y + 10
End If
junk = TrackPopupMenu(hMenu, TPM_LEFTALIGN, mx, my, 0, GetActiveWindow(), rectdata) ‘ Визуализация объекта
junk = GetMessage(msgdata, GetActiveWindow(), 0, 0) ‘ Ожидание события
i = Abs(msgdata.wparam)
If msgdata.message = 273 Then PopMenuList = i ‘ Присвоение возвращаемого значения
Call DestroyMenu(hMenu)
End Function
Использование элемента дизайна выпадающее меню. Ввод значений в поля
Выбор вариантов из списка предлагаемых — одна из возможностей, присущих графическому пользовательскому интерфейсу, к которой привыкли пользователи в России. Domino Designer предоставляет в распоряжение разработчика целый ряд элементов дизайна, обеспечивающих эту функцию. Это — наборы флажков и переключателей (checkbox и radio button), диалоговое окно списка (dialog list), список (listbox) и поле с выпадающим списком (combobox). К сожалению, ни один из этих элементов не лишен недостатков. Одни элементы занимают «слишком много» места в рабочей области документа, другие (dialog list) требуют дополнительного щелчка мышью по кнопке модального окна. Поле типа combobox, лишенное предыдущих недостатков, позволяет выводить лишь ограниченное число позиций списка в раскрывающемся окне, вызывая необходимость прокручивать список.
Предлагаемое решение работает аналогично полю listbox, но позволяет разработчику задавать длину списка прокрутки.
Входные параметры:
values — список значений для выбора
count — количество элементов списка, отображаемых за раз
mx, my — координаты вывода левого верхнего угла окна меню
Возвращаемое значение:
номер выбранного пункта меню, начиная с 1 и не включая сепараторы
или 0 в случае нажатия кнопки мыши за пределами окна меню
или нажатия клавиши Esc клавиатуры
Function PopMenuListScroll(values As Variant, count As Integer, mx As Long, my As Long) As Long
Dim strItem As Variant ‘Список текущего меню
If Isempty(values) Then Exit Function
ub% = Ubound(values)
strItem = values
start = 0
cnt = count
If ub% >= count Then ‘ Если все элементы не входят.
Redim Preserve strItem(count + 1) ‘ . список укорачивается
strItem(count) = «-»
strItem(count + 1) = «Следующий. » ‘ и добавляются элементы перехода
cnt = cnt + 1
End If
Do
‘ Вызов функции выпадающего меню и анализ возвращаемого ею значения
a = PopMenuList(strItem, mx, my)
Select Case a
Case 0: Exit Function ‘ Произошел отказ от выбора
Case cnt:
‘ Выбран последний элемент списка текущего меню
‘ Происходит проверка, действительный это элемент
‘ или элемент навигации («Следующий. «)
lub% = ub% — (start + count)
If start = 0 Then sr = -1 Else sr = 0
If lub% > sr Then
start = start + count
‘ Выбран элемент навигации
‘ Формирование следующего окна списка
If lub%
Redim strItem(lub% + 2)
stritem(0) = «Предыдущий. »
strItem(1) = «-»
For i% = 0 To lub%
strItem(i% + 2) = values(start + i%)
Next
Else
Redim strItem(count + 3)
stritem(0) = «Предыдущий. »
strItem(1) = «-»
For i% = 0 To count — 1
strItem(i% + 2) = values(start + i%)
Next
stritem(count + 2) = «-»
strItem(count + 3) = «Следующий. »
cnt = count + 2
End If
End If
Case 1: ‘ Выбран первый элемент
If start = 0 Then ‘ Если обрабатывалось начало списка
PopMenuListScroll = 1 ‘ то выбран действительный элемент
Exit Function ‘ и функция возвращает выбранное значение
End If
‘ Выбран элемент навигации «Предыдущий. »
‘ Список меню формируется заново
start = start — count
If start
If start = 0 Then
strItem = values
Redim Preserve strItem(count + 1)
strItem(count) = «-»
strItem(count + 1) = «Следующий. »
cnt = count + 1
Else
Redim strItem(count + 3)
stritem(0) = «Предыдущий. »
strItem(1) = «-»
For i% = 0 To count — 1
strItem(i% + 2) = values(start + i%)
Next
stritem(count + 2) = «-»
strItem(count + 3) = «Следующий. »
cnt = count + 2
End If
Case Else ‘ Выбран действительный элемент
a = a + start ‘ С учетом поправок.
If start > 0 Then a = a — 1
PopMenuListScroll = a ‘ . возвращается его значение
Exit Function
End Select
Loop
End Function
Использование элемента дизайна выпадающее меню. Выпадающее меню кнопки в тексте документа
Второй пример также позволяет сэкономить место в документе или, по крайней мере, добиться приемлемого размещения активных областей в интерфейсе формы документа. Представьте себе, как бы выглядел фрагмент документа, изображенный на рис.4, если бы пришлось вместо одной кнопки размещать три. А в случае пяти кнопок?
При использовании этой возможности следует помнить о выработанных у пользователей стереотипах. Подобная реакция программы на вполне привычное пользователю действие открытия документа во встроенном представлении может быть воспринята пользователем неадекватно. Поэтому, было бы неплохо позволить пользователю самому включать/выключать «расширенные» возможности интерфейса представления (задействуйте для этого переменные среды или профильные документы), или, как вариант, можно оформлять подобные представления (или область, их обрамляющую) так, чтобы пользователь мог сразу отличать их от представлений со «стандартным» поведением. И, конечно же, документируйте данные возможности в инструкциях пользователю





