All Forums
 Категория Visio
 Форум Вопросы и ответы
 Как сделать "мультик" в VISIO.
Author Previous Topic Topic Next Topic  

Sign

16 Posts

Posted - 07/04/2006 :  15:29:09
Как программно организовать движение shape? Например, есть shape строительного крана. Нужно по нажатию кнопки заставить его вращаться, перемещать "бегунок" с крюком и т.п. Естественно не требуется абсолютной плавности движения как в играх. Попытка в цикле изменять соответствующую ячейку из ShapeSheet, например для вращения - ячейку "Angle", к необходимому результату не приводит. На экране видишь начальное положение shape и затем после паузы сразу положение shape, соответствующее уже последнему присвоенному значению в цикле.

Tumanov

Russia
1198 Posts

Posted - 07/04/2006 :  17:23:55
Загляните на сайт к Digitall. Там есть статья, как он будильник со стрелочками рисовал :)
http://www.prodigitall.narod.ru
Go to Top of Page

Sign

16 Posts

Posted - 07/05/2006 :  14:51:59
quote:
Originally posted by Tumanov

Загляните на сайт к Digitall. Там есть статья, как он будильник со стрелочками рисовал :)
http://www.prodigitall.narod.ru


Спасибо, заглянул. Да, предложенный вариант с манимуляцией параметра реестра "Animation" работает. А если поставить его значение в 1, то по плавности движения shape не будет уступать и настоящей анимации. Но... это не выход из положения. Ибо добавлять в код VBA изменение параметров реестра, соглатитесь, не есть хорошо. Всегда есть вероятность, что после сбоя на место все вернуть не сможешь. После небольшого исследования выяснилось, что вообщем то проблема в неупраляемости процесса перерисовки shape в требуемый момент времени.
Метода типа REDRAW я не нашел у shape, а сам VISIO перерисовывает shape, я понял, либо в момент передачи упраления пользователю (т.е. уже после отработки своей процедуры, изменяющей, например, тот же Angle из Cells), либо при смене времени в NOW(). Все-таки, есть ли возможность заставить VISIO отрисовать shape в нужный мне момент времени?
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 07/05/2006 :  17:24:58
Не хотите по хорошему - можно поставить внешний таймер :)
Например, написать на VB такую программу
Dim appVisio As Visio.Application
Dim p As Integer
Private Sub Command1_Click()
Timer1.Interval = 100
p = 2
Timer1.Enabled = True
End Sub
Private Sub Command2_Click()
Timer1.Enabled = False
End Sub
Private Sub Timer1_Timer()
Text1.Text = Time
Set appVisio = GetObject(, "Visio.Application")
If p < 10 Then p = p + 1 Else p = 2
appVisio.ActivePage.Shapes(1).Cells("Width").Formula = p
End Sub
При нажатии на кнопку Command1 (это будет "Пуск") запустится 100-миллисекундный таймер и начнет изменять ширину первого шейпа в открытом приложении Visio. Шейп начинает "дышать". Довольно быстро, хотя и рывками.
Нажатие кнопки Command2 ("Останов") останавливает таймер и Visio замирает.
В принципе, таймер не обязательно делать внешним экзешником. Можно придумать, как запускать его из Visio.
Go to Top of Page

Sign

16 Posts

Posted - 07/07/2006 :  10:31:46
quote:
Originally posted by Tumanov

Не хотите по хорошему - можно поставить внешний таймер :)
Например, написать на VB такую программу
Dim appVisio As Visio.Application


.....
Спасибо, работает. Причем интервальное по времени изменение ячеек shape в приложении Visio не обязательно делать через таймер.
Чтобы работало, достаточно эти изменения делать из любой внешней программы (я пробовал просто через Excel) по отношении открытому приложению Visio.
quote:

В принципе, таймер не обязательно делать внешним экзешником. Можно придумать, как запускать его из Visio.


Запустить внешнюю программу из Visio проблемы, думаю, не будет. А вот вообще не выйти за пределы Visio... Вот это проблема. Пока все-таки склоняюсь к изменению Animation в реестре. Тут вопрос больше к Digitall. На что еще в Visio влияет параметр реестра Animation кроме функции NOW()? У него это на сайте сказано весьма размыто:"... Visio по умолчанию, для быстродействия видимо, "время" в формулах обновляется 1 раз в минуту (В ссылках Разработчика об этом не раз упоминается)." Так что если только на NOW(), то можно это пережить. Так ли? Ибо копание в инете большего чем он сказал не принесло. В том числе и microsoft.com . Может у кого еще информация есть?
Go to Top of Page

Sign

16 Posts

Posted - 07/20/2006 :  12:12:11
Для завершения данной темы.
Лучший вариант, по-моему, по данному вопросу будет использование внешнего таймера. Конкретно - использование функций API SetTimer и KillTimer (user32.dll). А в вашей TimerProc, которая прицепляется к таймеру, уже можно организовывать изменение ячеек ShapeSheet.
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)