powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Контекстная помощь, как сделать?
25 сообщений из 29, страница 1 из 2
Контекстная помощь, как сделать?
    #33125522
bumsy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Требуется сделать контекстную справку по окнам, менюшкам, полям датавинды, кнопкам, тулбару и т.п.
Очень импонирует вариант, как в программе NeroBurning, когда в меню Помощь выбираешь пункт "Что это?" (или Shift + F1) и указатель мышинного курсора менятеся на знак вопроса. После чего можно ткнуть в любой объект (включая пункты меню и подменю!) и появляется выпадающая контекстная справка aka tooltip по данному объекту.
В PowerBuilder'е, похоже, штатными средствами подобное можно сделать только для Response - окна.
Может кто сталкивался, есть ли общий вариант реализации контекстной справки для всего приложения (не только response-окон) ?

Pb 9.02 7610 (без PFC)
...
Рейтинг: 0 / 0
Контекстная помощь, как сделать?
    #33125544
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то не полагается это делать на немодальных диалогах...
Но вот так :-)
...
Рейтинг: 0 / 0
Контекстная помощь, как сделать?
    #33125552
Фотография ЗоринАндрей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
без PFC
Добавляем кнопку на titlebar
Код: plaintext
1.
2.
3.
Function long GetWindowLongA (long hWindow, integer nIndex) Library
"user32.dll"
Function long SetWindowLongA (long hWindow, integer nIndex, long dwNewLong)
Library "user32.dll"
Код: plaintext
1.
constant integer ici_gwl_exstyle = - 20 
constant long icl_ws_ex_contexthelp =  1024 
Код: plaintext
1.
2.
3.
4.
5.
long    ll_gwl_exstyle
long    ll_handle
ll_handle    = Handle(lw_window)
ll_gwl_exstyle  = GetWindowLongA(ll_handle, - 20 )
ll_gwl_exstyle += icl_ws_ex_contexthelp
SetWindowLongA(ll_handle, ici_gwl_exstyle, ll_gwl_exstyle)

ловим событие pbm_syscommand:
Код: plaintext
1.
2.
3.
4.
5.
CONSTANT ulong SC_CONTEXTHELP 	=  61824 
Choose Case message.WordParm
    Case SC_CONTEXTHELP
// .......
End Choose 
Но возможно все таки лучше "расковырять" объект Роя. не так уж он сильно на PFC завязан.
...
Рейтинг: 0 / 0
Контекстная помощь, как сделать?
    #33125553
bumsy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я так понимаю, что это пример контекстной справки для окна с windowtype = response. Тем не менее интересные моменты в примере есть...
...
Рейтинг: 0 / 0
Контекстная помощь, как сделать?
    #33125556
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В особенности тот факт, что он с моей помощью правильно на datawindows работает :-)
...
Рейтинг: 0 / 0
Контекстная помощь, как сделать?
    #33125663
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗоринАндрей
Код: plaintext
1.
constant integer ici_gwl_exstyle = - 20 
constant long icl_ws_ex_contexthelp =  1024 
Код: plaintext
1.
ll_gwl_exstyle  = GetWindowLongA(ll_handle, - 20 )
ll_gwl_exstyle += icl_ws_ex_contexthelp

УЖОСНАХ!!! (с) ты
А если у окна уже есть кнопка контекстной помощи? Что произойдет с твоим окном? Дизьюнкция и арифметическое сложение это все же разные вещи. Хотя и могут работать одинаково, если одно из слогаемых нулевое :)
И во вторых, объявлять константу и не использовать ее???
...
Рейтинг: 0 / 0
Контекстная помощь, как сделать?
    #33126425
bumsy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Предыдущий мой пост относился к ответу Филиппа.

Не получается через вышеупомянутую функцию SetWindowLongA добавить кнопку со знаком вопроса в titlebar у не response - окон (просто ничего не происходит). У response прокатывает.
...
Рейтинг: 0 / 0
Контекстная помощь, как сделать?
    #33127640
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bumsyПредыдущий мой пост относился к ответу Филиппа.

Не получается через вышеупомянутую функцию SetWindowLongA добавить кнопку со знаком вопроса в titlebar у не response - окон (просто ничего не происходит). У response прокатывает.
На самом деле на Popup window тоже работает, если убрать галки с Minbox и MaxBox, а галку на ControlMenu и TitleBar оставить.
Как я с самого начала и сказал
ФилиппВообще-то не полагается это делать на немодальных диалогах.
...
Рейтинг: 0 / 0
Контекстная помощь, как сделать?
    #33129372
bumsy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понятно, Филипп. Спасибо за отзыв.

