Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Treeview Right Click  [new]
Jose
Member

Откуда:
Сообщений: 67
Кто-нибудь знает, можно ли совершить какое-либо действие(операцию и т.д.)
на нажатие прав. клав. мыши (RightClick) в Treeviwe Control'e.
И возможно ди вообще такое в принципе
2 июл 03, 16:15    [248899]     Ответить | Цитировать Сообщить модератору
 Re: Treeview Right Click  [new]
NNN
Member

Откуда:
Сообщений: 2141
Конечно можно, через обработку события MouseDown:
LPARAMETERS button, shift, x, y
IF button=2
...
ENDIF

ЗЫ Для того, чтобы узнать попал в ноду или нет, используй метод HitTest(x,y), он вернет ссылку на объект node или .NULL. (в крайнем случае пустую строку в старых версиях).
2 июл 03, 16:31    [248937]     Ответить | Цитировать Сообщить модератору
 Re: Treeview Right Click  [new]
Crip
Member

Откуда:
Сообщений: 2490
Почему нет?
Используй MouseDown
Для определения на какой ноде используй там же HitTest
2 июл 03, 16:32    [248943]     Ответить | Цитировать Сообщить модератору
 Re: Treeview Right Click  [new]
Crip
Member

Откуда:
Сообщений: 2490
Oops :((( Акелла промахнулся
2 июл 03, 16:34    [248947]     Ответить | Цитировать Сообщить модератору
 Re: Treeview Right Click  [new]
NNN
Member

Откуда:
Сообщений: 2141
2Crip

>Oops :((( Акелла промахнулся

Это ты про меня?
Бывает.. Ну не помню я когда где что возвращает. И что для любознательных пользователей лучше обрабатывать не MouseDown, а MouseUp. Кроме того, там небось еще всякие твипсы, короче надо было ответить просто и коротко - 'да'.
2 июл 03, 17:02    [249007]     Ответить | Цитировать Сообщить модератору
 Re: Treeview Right Click  [new]
Jose
Member

Откуда:
Сообщений: 67
Все что я нашел (ПОКАЗАЛИ) из хелпа по TreeView -
http://kodu.neti.ee/~juri4/vfpplus/ax_treeview_ru.htm
Но там нет ни слова про HitTest. Мож где есть ?
2 июл 03, 17:18    [249036]     Ответить | Цитировать Сообщить модератору
 Re: Treeview Right Click  [new]
Crip
Member

Откуда:
Сообщений: 2490
2NNN
Нет это я про себя - ты уже раньше запостил.
А почему MouseDown плох? Мне кажется как раз он и нужен. Например для построения контекстного меню
2Jose
А что тебе по HitTest надо? Кажется все что нужно NNN написал.
2 июл 03, 17:27    [249056]     Ответить | Цитировать Сообщить модератору
 Re: Treeview Right Click  [new]
Jose
Member

Откуда:
Сообщений: 67
Я не совсем понимаю как этот метод работает и как его использовать, точнее,
совсем не понимаю.
2 июл 03, 17:30    [249066]     Ответить | Цитировать Сообщить модератору
 Re: Treeview Right Click  [new]
hDrummer
Member

Откуда: Турция
Сообщений: 18227
2NNN
а я-то думаю, куда однопартиец задевался? а он не задевался, он в работу ушёл :(
2 июл 03, 17:35    [249076]     Ответить | Цитировать Сообщить модератору
 Re: Treeview Right Click  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Не все сразу. Сайт там все еще в развитии и со временем дополнится описанием свойств и методов собственно TreeView.

Вкратце по поводу HitTest()

Это метод собственно объекта TreeView, который по указанным координатам, относительно верхнего левого угла собственно TreeView возвращает ссылку на узел, находящийся по указаным координатам.

Проблема в том, что внутренний метод HiteTest() требует координат указанных в твипах (twip), а FoxPro предлагает координаты в пикселах. Т.е. необходим перевод координат.

В примере, я создал специальные проперти формы nTwipX и nTwipY, содержащие переводные коэффициенты

* Следующие API функции используются для расчета переводного коэффициента
* из пикселей (их дает VFP60) в твипы (они нужны функции HitTest())
DECLARE INTEGER GetActiveWindow IN WIN32API
DECLARE INTEGER GetDC IN WIN32API INTEGER iHDC
DECLARE INTEGER GetDeviceCaps IN WIN32API INTEGER iHDC, INTEGER iIndex

LOCAL liHDC
liHDC = GetDC(GetActiveWindow())

ThisForm.nTwipX = 1440/GetDeviceCaps(liHDC,88)
ThisForm.nTwipY = 1440/GetDeviceCaps(liHDC,90)


Теперь в методе MouseDown собственно TreeView пишешь такой код

*** ActiveX Control Event ***
LPARAMETERS button, shift, x, y
LOCAL loNode
loNode=This.HitTest(x*ThisForm.nTwipX, y*ThisForm.nTwipY)
if IsNull(m.loNode)=.T.
MessageBox('Под мышкой нет узла')
else
MessageBox(m.loNode.text)
endif

Можешь еще посмотреть примерчик

http://nsvisual.com/fox2/sol/index.php?act=view&id=188

Это собственно Drag-Drop в TreeView, но один из способов - это как раз вызов подменю по правой кнопке мыши
2 июл 03, 17:37    [249082]     Ответить | Цитировать Сообщить модератору
 Re: Treeview Right Click  [new]
Crip
Member

Откуда:
Сообщений: 2490
2ВладимирМ
Я не такой крутой спец по тривью. А что вот так не всегда будет работать?
Пересчет координат взят и Solution - Controls- ListBox- Drag'n'Drop.
LPARAMETERS button, shift, x, y

IF button <> 2
RETURN
ENDIF

LOCAL loNode
loNode = this.Hittest(x/96*1440,y/96*1440)

IF VARTYPE(loNode) = [O]
MESSAGEBOX(loNode.Text)
ENDIF
2 июл 03, 17:42    [249096]     Ответить | Цитировать Сообщить модератору
 Re: Treeview Right Click  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Специально я не проверял. У меня действительно переводной коэффициент всегда равен 15, но я слышал о ситуациях, когда он равен 12 (возможно другой алгоритм расчета).

Я просто не очень понимаю, что эти API-функции делают (точнее какие значения возвращают)

Т.е. если лень, то можно взять коэффициент равным 15, но тут нет никакой гарантии, что на другой машине он также будет равен 15.

Второй момент - это возвращаемый тип данных.

Ведь HitTest() по логике должен в любом случае вернуть переменную типа "Object", просто если нет объекта, то ее значение будет равно NULL. Поэтому я не думаю, что отлавливать именно ТИП возвращаемого значения - это хорошая идея. Нужно проверять именно ЗНАЧЕНИЕ.

По поводу Solution.pjx - у меня VFP6 и этого примера нет.

А вообще-то, к любым примерам надо подходить с осторожностью, по принципу "доверяй, но проверяй". Как минимум, примеры от Microsoft сильно избыточны. Насчет глючности - не скажу, я не очень-то пользуюсь примерами в чистом виде. Как правило беру только идею и переписываю под себя.
2 июл 03, 18:03    [249141]     Ответить | Цитировать Сообщить модератору
 Re: Treeview Right Click  [new]
Crip
Member

Откуда:
Сообщений: 2490
Понятно
С VARTYPE() я действительно погорячился. Когда передается ссылка на объект , а не сам объект лучше проверять на NULL
2 июл 03, 18:15    [249160]     Ответить | Цитировать Сообщить модератору
 Re: Treeview Right Click  [new]
NNN
Member

Откуда:
Сообщений: 2141
2Crip

> Нет это я про себя - ты уже раньше запостил.

Интересно, как ты мог об этом знать, когда писал ответ

> А почему MouseDown плох? Мне кажется как раз он и нужен. Например для построения контекстного меню.

Тебе длинную историю по этому поводу или короткую? Ладно, как-нибудь в следующий раз..
А пока нажми правую кнопку мыши в любом месте этого сообщения. Нажал? Теперь дочитай это предложение до конца и отпусти ее. Намек понял? :)

С VARTYPE() я действительно погорячился. Когда передается ссылка на объект , а не сам объект лучше проверять на NULL

Не все так просто - PRB: TreeView Control HitTest Method Returns Empty String, хотя это не твой случай.

> А что вот так не всегда будет работать?

Как минимум в 90% случаев.
В принципе твипс - это 1/1400 логического дюйма, а вот количество пикселей в логическом дюйме может быть различно для различных компьютеров, но может быть вычислено через GetDeviceCaps. У меня на работе как раз такой случай, точные цифры не помню, но очень 'обрадовался', когда в первый раз встретил вариант TwipsPerPixelX=TwipsPerPixelY. Solution в этом примере подглючивает капитально.

2ВладимирМ

> Сайт там все еще в развитии и со временем дополнится описанием свойств и методов собственно TreeView.

Это тебе Юрий сам сказал? Помнится, он начинал еще в прошлом веке..

Одно замечание: контекст устойства необходимо удалять после того, как он не используется, он все-таки немало памяти ест.

2hDrummer

А Вам, товарисч Эйтч, я отвечу отдельно и в другом форуме.
3 июл 03, 00:13    [249385]     Ответить | Цитировать Сообщить модератору
 Re: Treeview Right Click  [new]
Jose
Member

Откуда:
Сообщений: 67
Вообщем, спасибо всем.
Постараюсь дальше разобраться сам (:-)
3 июл 03, 12:16    [249899]     Ответить | Цитировать Сообщить модератору
 Re: Treeview Right Click  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
2NNN
>Одно замечание: контекст устойства необходимо удалять после того, как он не используется, он все-таки немало памяти ест.

Как это выполнить практически для VFP6 ? Там есть только CLEAR DLLS, что в принципе недопустимо использовать - мало ли какие библиотеки у меня еще загружены.
10 июл 03, 18:48    [257912]     Ответить | Цитировать Сообщить модератору
 Re: Treeview Right Click  [new]
NNN
Member

Откуда:
Сообщений: 2141
2ВладимирМ

> Как это выполнить практически для VFP6 ?

Для твоего примера (после вычисления твипсов):

declare integer ReleaseDC in win32api integer,integer

=ReleaseDC(GetActiveWindow(),liHDC)


> Там есть только CLEAR DLLS

Было время, приходилось отслеживать, а в 7 появилось CLEAR DLLS [LibraryName], что упростило задачу.
10 июл 03, 21:42    [258019]     Ответить | Цитировать Сообщить модератору
 Re: Treeview Right Click  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Спасибо. Не силен я в API :(
11 июл 03, 12:51    [258559]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить