All Forums
 Категория Visio
 Форум Вопросы и ответы
 ? Своя панель инструментов.
Author Previous Topic Topic Next 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.
Go to Top of Page

bdfy

Belarus
267 Posts

Posted - 08/01/2009 :  08:45:40
самое интересное как такую панель потом скриптом удалить то ? а то пока тренироватся буду я их сотню сделаю...
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 08/01/2009 :  10:10:09
Так как в примере стоит Temporary:=True, все они исчезнут после закрытия Visio. Действуют только в пределах сессии.
Go to Top of Page

bdfy

Belarus
267 Posts

Posted - 08/01/2009 :  11:37:54
а создание вешается на событие открытия документа ? ну тож вариант )) посмотрим что будет получатся.
Go to Top of Page

bdfy

Belarus
267 Posts

Posted - 08/01/2009 :  19:10:08
не очень то удобно получается (( иконки получаются маленькие, в линию. создать их Нное количество и оптимально разместить не получается. можно как то "нарисовать" контрол с кнопками и уже на эти кнопки повесить макросы ?
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 08/02/2009 :  05:57:29
Нарисовать - это поместить на рисунок?
Можно сделать Insert / Control / Microsoft Forms 2.0 CommandButton. Для подключения макроса задействовать обработчик событий кнопки. Картинка вешается через свойство Picture.
Можно просто к проекту VBA добавить свою форму и размещать кнопки там. Если открывать не в модальном режиме, то она так и будет болтаться рядом с рисунком.
Go to Top of Page

bdfy

Belarus
267 Posts

Posted - 08/02/2009 :  19:19:58
варинт гораздо более приятный. но...
несколько кнопок можно даже группировать - получается как раз что-то типа панели.
но : кнопка вставляется в определенные координаты чертежа. и там остается. а если я перейду на другой лист ? или просто смещуюсь по рабочей области... нажать уже невозможно. нужен такой контрол но чтобы висел как панель - всегда перед носом.

Edited by - bdfy on 08/02/2009 19:23:39
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 08/02/2009 :  20:44:44
Тогда у Вас опять два варианта
Можно сделать Anchored Window. Это дочернее окошко с поведением типа Drawing Explorer Window. В форуме уже обсуждалось и даже примерчик был.
Или вообще перейти на работу с Drawing Control. Уж там-то в своем приложении можно делать любые кнопки в любом месте.
Go to Top of Page

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

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
И если нигде не ошиблись, то выскочит формочка и выведутся в листбоксе имена присутствующих шейпов.
Такое окошко должно вести себя как надо.
Go to Top of Page

bdfy

Belarus
267 Posts

Posted - 08/07/2009 :  06:44:15
Public m_Base As Base

ошибка : user defined type not defined
reference какой подключить наверное надо ? вопрос какой ?
Go to Top of Page

Tumanov

Russia
1198 Posts

Posted - 08/07/2009 :  15:47:18
Потом создать форму. Обозвать ее Base
А это не забыли?
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)