В общем, пока задача такая: надо реализовать контекстную справку на пункты меню в приложении. То есть пользователь выбрав пункт меню, может нажать shift + F1 и по данному пункту меню открывается справка.
Может кто делал подобное?
Такое ощущение, что в PB не хватает событий для меню. Нельзя в приложении получить текущий выбранный пункт меню, не иначе как не прописав в каждый пункт меню в событие selected скрипт..

Еще вопрос. В menu pointer для самого верхнего элемента меню можно прописать скрипт, например на события selected, clicked и т.п. И этот скрипт я так понимаю никогда не будет выполнен в приложении, зачем в него можно писать скрипт? Это просто для общности с другими пунктами меню, или все-таки когда-то сработает? :-)
...
Рейтинг: 0 / 0
Контекстная помощь, как сделать?
    #33129532
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bumsyЕще вопрос. В menu pointer для самого верхнего элемента меню можно прописать скрипт, например на события selected, clicked и т.п. И этот скрипт я так понимаю никогда не будет выполнен в приложении, зачем в него можно писать скрипт? Это просто для общности с другими пунктами меню, или все-таки когда-то сработает? :-)
Допустим, когда в тулбаре иконка есть на этот пункт меню.
...
Рейтинг: 0 / 0
Контекстная помощь, как сделать?
    #33129607
bumsy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Локшин МаркДопустим, когда в тулбаре иконка есть на этот пункт меню.
Я имею в виду самый верхний уровень в меню. Его имя совпадает с названием самого меню. В Menu Painter'е у него нету вкладки Toolbar в свойствах, да и во вкладке General пусто. А вот события есть и в них даже можно писать. Хотя эти события можно самому вызвать из скрипта, может для этого... Но зачем же тогда нужны предопределенные события clicked, selected. Снова непонятно.
...
Рейтинг: 0 / 0
Контекстная помощь, как сделать?
    #33129948
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bumsyПонятно, Филипп. Спасибо за отзыв.
В общем, пока задача такая: надо реализовать контекстную справку на пункты меню в приложении. То есть пользователь выбрав пункт меню, может нажать shift + F1 и по данному пункту меню открывается справка.
Может кто делал подобное?
На мой взгляд задача несколько абсурдная. В нормальном меню текст пункта меню и есть контекстная справка.
В приложениях где вы видите подобные извращения, используются НЕ меню, а специальные окна, эмулирующие меню.
...
Рейтинг: 0 / 0
Контекстная помощь, как сделать?
    #33131091
Фотография savosin_sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ФилиппНа мой взгляд задача несколько абсурдная. В нормальном меню текст пункта меню и есть контекстная справка.
В приложениях где вы видите подобные извращения, используются НЕ меню, а специальные окна, эмулирующие меню.
а вот посмотрим в описание события WM_HELP:
msdnWM_HELP
Indicates that the user pressed the F1 key. If a menu is active when F1 is pressed, WM_HELP is sent to the window associated with the menu; otherwise, WM_HELP is sent to the window that has the keyboard focus. If no window has the keyboard focus, WM_HELP is sent to the currently active window.

Код: plaintext
1.
WM_HELP 
    lphi = (LPHELPINFO) lParam; 
Parameters
lphi
Address of a HELPINFO structure that contains information about the menu item, control, dialog box, or window for which Help is requested.

поэтому задам всем наводящий вопрос: кто-нибудь пробовал перехватывать (с целью перехвата и обработки сообщения WM_HELP) оконную функцию у главного окна приложения, написанного на pb9? сдаётся, что оно на псевдокоде выглядит так:
Код: plaintext
1.
2.
w_main = GetWindowLong(w_mdi, GWL_HWNDPARENT)
window_function = GetWindowLong(w_main, GWL_WNDPROC)
window_func_old = SetWindowLong(w_main, GWL_WNDPROC, my_wnd_function)

кстати, ковырялись тут на rsnd.ru и отыскали упоминание 4-го powerbuilder'а в исходниках MessageBox()! достаточно в файле user32.dll поискать в формате юникод (например, в far'е) строку pb040.
( here
...
Рейтинг: 0 / 0
Контекстная помощь, как сделать?
    #33132200
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
savosin_sergey поэтому задам всем наводящий вопрос: кто-нибудь пробовал перехватывать (с целью перехвата и обработки сообщения WM_HELP) оконную функцию у главного окна приложения, написанного на pb9? сдаётся, что оно на псевдокоде выглядит так:
Код: plaintext
1.
2.
w_main = GetWindowLong(w_mdi, GWL_HWNDPARENT)
window_function = GetWindowLong(w_main, GWL_WNDPROC)
window_func_old = SetWindowLong(w_main, GWL_WNDPROC, my_wnd_function)

Простите а зачем этим заниматься, если у главного (да и любого) окна приложения есть event help (mapped to pbm_help , который и есть WM_HELP )?
...
Рейтинг: 0 / 0
Контекстная помощь, как сделать?
    #33132252
bumsy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ФилиппНа мой взгляд задача несколько абсурдная. В нормальном меню текст пункта меню и есть контекстная справка.
В приложениях где вы видите подобные извращения, используются НЕ меню, а специальные окна, эмулирующие меню.
Отображение справки по пункту меню требует начальство. :-). Спец.окно для меню это, наверное, действительно хорошая штука (когда оно есть в арсенале и приложение только начинает создаваться).

