Author |
Topic |
|
Sign
16 Posts |
Posted - 07/04/2006 : 15:29:09
|
Как программно организовать движение shape? Например, есть shape строительного крана. Нужно по нажатию кнопки заставить его вращаться, перемещать "бегунок" с крюком и т.п. Естественно не требуется абсолютной плавности движения как в играх. Попытка в цикле изменять соответствующую ячейку из ShapeSheet, например для вращения - ячейку "Angle", к необходимому результату не приводит. На экране видишь начальное положение shape и затем после паузы сразу положение shape, соответствующее уже последнему присвоенному значению в цикле. |
|
Tumanov
Russia
1198 Posts |
|
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 в нужный мне момент времени? |
|
|
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. |
|
|
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 . Может у кого еще информация есть? |
|
|
Sign
16 Posts |
Posted - 07/20/2006 : 12:12:11
|
Для завершения данной темы. Лучший вариант, по-моему, по данному вопросу будет использование внешнего таймера. Конкретно - использование функций API SetTimer и KillTimer (user32.dll). А в вашей TimerProc, которая прицепляется к таймеру, уже можно организовывать изменение ячеек ShapeSheet. |
|
|
|
Topic |
|
|
|