Author |
Topic |
|
bdfy
Belarus
267 Posts |
Posted - 07/31/2009 : 20:17:59
|
Предположим я создал набор макросов для оперирования с селектированными шейпами (я уже писал в прошлой теме - для сворачивания схемы сети). Как удобнее организовать их запуска ? хот-кеи конечно хороший вариант, но хочется дополнительно иметь панель инструментов "плавающую" прямо над рабочей областью. каждая кнопка - вызов опред. скрипта. как это сделать ? |
|
Tumanov
Russia
1198 Posts |
Posted - 08/01/2009 : 05:59:19
|
В SDK есть пример изменения пользовательского интерфейса "Command Bar Creation" Если оттуда выбросить лишнее, оставить только пример с макросом и сделать нужное количество кнопок, появится у Вас своя панелька. Можно ее и плавающей сделать. Выглядит это примерно так:
Set cbrCommandBars = vsoApplication.CommandBars
' Add a new CommandBar object that only exists through
' this session of Visio.
Set cbrCommandBar = cbrCommandBars.Add( _
Name:=strCommandBarName, _
Position:=msoBarTop, Temporary:=True)
' Do not allow users to modify the new CommandBar.
cbrCommandBar.Protection = msoBarNoCustomize
' Display the command bar using the Context property.
cbrCommandBar.Context = Str(VisUIObjSets.visUIObjSetDrawing) & "*"
' Add a button to the bar.
Set cbbCommandBarButton = cbrCommandBar.Controls.Add( _
Type:=msoControlButton)
' Make it run a VBA Macro.
With cbbCommandBarButton
.Caption = "Visual Basic Macro"
.TooltipText = "Click this button to run " & _
"'ThisDocument.HelloWorld' macro if it exists"
' Use the Tag property for context switching and
' for use with the FindControl method.
.Tag = "VBMacro"
' Get an internal icon for the button.
.FaceID = 7075
' Use OnAction to run a VBA macro contained in
' this document.
.OnAction = "ThisDocument.HelloWorld"
End With Здесь на единственную кнопку назначен некий макрос HelloWorld. |
|
|
bdfy
Belarus
267 Posts |
Posted - 08/01/2009 : 08:45:40
|
самое интересное как такую панель потом скриптом удалить то ? а то пока тренироватся буду я их сотню сделаю... |
|
|
Tumanov
Russia
1198 Posts |
Posted - 08/01/2009 : 10:10:09
|
Так как в примере стоит Temporary:=True, все они исчезнут после закрытия Visio. Действуют только в пределах сессии. |
|
|
bdfy
Belarus
267 Posts |
Posted - 08/01/2009 : 11:37:54
|
а создание вешается на событие открытия документа ? ну тож вариант )) посмотрим что будет получатся. |
|
|
bdfy
Belarus
267 Posts |
Posted - 08/01/2009 : 19:10:08
|
не очень то удобно получается (( иконки получаются маленькие, в линию. создать их Нное количество и оптимально разместить не получается. можно как то "нарисовать" контрол с кнопками и уже на эти кнопки повесить макросы ? |
|
|
Tumanov
Russia
1198 Posts |
Posted - 08/02/2009 : 05:57:29
|
Нарисовать - это поместить на рисунок? Можно сделать Insert / Control / Microsoft Forms 2.0 CommandButton. Для подключения макроса задействовать обработчик событий кнопки. Картинка вешается через свойство Picture. Можно просто к проекту VBA добавить свою форму и размещать кнопки там. Если открывать не в модальном режиме, то она так и будет болтаться рядом с рисунком. |
|
|
bdfy
Belarus
267 Posts |
Posted - 08/02/2009 : 19:19:58
|
варинт гораздо более приятный. но... несколько кнопок можно даже группировать - получается как раз что-то типа панели. но : кнопка вставляется в определенные координаты чертежа. и там остается. а если я перейду на другой лист ? или просто смещуюсь по рабочей области... нажать уже невозможно. нужен такой контрол но чтобы висел как панель - всегда перед носом. |
Edited by - bdfy on 08/02/2009 19:23:39 |
|
|
Tumanov
Russia
1198 Posts |
Posted - 08/02/2009 : 20:44:44
|
Тогда у Вас опять два варианта Можно сделать Anchored Window. Это дочернее окошко с поведением типа Drawing Explorer Window. В форуме уже обсуждалось и даже примерчик был. Или вообще перейти на работу с Drawing Control. Уж там-то в своем приложении можно делать любые кнопки в любом месте. |
|
|
bdfy
Belarus
267 Posts |
Posted - 08/06/2009 : 16:24:07
|
quote: Можно сделать Anchored Window
рылся, я рылся. нашел вроде пример на мсдн.
Public Sub Stock()
Dim wAddon As Visio.Window
Set wAddon = ActiveWindow.Windows.Add("Stock", visWSVisible, _
visAnchorBarAddon, , , 300, 210)
Dim pnLeft As Long, pnTop As Long, pnWidth As Long, pnHeight As Long
wAddon.GetWindowRect pnLeft, pnTop, pnWidth, pnHeight
wAddon.SetWindowRect pnLeft, pnTop, pnWidth + 1, pnHeight
End Sub окно да, создается. но оно пустое ( точнее показывает части большого окна) и затащить туда ничего у меня не выходит (( может потому что пример для визио 2000 ? |
|
|
Tumanov
Russia
1198 Posts |
Posted - 08/06/2009 : 20:11:15
|
Ну, это Вы размечтались... Слишком просто. Вот нашел какой-то более-менее похожий примерчик. Вроде работает. Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Public Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Public Const GWL_STYLE = (-16) Public Const WS_CHILD = &H40000000 Public Const WS_VISIBLE = &H10000000
Public m_Base As Base
Public Sub ShowBase()
Dim wAddon As Visio.Window Set wAddon = ActiveWindow.Windows.Add("Base", visWSVisible, visAnchorBarAddon, , , 300, 210)
Set m_Base = New Base m_Base.Caption = "Base"
Dim FormHandle As Long FormHandle = FindWindow(vbNullString, "Base")
SetWindowLong FormHandle, GWL_STYLE, WS_CHILD Or WS_VISIBLE
SetParent FormHandle, wAddon.WindowHandle32
Dim pnLeft As Long, pnTop As Long, pnWidth As Long, pnHeight As Long wAddon.GetWindowRect pnLeft, pnTop, pnWidth, pnHeight wAddon.SetWindowRect pnLeft, pnTop, pnWidth + 1, pnHeight For Each sh In ActivePage.Shapes m_Base.ListBox1.AddItem sh.Name Next
End Sub ================================ Только еще руками надо поработать :) Надо создать модуль Module1. Загрузить в него этот текст. Потом создать форму. Обозвать ее Base Повесить на нее ListBox1. На странице рисунка нарисовать несколько шейпов. Теперь можно запускать Module1 / ShowBase И если нигде не ошиблись, то выскочит формочка и выведутся в листбоксе имена присутствующих шейпов. Такое окошко должно вести себя как надо. |
|
|
bdfy
Belarus
267 Posts |
Posted - 08/07/2009 : 06:44:15
|
Public m_Base As Base ошибка : user defined type not defined reference какой подключить наверное надо ? вопрос какой ? |
|
|
Tumanov
Russia
1198 Posts |
Posted - 08/07/2009 : 15:47:18
|
Потом создать форму. Обозвать ее Base А это не забыли? |
|
|
|
Topic |
|