Author |
Topic |
|
Ven
28 Posts |
Posted - 05/30/2006 : 23:14:12
|
Здраствуйте. Не много в интеренете ресурсов посвященных программированию визио. Я смотрю тут хвататет профессионалов :) Помогите с вот такой проблеммой. Я пишу прогу на дельфи в проекте использую ActiveX компонент Visio2003 DrawingControl. Возникла такая проблемма, нужно определить какой шейп находиться под указателем крысы. Т.е. есть координаты курсора и необходимо знать какой объект выберется, если я кликну в этом состоянии кнопку мыши.
|
|
brace
Russia
358 Posts |
|
brace
Russia
358 Posts |
|
Ven
28 Posts |
Posted - 05/31/2006 : 13:26:16
|
Блин, огромное, даже ОГРОМАДНЕЙШЕЕ спасибо. Ты мне жизнь спас!
Для тех кому в дальнейшем понадобиться ответ на этот вопрос: Узнать какой шейп находится по координатам X, Y можно с помощью функции SpatialSearch. objRet = object.SpatialSearch(x, y, relation, tolerance, flags) objRet A Selection object. object Required. An expression that returns a Page, Master, or Shape object. x Required Double; x-coordinate. y Required Double, y-coordinate. relation Required Integer. Any combination of the values of the constants visSpatialContainedIn and visSpatialTouching. tolerance Required Double. A distance in internal drawing units with respect to the coordinate space. flags Required Integer. Flags that influence the result.
Эта функция возвращает объект типа IVSelection в котором указаны все шейпы которые попадают в координаты X, Y. Причем параметр flags можно задать как visSpatialBackToFront, тогда шейпы будут перечисленны в порядке от самого дальнего к самому ближнему. Если флаг установить в visSpatialFrontToBack, то в обратном порядке. Если это значение явно не указано, то шейпы будут перечисленны в произвольном порядке
|
|
|
Tumanov
Russia
1198 Posts |
Posted - 05/31/2006 : 18:54:27
|
Ну вот, без меня разобрались... А я пол-обеда потратил, чтобы примерчик написать... :) Зато примерчик хороший получился. 1. Dim WithEvents vW As Visio.Window Dim sel As Selection Dim LastCount Sub MouseControlOn() Set vW = ActiveWindow End Sub Sub MouseControlOf() Set vW = Nothing End Sub Private Sub vW_MouseMove(ByVal Button As Long, ByVal KeyButtonState As Long, ByVal x As Double, ByVal y As Double, CancelDefault As Boolean) Set sel = ActivePage.SpatialSearch(x, y, visSpatialContainedIn, 0.2, visSpatialFrontToBack) If LastCount <> sel.Count Then Flag = 1 LastCount = sel.Count If sel.Count > 0 Then sel(1).Cells("FillForegnd").FormulaU = sel(1).Cells("FillForegnd").FormulaU + 1 If sel(1).Cells("FillForegnd").FormulaU > 15 Then sel(1).Cells("FillForegnd").FormulaU = 0 End If End If End Sub На листе должен быть шейп (хотя бы один). Если выполнить MouseControlOn и помахивать мышкой над шейпом, он будет перекрашиваться. Процесс останавливается запуском MouseControlOf. 2. А для любителей игрушек можно несколько видоизменить обработчик события. Попробуйте теперь поймать шейп мышкой :) Private Sub vW_MouseMove(ByVal Button As Long, ByVal KeyButtonState As Long, ByVal x As Double, ByVal y As Double, CancelDefault As Boolean) Set sel = ActivePage.SpatialSearch(x, y, visSpatialContainedIn, 0.2, visSpatialFrontToBack) If LastCount <> sel.Count Then Flag = 1 LastCount = sel.Count If sel.Count > 0 Then If x < sel(1).Cells("PinX") Then dx = 0.5 Else dx = -0.5 If y < sel(1).Cells("PinY") Then dy = 0.5 Else dy = -0.5 sel(1).Cells("PinX") = sel(1).Cells("PinX") + dx sel(1).Cells("PinY") = sel(1).Cells("PinY") + dy End If End If End Sub |
|
|
Ven
28 Posts |
Posted - 06/01/2006 : 00:29:36
|
И вам спасибо огромное ;)
Кстати, а вы не могли бы поподробнее объяснить назначение констант для переменных Relation и Flags? |
Edited by - Ven on 06/01/2006 00:32:25 |
|
|
brace
Russia
358 Posts |
Posted - 06/01/2006 : 15:39:13
|
2 Tumanov
quote: для любителей игрушек можно несколько видоизменить обработчик события. Попробуйте теперь поймать шейп мышкой :) Private Sub vW_MouseMove(ByVal Button As Long, ByVal KeyButtonState As Long, ByVal x As Double, ByVal y As Double, CancelDefault...
при запуске этого скрипта получаю сообщение
Invalid procedure name
в чем причина ??? как исправить ???
|
|
|
Tumanov
Russia
1198 Posts |
Posted - 06/01/2006 : 18:53:26
|
quote: Кстати, а вы не могли бы поподробнее объяснить назначение констант для переменных Relation и Flags?
Так в документации вроде все нормально расписано (в SDK). Только по-английски... Вы скачали SDK? Это очень полезная вещь. quote: Invalid procedure name в чем причина ??? как исправить ???
Во-первых, это работает только в Visio 2003. Во-вторых, в примерчиках по три процедуры: запускающая (MouseControlOn), останавливающая (MouseControlOf) и обработчик события. Нужно выполнить запускающий макрос, это активирует обработчик и он будет работать до выполнения останавливающего макроса. Второй пример должен содержать те же самые MouseControlOn и MouseControlOf, а обработчик нужно заменить. И действия точно такие же: активировать, поиграться и дезактивировать. |
|
|
|
Topic |
|
|
|