Войти
 
 
   
 
  
Новости Notes.ру Библиотека Биржа труда Вопрос - ответ Форум Регистрация Поиск О проекте
Разделы
О Notes
Советы
Шаблоны и примеры
Литература
Презентации
 
Всё о задаче AdminP. Часть вторая   Во второй части мы завершаем рассмотрение AdminP. В ней рассмотрены запросы междоменного администрирования и способы управления функциями AdminP с помощью настроек документа сервера, команд консоли сервера, файла Notes.ini и интервалов очистки базы данных. В этой статье предполагается, что вы опытный администратор Domino и прочитали первую часть
О Notes Читать статью
 
Всё о задаче AdminP. Proxy-действия в R5 и Domino 6   Приложение к статье об административном процессе
О Notes Читать статью
 
Всё о задаче AdminP. Часть первая   Перевод классической статьи 2003-его года о задаче административного процесса (AdminP). Очень полезна для понимания работы механизма этой задачи. В первой части статьи описаны компоненты задачи AdminP, как они работают, и как их использование помогает сделать работу администратора Domino проще. Задача AdminP (сакращённо от Administration Process, Административный процесс) работает с базой административных запросов (Administration Requests, admin4.nsf)
О Notes Читать статью
 


Советы

Главная   Библиотека   Советы

Выпадающее меню 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() 'Создание объекта окна меню
id = 1 ' Счетчик, задающий значение, которое вернет функция при выборе соответствующего пункта меню
Forall str1 In strItem ' Добавление в меню пунктов
If str1 <> "-" Then
junk = AppendMenu(hMenu, MF_ENABLED, id, str1) ' Добавление нового пункта меню
id = id + 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, но позволяет разработчику задавать длину списка прокрутки.

Поле типа combobox выводит только пять позиций в списке прокрутки

Вызов функции PopMenuList с передачей в нее списка опций в виде массива элементов откроет пользователю весь список. Немного модернизировав решение, можно получить "прокручиваемое" меню (функция PopMenuListScroll).

Выпадающее меню позволяет разработчику задавать длину списка прокрутки

Входные параметры:
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% < count Then
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 < 0 Then start = 0
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, если бы пришлось вместо одной кнопки размещать три. А в случае пяти кнопок?

При помощи выпадающего меню можно решить размещение нескольких опций на одной кнопке внутри документа

Использование элемента дизайна выпадающее меню. Действия над документом во встроенном представлении
Если два предыдущих решения тем или иным образом имели альтернативу в использовании стандартных элементов дизайна, то следующее обусловлено ограничением работы с документом во встроенном представлении(Embedded View) в версии Notes R5. Отсутствие панели действий для встроенного представления лишает возможности операций над документом в представлении без открытия его
Обработка события QueryOpenDocument представления так, чтобы при запросе открытия документа пользователем появлялось выпадающее меню с набором альтернативных операций, позволит несколько разнообразить возможности пользователя.

Выпадающее меню может частично заменить отсутствующую панель действий для встроенных представлений R5

При использовании этой возможности следует помнить о выработанных у пользователей стереотипах. Подобная реакция программы на вполне привычное пользователю действие открытия документа во встроенном представлении может быть воспринята пользователем неадекватно. Поэтому, было бы неплохо позволить пользователю самому включать/выключать "расширенные" возможности интерфейса представления (задействуйте для этого переменные среды или профильные документы), или, как вариант, можно оформлять подобные представления (или область, их обрамляющую) так, чтобы пользователь мог сразу отличать их от представлений со "стандартным" поведением. И, конечно же, документируйте данные возможности в инструкциях пользователю

Использование кода в элементах дизайна
В файле PopupMenu.lss содержится весь приведенный в материале код. Вы можете подключать его в проекты, используя директиву %INCLUDE в формате %INCLUDE "<путь\>PopupMenu.lss", где указание пути является необязательным при размещении файла в программном каталоге Notes. Можете включить текст из этого файла в библиотеку программ (LotusScript Library) базы данных проекта.
Пример работы с функциями Windows API описан также в материале Определение директории для временных файлов (перейти >>>)

! Более полная реализация функционала выпадающего меню выполнена Дмитрием Акуловым >>>
 
  Опубликовано — 08/11/2003 |    

BacuLu4, 25.08.2004:
:)все,не надо,уже нашел,но буду благодарен за любой пример использования функций типа этой (из Виндовских).

BacuLu4, 25.08.2004:
Круто,на самом деле круто,ребята! А вот есть еще такой вопросик: а как пункт подменю добавить? Если можно - на email, за ранее весьма благодарен.



Добавить комментарий
Имя * :
e-mail
Комментарий * :
Код подтверждения * :

Мероприятия
Пресс-релизы
Биржа труда
Последнее на форуме
 
А так же:
Как удалить профиль?
16.04.2016 00:08:51
Скопировать в буфер поле документа
24.05.2015 08:55:52
Импорт DXL-описания документов в Lotus Domino. Одноимённые поля
16.04.2015 16:49:58
 
© LOGOSPHERE.RU