All Forums
 Категория Visio
 Форум Вопросы и ответы
 Координаты
Author Previous Topic Topic Next Topic  

Ven

28 Posts

Posted - 05/30/2006 :  23:14:12
Здраствуйте. Не много в интеренете ресурсов посвященных программированию визио. Я смотрю тут хвататет профессионалов :) Помогите с вот такой проблеммой. Я пишу прогу на дельфи в проекте использую ActiveX компонент Visio2003 DrawingControl. Возникла такая проблемма, нужно определить какой шейп находиться под указателем крысы. Т.е. есть координаты курсора и необходимо знать какой объект выберется, если я кликну в этом состоянии кнопку мыши.

brace

Russia
358 Posts

Posted - 05/31/2006 :  08:53:57
пока наши думают можете сходить на англояз. сайты

Need VBA examples?
http://www.mvps.org/visio/VBA.htm
Common Visio Questions
http://www.mvps.org/visio/common_questions.htm
http://www.microsoft.com/communities/newsgroups/list/en-us/default.aspx?dg=microsoft.public.visio.developer.diagrams&cat=en_us_f9e6f9a2-fb03-4655-80e5-c2d2b53d4394&lang=en&cr=us
Go to Top of Page

brace

Russia
358 Posts

Posted - 05/31/2006 :  12:10:06
здесь еще можно посмотреть

http://msdn.microsoft.com/office/program/visio/default.aspx
Go to Top of Page

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, то в обратном порядке. Если это значение явно не указано, то шейпы будут перечисленны в произвольном порядке
Go to Top of Page

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
Go to Top of Page

Ven

28 Posts

Posted - 06/01/2006 :  00:29:36
И вам спасибо огромное ;)

Кстати, а вы не могли бы поподробнее объяснить назначение констант для
переменных Relation и Flags?

Edited by - Ven on 06/01/2006 00:32:25
Go to Top of Page

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

в чем причина ??? как исправить ???

Go to Top of Page

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, а обработчик нужно заменить. И действия точно такие же: активировать, поиграться и дезактивировать.
Go to Top of Page
  Previous Topic Topic Next Topic  
Данный сайт является архивом форума visio.artberg.ru, который был закрыт в связи с переходом на новую платформу visio.getbb.ru
Все материалы доступны только для чтения! Если у вас появились вопросы, или вы хотите что-то обсудить, связанное с Visio, обращайтесь на новый форум!
Архив был создан благодаря совместным усилиям Генадия Туманова @Tumanov (visio.artberg.ru), Александра ака @Surrogate (visio.getbb.ru), и Николая Белых @nbelyh (unmanagedvisio.com)