Однако у пункта меню есть событие Help, которое срабатывает когда выделен пункт меню и нажали F1 (или shift+F1, или ctrl+F1). Правда придется в каждый пункт меню прописывать код в событие help, что-то типа f_open_help(this.classname()).
...
Рейтинг: 0 / 0
Контекстная помощь, как сделать?
    #33132254
bumsy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Филипп, вы немного опередили :)

Только событие wm_help все-таки для кажлого пункта меню надо прописывать. WM_help который у окна - он не распространяется на меню.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Контекстная помощь, как сделать?
    #35899430
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как сделать пункт меню у window_MDI типа контекстной справки ('?'), чтобы этот "вопросик" предвинуть к нужному элементу окна(win_sheet), кликнуть и получить справку о нем?
РВ10.5
...
Рейтинг: 0 / 0
Контекстная помощь, как сделать?
    #35899826
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас ВСЕ объекты унаследованы от userobjectов. В событии dragdrop проверяем DraggedObject. В зависимости от результата что-то делаем.
В менюшке нажимаем на "Что это?" - курсор превращается в знак вопроса. Тыкаем в какой-нибудь объект - выскакивает пояснение.
Каждый юзер может сам добавлять/менять комментарии (в меню "Добавить объяснение").
...
Рейтинг: 0 / 0
Контекстная помощь, как сделать?
    #35900287
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Riska ,
У меня вопрос: как сделать переход в состояние "Что это?" при нажатии на пункт меню окна или пользовательскую кнопку в окне, чтобы появился курсор ввиде (?) и т.д.
Окно не response, но добавить хочется именно такой сервис, а не через открытие контекстного меню элемента окна.
...
Рейтинг: 0 / 0
Контекстная помощь, как сделать?
    #35900762
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На окне MDI лежит невидимое dw_help (его-то мы и будем перетаскивать).
Скрипт в меню:
Код: plaintext
1.
2.
w_mdi.dw_help.dragauto = FALSE
w_mdi.dw_help.DragIcon = 'Question!'
w_mdi.dw_help.Drag (Begin!)

На каждом объекте в событии gragdrop написать:
Код: plaintext
Open(w_help)

Это в общих чертах. Остальное - по усмотрению (нужно определить, в какую именно "кнопку" тыкнули). Можно в tag что-то написать. Можно что-то типа такого:
Код: plaintext
1.
2.
Parent.ClassName()
This.ClassName()
This.GetObjectAtPointer( )
...
Рейтинг: 0 / 0
Контекстная помощь, как сделать?
    #35901656
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Riska ,
Спасибо. Очень интересное решение. Есть правда один минус - трудно однозначно понять где в данный момент реально курсор и как следствие не всегда попадаешь на элемент окна, и естественно "Справки" нет и создается впечатление, что для данного элемента её нет.

Может есть все-таки вариант через функцию API (например) вызвать этот сервис, чтобы он работал через обычное событие (help)?
...
Рейтинг: 0 / 0
Контекстная помощь, как сделать?
    #35902245
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS,
Все очень красиво работает. Вот пример:
Код: plaintext
http://ifolder.ru/ 11345573 
...
Рейтинг: 0 / 0
Контекстная помощь, как сделать?
    #35905035
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RiskaAIS,
Все очень красиво работает. Вот пример:
Код: plaintext
http://ifolder.ru/ 11345573 

А не кто и не спорит. Действительно всё работает и красиво. Но , повторюсь, что если надо например подвести "вопросик" к елементу меню, т.е. элементу с малыми размерами, то можно и промахнуться. :)

И все-таки: можно выдать какую-то системную команту, чтобы перейти в режим события Контекстной спарвки (т.е. чтобы был "курсор-вопросик" )?
...
Рейтинг: 0 / 0
Контекстная помощь, как сделать?
    #35905930
maxATC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А разве так не катит?

Код: plaintext
.DragIcon = 'X:/my.ico'
...
Рейтинг: 0 / 0
Контекстная помощь, как сделать?
    #35907016
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxATCА разве так не катит?

Код: plaintext
.DragIcon = 'X:/my.ico'

Тоже об этом думал. Создал иконку у которой "вопросик со стрелкой" и эта стрелка указывает в центр иконки. Вроде всё ОК. Но все равно хочется стандартного решения.
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Контекстная помощь, как сделать?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]