Пользовательский интерфейс

? Своя панель инструментов.

Предположим я создал набор макросов для оперирования с селектированными шейпами (я уже писал в прошлой теме - для сворачивания схемы сети). Как удобнее организовать их запуска ? хот-кеи конечно хороший вариант, но хочется дополнительно иметь панель инструментов "плавающую" прямо над рабочей областью. каждая кнопка - вызов опред. скрипта. как это сделать ?
В SDK есть пример изменения пользовательского интерфейса "Command Bar Creation"
Если оттуда выбросить лишнее, оставить только пример с макросом и сделать нужное количество кнопок, появится у Вас своя панелька. Можно ее и плавающей сделать.
Выглядит это примерно так:
[code] 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[/code]
Здесь на единственную кнопку назначен некий макрос HelloWorld.
самое интересное как такую панель потом скриптом удалить то ? а то пока тренироватся буду я их сотню сделаю...
Так как в примере стоит Temporary:=True, все они исчезнут после закрытия Visio. Действуют только в пределах сессии.
а создание вешается на событие открытия документа ? ну тож вариант )) посмотрим что будет получатся.
не очень то удобно получается (( иконки получаются маленькие, в линию. создать их Нное количество и оптимально разместить не получается. можно как то "нарисовать" контрол с кнопками и уже на эти кнопки повесить макросы ?
Нарисовать - это поместить на рисунок?
Можно сделать Insert / Control / Microsoft Forms 2.0 CommandButton. Для подключения макроса задействовать обработчик событий кнопки. Картинка вешается через свойство Picture.
Можно просто к проекту VBA добавить свою форму и размещать кнопки там. Если открывать не в модальном режиме, то она так и будет болтаться рядом с рисунком.
варинт гораздо более приятный. но...
несколько кнопок можно даже группировать - получается как раз что-то типа панели.
но : кнопка вставляется в определенные координаты чертежа. и там остается. а если я перейду на другой лист ? или просто смещуюсь по рабочей области... нажать уже невозможно. нужен такой контрол но чтобы висел как панель - всегда перед носом.
Тогда у Вас опять два варианта [:)]
Можно сделать Anchored Window. Это дочернее окошко с поведением типа Drawing Explorer Window. В форуме уже обсуждалось и даже примерчик был.
Или вообще перейти на работу с Drawing Control. Уж там-то в своем приложении можно делать любые кнопки в любом месте.
quote:
Можно сделать Anchored Window

рылся, я рылся. нашел вроде пример на мсдн.
[code]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[/code]
окно да, создается. но оно пустое ( точнее показывает части большого окна) и затащить туда ничего у меня не выходит (( может потому что пример для визио 2000 ?
Ну, это Вы размечтались... Слишком просто.
Вот нашел какой-то более-менее похожий примерчик. Вроде работает.
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
И если нигде не ошиблись, то выскочит формочка и выведутся в листбоксе имена присутствующих шейпов.
Такое окошко должно вести себя как надо.
[code]Public m_Base As Base[/code]
ошибка : user defined type not defined
reference какой подключить наверное надо ? вопрос какой ?
Потом создать форму. Обозвать ее Base
А это не забыли?

Добавление пункта меню

Купил по VBA книжку, т.к. появилась нужда вставить доп меню с возможностью запуска приложений. Переписал макрос - в Exel работает, в Visio никак, там обьекты подругому называются помогите кто чем. Private Sub WorkBook_Open() MenuBuilder End Sub Private Sub WorkBook_BeforeClose(Cancel As Boolean) MenuKiller End Sub Private Sub MenuBuilder() Dim cdMenuBar As CommandBar Set cdMenuBar = Application.CommandBars.Add(Name:="?????????????", _ Position:=msoBarTop, _ MenuBar:=True, _ Temporary:=True) With cdMenuBar .Visible = True With .Controls With .Add(Type:=msoControlPopup) .Caption = "Файл" With .Controls With .Add(Type:=msoControlButton) .Caption = "Новый" .OnAction = "NewDoc" End With With .Add(Type:=msoControlButton) .Caption = "Сохранить" .OnAction = "SaveDoc" End With With .Add(Type:=msoControlButton) .Caption = "Выход" .OnAction = "ExitApp" End With End With End With End With End With End Sub Sub MenuKiller() On Error Resume Next Application.CommandBars("МояСтрокаМеню").Delete On Error GoTo 0 End Sub Sub Auto_Open() WorkBook_Open End Sub
рекомендую посмотреть "дизайнера" который входит в пакет васика6

вот собственно мой дизайнер http://www.immortal.vstu.edu.ru/Connect.rar

можно разобрать его, есть несколько комментов там

визио 2003 форэвер

...а вобще-то я белый и пушистый.
найди через поиск в хелпе визио VBA Editor статью :

SetCustomMenus method

This Microsoft Visual Basic for Applications (VBA) macro shows how to add a menu and menu item to the drawing window menu set...
Menus: Add Items to the File menu.

Public Sub MenuItem_Add()

Dim uiObj As Visio.UIObject
Dim visMenuSets As Visio.MenuSets
Dim visMenuSet As Visio.MenuSet
Dim visMenus As Visio.Menus
Dim visMenu As Visio.Menu
Dim visMenuItems As Visio.MenuItems
Dim visMenuItem As Visio.MenuItem

Set uiObj = Visio.Application.BuiltInMenus
Set visMenuSets = uiObj.MenuSets
' Get the Visio object context menu set.
Set visMenuSet = visMenuSets.ItemAtID(visUIObjSetDrawing)
Set visMenus = visMenuSet.Menus
' Get the file menu from the menus collection.
Set visMenu = visMenus.Item(0)
' Get the items collection from the file menu
Set visMenuItems = visMenu.MenuItems

' Add Example Menu Item to the File menu in the 4th position
Set visMenuItem = visMenuItems.AddAt(3)
visMenuItem.Caption = "Example"
visMenuItem.State = Visio.visButtonUp

' Have Example run the HelloWorld Sub procedure
visMenuItem.AddOnName = "ThisDocument.HelloWorld"

' Set the new menus.
Visio.Application.SetCustomMenus uiObj
' Tell Visio to use the new UI when the document is active.
ThisDocument.SetCustomMenus uiObj
End Sub
во человек... 12 дней молчал и выдал...
дык получилось добавить пункт в меню или нет ???
я не тот человек, я просто посторонний, тему открывал другой визажист

Работа с меню Визио

Создал в VSD VBA-код, добавляющий меню "Выход" в Визио кот должен закрывать документ. При работе - ошибка - залезает в недопустимую область памяти и обваливает само Визио. ---------------------------------------------------------------------- Dim UIObj As Visio.UIObject, mnSet As Visio.MenuSet, mn As Visio.Menu Private Sub Document_DocumentOpened(ByVal doc As IVDocument) Set UIObj = Visio.Application.BuiltInMenus: Set mnSet = UIObj.MenuSets.ItemAtID(visUIObjSetDrawing) Set mn = mnSet.Menus.AddAt(0): mn.Caption = "Выход": mn.AddOnName "Application.DoCmd(visCmdFileClose)" 'me.AddOnName="Me.Close" 'mn.AddOnName "ThisDocument.Close": mn.Enabled=true ThisDocument.SetCustomMenus UIObj End Sub -------------------------------------------- (закоментированные варианты делают меню "Выход" неактивным) В то же время, добавив конпку CommandButton семейства MSForms 2.0 и навесив на нее Me.Close - получаем корректный выход из рис. В чем дело? Багоцкий
У меня очень похожая ситуация.

Такое ощущение, что, в .AddonName должна быть либо команда (DoCmd), либо реальный addon, который есть в коллекции addon-ов приложения. И описываться он должен, как имя exe-файла. Если же в AddonName передается какая-то левая строчка, то он просто дизейблит соответствующий пункт меню :((((

Отсюда вопрос как сделать так, чтобы при нажатии на пункт меню вызывался именно какой-нибудь метод.

Конечно, можно делать меню через CommandBar и навешивать на CommandBarButton обработчик событий, но это очень неудобно...

Может кто-нибудь подскажет, либо как все-таки заставить MenuItem вызывать не только готовые addon-ы, либо как можно сопоставить CommandBarButton конкретному пункту меню, созданному через UIObject.

UIObject

Как пользоваться объектом UIObject ? Вычитал в SDK про него, что он хранит все Menus и ToolBars. Вызвать MenuSets я могу, но что с ним делать дальше - неизвестно. Очень сильно меня property Enabled интересует. Я хочу, чтобы вызывался Visio, в котором все Menu и ToolBar не активны.
Если Вы читали про него в SDK, то там же есть и примеры использования (непосредственно в документации).
А если "на пальцах", то UIObject - это старый интерфейс к меню и тулбарам Visio, который сейчас заменяется CommandBars. Действовал раздельно на меню и тулбары. Основан на том, что и Application и Document могут иметь как встроенные, так и пользовательские наборы меню. Один из наборов ассоциируется с объектом UIObject, изменяется и активируется, подменяя ранее доступный пользователю набор.
Измененный набор может быть сохранен в файле и загружаться макросом или при старте документа или приложения.
UIObject - это корень выбранного Вами набора, а дальше по дереву идет обращение к отдельным панелям, меню...
Важно не только модифицировать меню или тулбар, но и не забыть его активировать, а то он будет в наличии, но пользователь его не почувствует.
Смотрите примеры...
Попробовал использовать CommandBars. Тут все еще более непонятно и запутано. В C# это object и как из него что-то получить я не знаю.
Главня моя задача - запретить пользователю добавлять новые страницы и документы к моему Application. Мне кажется, что сделать меню неактивным - это простое и красивое решение проблемы.
Вопрос такой: как мне программно добраться до File/New/New Drawing и Insert/New Page и сделать их неактвиными ?
Ну вот же пример из документации. Без изменений. Из SDK.
Отличие только в том, что пункт не деактивируется, а удаляется, да пункт меню для примера другой выбран.

To remove an item, use the Delete method of that item. For example, the following statements remove the Show ShapeSheet menu item from the Window menu in the drawing window for the running Visio instance:

Dim uiObj As Visio.UIObject
Dim menuSetObj As Visio.MenuSet
Dim menuItemsObj As Visio.MenuItems
Dim i As Integer

Set uiObj = Visio.Application.BuiltInMenus
Set menuSetObj = _
uiObj.MenuSets.ItemAtID(visUIObjSetDrawing)

'Get the Window menu.
Set menuItemsObj = menuSetObj.Menus(7).MenuItems

'Get the Show ShapeSheet menu item by its CmdNum property.
'This technique works with localized versions of Visio.
For i = 0 To menuItemsObj.Count -1
If menuItemsObj(i).CmdNum = _
visCmdWindowShowShapeSheet Then
menuItemsObj(i).Delete
Exit For
End If
Next i

'Replace built-in Visio menus with customized set.
Visio.Application.SetCustomMenus uiObj
С CommandBars разобрался. Но тут проблемы не закончились. Когда я произвожу какие-либо изменения в меню, то эти изменения касаются всего Visio. То есть при любом последующем запуске Visio, даже если запускаю не из программы, появляется измененное мной меню. Чтобы убоать изменения, надо удалить файл custom11.vsu .
Меню File я обрезал как надо.
С меню edit началить проблемы: не могу добраться до пункта меню, который неактивный(Enabled = false Visioble = true). Как до него добраться ?
Есть меню View и Toolbar View, чтобы их вызвать я пишу
CommandBars(View). Как мне понять, что я вызвал ?
quote:
Originally posted by Juri_Zivago

Как пользоваться объектом UIObject ?
Вычитал в SDK про него, что он хранит все Menus и ToolBars. Вызвать MenuSets я могу, но что с ним делать дальше - неизвестно. Очень сильно меня property Enabled интересует.
Я хочу, чтобы вызывался Visio, в котором все Menu и ToolBar не активны.

напишите отдельную программу, вставте туда компонент Microsoft Visio Draving Control type library

визио 2003 форэвер

...а вобще-то я белый и пушистый.

Popup Menu

Можно ли добавить свой пункт в меню, появляющееся при нажатии правой кнопкой мыши на шейп?
когда профи молчат на сцену выходят дилетанты -:)
вот что я нашел в хелпе моего visio 2003:

You could add a command to a shape's shortcut menu that goes to another page in the drawing. To do this, select the shape, and then click Show ShapeSheet on the Window menu. On the Insert menu, click Section, select the Actions check box, and then click OK.
Select a cell in the Actions section, and then on the Edit menu, click Action. Fill in the Menu box, and then choose an action (for this example, click the Go to page option). For more information, see the ShapeSheet Reference (on the Help menu, click Developer Reference)

quote:
Originally posted by brace

когда профи молчат на сцену выходят дилетанты -:)
вот что я нашел в хелпе моего visio 2003:

You could add a command to a shape's shortcut menu that goes to another page in the drawing. To do this, select the shape, and then click Show ShapeSheet on the Window menu. On the Insert menu, click Section, select the Actions check box, and then click OK.
Select a cell in the Actions section, and then on the Edit menu, click Action. Fill in the Menu box, and then choose an action (for this example, click the Go to page option). For more information, see the ShapeSheet Reference (on the Help menu, click Developer Reference)



да ладно прибедняться-то, я дык по нерусски не понимаю. :-)
т.к. не написана версия визио и русифицирована она или нет пишу относительно русифицированной:
1. Выделяем шейп
2. Меню: Окно - показать лист
3. Кликаем на открывшимся листе правой кнопкой мыши и в контекстном меню жмём
Вставить секцию...
4. выбираем секцию "Действия" , жмём "ОК"
Появится секция Action, нам нужны ячейки: Menu и Action соответственно пишем в Menu название вашего меню в Action действие, кот. необходимо выполнить при нажатии на это меню.
воть и усё


визио 2003 форэвер

...а вобще-то я белый и пушистый.
По поводу ячейки Action:
Можно ли запускать свою функцию?
=DOCMD(<номер команды>) описание комманд тут http://prodigitall.narod.ru/docs/docmd.txt
запуск Add-on: =RUNADDON("my.exe")
если адд-он ваш, необходимо прописать путь к нему в меню: Инструменты - опции... Дополнительно - пути файлов... Добавления:

визио 2003 форэвер

...а вобще-то я белый и пушистый.
Ставлю в номер команды 1577 - Макрос, появляется окошко с выбором моих макросов, а как сразу запустить один из них?
=RUNADDON("имя макроса")
причём макрос должен лежать в документе где он запускается

визио 2003 форэвер

...а вобще-то я белый и пушистый.
Большое спасибо... :)
=DOCMD(<номер команды>)
Ya vybrala (<номер команды>)- DOCMD(1451) - drawing>text block tool

V contex menu poyavilsya item s imenem, kotoroe ya zadala v section "Actions", no ozidaemyh deystviy net.

Probovala i drugie komandy, tot ze result: imya dobavlyaetsya, a deystviy nikakih.

U menya stoit Visio 2003.

Mozet eze 4egoto ne hvataet.
Выполняются не все команды (почему-то).
Окошки открываются исправно, как положено. А вот 1451 - не работает.
Daze ne znayu 4t0 vypolnyaetsya, probovala 1010, 1021
Mozet poprobovat' posadit' 1451 v macro i ottuda vyzyvat'?
Da, tak rabotaet!!!!
Ura!!

Кнопка запуска макроса на панели инструментов

Как засунуть в VISIO кнопку в панель инструментов для запуска какого либо макроса. Заранее благодарен тем кто поможет.
см. в хелпе визио вба эдитор
примерчик на вба там есть
только называется это типа
customer item in menu
Спасибо за помощь "brace".

Как подключить горячие клавиши

Господа профессионалы, а неподскажет ли кто как подключить на шейпы горячие клавиши?
Вопрос не доходит...
Что значит "подключить клавишу на шейп"?
Я имею ввиду назначить для шейпа хоткей. Это вообще возможно?

quote:
Originally posted by Tumanov

Вопрос не доходит...
Что значит "подключить клавишу на шейп"?


в visio это называется shortcut keys
в хелпе есть поле для поиска забей туда shortcut
получишь инфу на эту тему.
Похоже что Вы говорите о master shape shortcut. Это совсем другое. Это вид ссылки на шейп, а мне необходимо сделать так чтоб шейпы вставлялись на рисунок не drug-n-drop из стенсила а по комбинации клавиш.

quote:
Originally posted by brace

в visio это называется shortcut keys
в хелпе есть поле для поиска забей туда shortcut
получишь инфу на эту тему.


не так сложно ответить как сложно понять что человек хочет ???
тем более если он не может сформулировать вопрос точно.
мой ответ:
шейпов в visio неск. тысяч и никаких комбинаций клавиш не хватит на все шейпы.

quote:
Originally posted by Dmitry

Похоже что Вы говорите о master shape shortcut. Это совсем другое. Это вид ссылки на шейп, а мне необходимо сделать так чтоб шейпы вставлялись на рисунок не drug-n-drop из стенсила а по комбинации клавиш.

quote:
Originally posted by brace

в visio это называется shortcut keys
в хелпе есть поле для поиска забей туда shortcut
получишь инфу на эту тему.





Можно тогда записать макрос, который вставляет определенную фигуру, скажем из локального трафарета и повесить на него комбинацию клавиш.
quote:
Originally posted by Digitall

quote:
Originally posted by Dmitry

Похоже что Вы говорите о master shape shortcut. Это совсем другое. Это вид ссылки на шейп, а мне необходимо сделать так чтоб шейпы вставлялись на рисунок не drug-n-drop из стенсила а по комбинации клавиш.

quote:
Originally posted by brace

в visio это называется shortcut keys
в хелпе есть поле для поиска забей туда shortcut
получишь инфу на эту тему.





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



Может опрашивать нажатия макросом с шаблона и при нужных комбинациях вставлять нужный шейп?
quote:
Originally posted by brace

не так сложно ответить как сложно понять что человек хочет ???
тем более если он не может сформулировать вопрос точно.
мой ответ:
шейпов в visio неск. тысяч и никаких комбинаций клавиш не хватит на все шейпы.





Насчет понимания: А что хоткей и шоткат это одно и тоже? [:)]
Насчет множества шейпов: Нужны хоткеи только для некоторых...
определение термина "shortcut"
A keyboard shortcut (also known as an accelerator key, shortcut key, or hotkey) is a set of keyboard keys that when pressed simultaneously, perform a predefined task. Such a task could be done with the mouse (or other analog input such as a trackball), but would require much longer. Hence, they are a shortcut in that they save the user time.
смотри здесь:
en.wikipedia.org/wiki/Shortcut_(computers)
Простите если можете...
Нехотел обидеть... :)

quote:
Originally posted by brace

определение термина "shortcut"
A keyboard shortcut (also known as an accelerator key, shortcut key, or hotkey) is a set of keyboard keys that when pressed simultaneously, perform a predefined task. Such a task could be done with the mouse (or other analog input such as a trackball), but would require much longer. Hence, they are a shortcut in that they save the user time.
смотри здесь:
en.wikipedia.org/wiki/Shortcut_(computers)

Господа, подскажите плз, такая проблема...

Вобщем, в Visio по нажатию на определённую комбинацию клавишь необходимо выполнить некоторую функцию.

Пытался делать с помощью вин апишной ф-ции RegisterHotKey, но не удалось довести дело до конца....

Если Visio 2003, то можно обойтись без Win API.

1. Можно написать макрос, включить в него нужную функцию и назначить этому макросу комбинацию клавиш.
Кажется эта комбинация обязательно должна включать Ctrl.
Клавиши назначаются через окошко, появляющееся по Alt+F8 (кнопка Options).

2. Можно написать обработчик для события нажатия клавиши.
Для этого в модуле класса (в простейшем случае ThisDocument) объект (например Window) объявляется WithEvents,
Dim WithEvents MyWin As Visio.Window
затем пишется обработчик. Например
Private Sub MyWin_KeyDown(ByVal KeyCode As Long, ByVal KeyButtonState As Long, CancelDefault As Boolean)
MsgBox KeyCode
End Sub
И наконец, где-то этот объект ассоциируется с реальным объектом. В простейшем случае - при открытии документа или отдельным макросом.
Sub ttt()
Set MyWin = ActiveWindow
End Sub
Такой макрос заставит MyWin обрабатывать события, после чего обработчик MyWin_KeyDown начнет выводить окно сообщений с кодом клавиши при каждом нажатии клавиши.
Благодарю за ответ.Но оба приведённых способа меня не совсем удовлетворяют...
Первый способ неудовлетворяет ограниченностью возможной комбинации.
Второй способ обрабатывает только нажатие, которое возвращает Ascii-код.
Мне же необходимо использовать произвольную комбинацию, как пожелает заказчик (например CTRL+ALT+F10)
Подскажите плиз, если ли решение...

И еще один вопрос возник: каким образом можно запретить комбинацию ALT+F8 (вызов окна макросов)? Если не запретить совсем, то хотя бы переназначить, что бы выводилась месага а-ля "Доступ закрыт"
Спасибо.
К предыдущему посту:
версия Visio - 2003.

Отключение горячих клавиш

Уважаемые, как отключить горячие клавиши в компоненте Visio? Тужибаев Тимур
А что именно ты хочешь получить?
Я тоже сейчас работаю с этой проблемой.

___ Кто ищет тот найдет __
quote:
Originally posted by Voland

А что именно ты хочешь получить?
Я тоже сейчас работаю с этой проблемой.

___ Кто ищет тот найдет __



Я пользую контрол Visio и в моей програмке ну никак не планируется появление окошка поиска, открытия хелпа и т.п. от visio. У контрола есть возможность отключения большинства команд прям из свойств контрола , но почему то отключаются не все команды :(

Тужибаев Тимур
Как я понял ты используешь DrawingControl. Да, действительно он не перекрывает всех действий, но я хочу сейчас попробовать перехватывать его WinProc и там уже анализировать что нужно/можно что нет. Можем заняться напару этим делом. Думаю, именно для этого и сделали доступной эту процедуру в компоненте, хотя не факт...

___ Кто ищет тот найдет __
может быть проще переопределить эти же горячие клавиши в самой программе?... т.е не касаясь дровинг контрола?..

и если можно расскажите как вы хоть какие то команды отключили?
quote:
Originally posted by mers

может быть проще переопределить эти же горячие клавиши в самой программе?... т.е не касаясь дровинг контрола?..

и если можно расскажите как вы хоть какие то команды отключили?



Drawningcontrol.negotiatemenus = true
Drawningcontrol.negotiatetoolbars = true

Тужибаев Тимур
Уважаемые, hotelos' by uznat' 4to-nibud; u vas polu4ilos'?

S CTRL+V boryus' elementarenym

Clipboard.Clear

in the DrawningControl_KeyDown event

A vot CTRL+D napryagaet.
Ostal'nye горячие клавиши ne meshayut funkzional'nosti moey application.
Функциональные клавиши как то оключил, уже не помню как... вспомню напишу, а вот с контрл+С контрл+V сделал так:
На событие ОнКейАп поставил
if (KeyCode=17) or (KeyCode=16) then begin
AddShapeOK:=true;
end;
На событие ОнКейДавн поставил
if (KeyCode=17) or (KeyCode=16) then begin
AddShapeOK:=False;
end;

На событие ОнШейпАддедед

if AddShapeOK then begin
Тут типа нормально, добавили и попачили если надо
end else begin
Shape.Cells['LockDelete'].Formula:='0';
Shape.Delete;
end;






___ Кто ищет тот найдет __
А вспомнил... Вобщем сделал немного кривовато, но пока других способов не искал...
Вобщем кинул на форму (я в Делфи) компонент ApplicationEvents и внем на событии OnMessages вставил код
if (Msg.message=WM_KEYDOWN) then begin
If (Msg.wParam>=112) and (Msg.wParam<=121) then begin
Msg.wParam:=0;//Тут отключил все функциональные клавиши
end;
If (Msg.wParam>=221) then begin
Msg.wParam:=0; //Тут помоему Ctrl+D :)))
end;
end;

Вобщем так можно всю клаву отключить :)

Криво но пока устраивает... :(


___ Кто ищет тот найдет __
Ya rabotayu v VB6 tam eto tak sdelat' trudnee.
Budu probovat'.
Spasibo za sovet.

Управление элементы меню Visio

Никто не пробовал скрывать какие-нибудь менюшки Visio (если нашему add-in они не нужны и мы не хотим их показывать)
меню в визио можно настраивать под свой вкус
View > Toolbars > Customise
открывается окно которое позволяет добавлять/убирать кнопки/команды
или вернуть все в дефолтный вариант меню.
quote:
Originally posted by brace

меню в визио можно настраивать под свой вкус
View > Toolbars > Customise
открывается окно которое позволяет добавлять/убирать кнопки/команды
или вернуть все в дефолтный вариант меню.



Тут, насколько я понял, интересует VB вариант...
скачайте себе SDK
там есть пример создания и скрытия меню
вот еще, правда на C#:
quote:
Integrating Menus and Toolbars
The best practice when building an application using the Visio drawing control is to implement a custom UI. If you want to display Visio menus and toolbars in your container application, set the drawing control's NegotatiateToolbars and NegotiateMenus properties. The following C# code enables both menu and toolbar merging:[code]drawingControl.NegotiateMenus = True;
drawingControl.NegotiateToolbars = True;[/code]The best practice is to set both of these properties to the same value. The control will not support independent negotiation of toolbars and menus.

The container application must support OLE menu merging in order to display Visio menus or toolbars. For example, you can enable toolbar merging in a Word document. Within the Visual Basic project of the Word document you can programmatically display Visio toolbars. The following example displays the Layout & Routing toolbar.[code]vsoApplication.CommandBars("Layout & Routing").Visible = True[/code]Important Do not attempt menu and toolbar merging with multiple active instances of the ActiveX control. Multiple instances of the control share a single underlying Visio Application object. You may get unexpected results when trying to do menu merging with a single Application object and multiple active instances of the control.
Important Do not merge menus and toolbars with the Internet Explorer user interface. There are known issues with menu merging in Internet Explorer (see the Microsoft Knowledge Base article 193098, PRB: Unexpected Menu Merging Behavior in Internet Explorer).
взято с:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vissdk11/html/viconAboutWorkingWithDrawingControl_HV01046843.asp
to mers : Оки =) Можно попробовать через это, хотя я делал по другому. Я своё меню встраивал в Visio, и трабла была в том, что там метод Add() есть, а для удаления ничего нету....
А, всё, ступил =) уже разобрался!

Вложенные меню

Коллеги, не выручите примером кода создания вложенного главного меню в Visio ? Например, пункт главного меню "Отчеты" содержит "Сводный план", "Квартальный план", а "Сводный план" в свою очередь содержит подпункты "По ГИПам", "По заказчикам". Спасибо. ------------------------------------------------------------------------------------------------ Если автор пишет о том, чего не понимает, его работа будет понята только теми читателями, которые понимают в этом больше, чем он !
Сам нашел [:D], даю решение, может быть, кому-нибудь и пригодится:
[code]Sub AddMenuToMenuBar(vsoApplication As Visio.Application)
' Abstract - This procedure gets the active MenuBar from
' Visio and adds a Menu at the end called "Custom".

Dim cbrCommandBars As Office.CommandBars
Dim cbrMenuBar As Office.CommandBar
Dim cbrMenuPopup As Office.CommandBarPopup
Dim cbrMenuPopup_Group As Office.CommandBarPopup

Dim cbrFilePopup As Office.CommandBar
Dim cbbMenuItem As Office.CommandBarButton
Dim cbbOpen As Office.CommandBarButton
Dim XID As Integer


' Get the CommandBars collection from Visio.
Set cbrCommandBars = Application.CommandBars

' Get the active menu bar from the CommandBars
' collection.
Set cbrMenuBar = cbrCommandBars.ActiveMenuBar

' Add a pop-up menu to the end of the menu bar.
Set cbrMenuPopup = cbrMenuBar.Controls.Add( _
Type:=msoControlPopup, _
Temporary:=True)
cbrMenuPopup.Caption = "тест"


' Get the ID of the "File/Open..." MenuItem
Set cbrFilePopup = cbrCommandBars.Item("File")
Set cbbOpen = cbrFilePopup.Controls.Item(2)

' Add a MenuItem with the ID of "File/Open...".
Set cbbMenuItem = cbrMenuPopup.Controls.Add( _
Type:=msoControlButton, _
ID:=cbbOpen.ID, Temporary:=True)

' Set the caption for the MenuItem.
cbbMenuItem.Caption = "тест"
cbbMenuItem.Style = msoButtonCaption
cbbMenuItem.Visible = True
cbbMenuItem.OnAction = "ShowNum"

Set cbrMenuPopup_Group = cbrMenuPopup.Controls.Add( _
Type:=msoControlPopup, Temporary:=True)


cbrMenuPopup_Group.Caption = "тест"

Set cbbMenuItem = Application.CommandBars(cbrMenuPopup_Group.CommandBar.Name).Controls.Add

cbbMenuItem.Caption = "тест"
cbbMenuItem.OnAction = "GetAllObjects"

Set cbbMenuItem = Application.CommandBars(cbrMenuPopup_Group.CommandBar.Name).Controls.Add

cbbMenuItem.Caption = "тест"
cbbMenuItem.OnAction = "GetAllObjectsFromActivePage"

Set cbbMenuItem = Application.CommandBars(cbrMenuPopup_Group.CommandBar.Name).Controls.Add


cbbMenuItem.Caption = "тест"
cbbMenuItem.OnAction = "GetAllProcedures"
cbbMenuItem.BeginGroup = True

Set cbbMenuItem = Application.CommandBars(cbrMenuPopup_Group.CommandBar.Name).Controls.Add

cbbMenuItem.Caption = "тест"
cbbMenuItem.OnAction = "GetProceduresFromActivePage"

Set cbbMenuItem = Application.CommandBars(cbrMenuPopup_Group.CommandBar.Name).Controls.Add

' Set the caption for the MenuItem.
cbbMenuItem.Caption = "тест"
cbbMenuItem.OnAction = "GetAllSwitches"
cbbMenuItem.BeginGroup = True

Set cbbMenuItem = cbrMenuPopup.Controls.Add( _
Type:=msoControlButton, _
ID:=cbbOpen.ID, Temporary:=True)

' Set the caption for the MenuItem.
cbbMenuItem.Caption = "тест"
cbbMenuItem.Style = msoButtonCaption
cbbMenuItem.Visible = True
cbbMenuItem.OnAction = "ShowViewTXT"
cbbMenuItem.BeginGroup = True


Set cbbMenuItem = cbrMenuPopup.Controls.Add( _
Type:=msoControlButton, _
ID:=cbbOpen.ID, Temporary:=True)

cbbMenuItem.Caption = "тест"
cbbMenuItem.Style = msoButtonCaption
cbbMenuItem.Visible = True
cbbMenuItem.OnAction = "ShowTP"

Exit Sub


AddMenuItemToMenuBar_Err:
MsgBox Err.Description

End Sub[/code]

------------------------------------------------------------------------------------------------
Если автор пишет о том, чего не понимает, его работа будет понята только теми читателями, которые понимают в этом больше, чем он !

Удаление пункта из меню

To delete a menu item, you can use code similar to the following: Dim CmdBar As CommandBar Dim CmdBarMenu As CommandBarControl Set CmdBar = Application.CommandBars("Worksheet Menu Bar") Set CmdBarMenu = CmdBar.Controls("Tools") CmdBarMenu.Controls("New Item").Delete это код написан для Excel но поскольку visio and excel из одной компашки MS OFFICE по идее должно работать если ктонить заменит иксельные слова на нужные.

Переназначение горячих клавиш

Назначил несколько горячих клавиш в Visio 2000 , изменив стандартную библиотеку VisRes32.dll. Работать стало значительно удобнее, но... При работе в режиме Text Tool прописанные клавиши переключают режимы обратно [:(]. Кто знает, подскажите плз - можно ли это обойти, не прибегая к назначению комбинаций клавиш (shift, ctrl + ##)?

Visio 2003 панель инструментов

Пожалуйста помогите, если может кто!!! После установки AdobeAcrobat 7(стал необходим для дальнейшей работы) пропадают все настройки "настроенной под себя" панели управления, установок хватает только на повторный запуск, на т ретий раз уже просто стандартные панели :(( Помогите пожалуйста. Может кто сталкивался с этим. До Acrobata все было окей

Проблемы с контекстным меню

Необходимо в контекстное меню добавить пункт "Скрыть".И при выборе объекта левой кнопкой мыши этот пункт был доступным, а при клике на пустое место пунк "Скрыть" был бы не доступен (напрмер, как с Help)!
Контекстное меню можно добавить только к чему-нибудь. При клике на пустое место оно всегда будет недоступно (вернее его просто не будет).
В Visio контекстное меню называется shortcut menu. Вот цитата из документации, где рассказывается, как создать пункт меню и прицепить к нему макрос:

Add a macro or add-on to a shape's shortcut menu
Select the shape.
On the Window menu, click Show ShapeSheet.
Click in an Action cell in an Actions section.
If you don't see an Actions section, insert one by clicking Section on the Insert menu, and then selecting the Actions check box in the Insert Section dialog box.
On the Edit menu, click Action.
In the Action dialog box, under Properties, enter the menu and prompt properties.
Click Run macro, and then select the program you want to run from the Run macro list. Click OK.
On the drawing page, right-click the shape, and then click the custom menu command on the shortcut menu to run the program.
Note You also can associate a macro or add-on with a shape by entering a formula that uses the RUNADDON function in any ShapeSheet cell.
Пункт меню я создавать умею:

Set vsoUIObject = appVisio.BuiltInMenus
Set vsoConMenuSets = vsoUIObject.MenuSets
Set vsoConMenuSet = vsoConMenuSets.ItemAtID(visUIObjSetCntx_DrawObjSel)
Set vsoConMenus = vsoConMenuSet.Menus
Set vsoConMenu = vsoConMenus.Item(0)
Set vsoConMenuItems = vsoConMenu.MenuItems
Set vsoConMenuItem = vsoConMenuItems.AddAt(vsoConMenuItems.Count)
vsoConMenuItem.Caption = "&Скрыть"
vsoConMenuItem.Enabled = False
vsoConMenuItem.AddOnName = "ThisDocument.HideObject"
vsoConMenuItem.ActionText = "Run HideObject "
ThisDocument.SetCustomMenus vsoUIObject

В сделующем примере кода я проверяю взят ли объект.
И нужно следующее: если объект взят, то пункт "Скрыть" должен быть доступен, иначе недоступен.

If Button = 2 Then
Dim intRet As Integer, shpObj As Visio.Shape
Dim shpsObj As Visio.Shapes
Dim Find As Boolean
Set shpsObj = vsoPage.Shapes
For Each shpObj In shpsObj
intRet = shpObj.HitTest(x, y, 0)
If intRet = 0 Then
Enabled_False ' здесь нужно, чтобы пункт "Скрыть" остался enable = false

Else
Enabled_True ' а здесь нужно, чтобы пункт "Скрыть" остался enable = true

End If
Next
End If

Drop down menu item в Windows User Interfase

добрый день! решил тут побаловаться с Visio for Enterprise Architects (10.0.2705) в плане построения Windows User Interfase диаграмм. есть такой элемент в этой диаграмме, "Drop down menu item" который представляет елемент выпадающего меню формы. проблема в том, что *длинна* этого елемента жестко зафиксирована и невозможно ее изменить. сами понимаете что тест на пунктах меню может быть самый разный. кто сталкивался с таким эфектом? как побороть!
quote:
Originally posted by serkuzm

добрый день!

решил тут побаловаться с Visio for Enterprise Architects (10.0.2705)
в плане построения Windows User Interfase диаграмм.

есть такой элемент в этой диаграмме, "Drop down menu item" который представляет елемент выпадающего меню формы.
проблема в том, что *длинна* этого елемента жестко зафиксирована и невозможно ее изменить. сами понимаете что тест на пунктах меню может быть самый разный.

кто сталкивался с таким эфектом?
как побороть!


Зайти в ТаблицуФигур(Window>ShapeSheet), найти раздел Scratch(Наброски) и в этом разделе найти ячейку А1. В этой ячейке содержится формула, запрещающая изменение длины меньше, чем заданный минимум. Можете просто удалить содержимое этой ячейки, или поставить 0.
quote:
Originally posted by Digitall


Зайти в ТаблицуФигур(Window>ShapeSheet), найти раздел Scratch(Наброски) и в этом разделе найти ячейку А1. В этой ячейке содержится формула, запрещающая изменение длины меньше, чем заданный минимум. Можете просто удалить содержимое этой ячейки, или поставить 0.



Благодарю за ответ, но не могу найти указанный раздел: "Scratch". Возможно у нас разные версии Визио.

Можно ли узнать исходную формулу которая запрещает изменение длинны?

з.ы.
все-таки надо будет поискать в своей библиотечке литературу по Visio..[^]
хм... :)
Как обычно надо немного подумать перед тем как говорить.

Раздел Scratch действительно существует, но у другого элемента - Top-level menu item. А у Drop-down menu item такого свойства нет.
Однако у него есть 1-D Endpoints которое по умолчанию =GUARD(BeginX+25,4 mm)
Меняя значение числа можно изменять длинну элемента.

Надо срочно читать литературу по визио!!!

Проблемы s CustomMenu

Здраствуйте. Имеется следующая Ситуация. При старте Visio загружается Addon и в линейке Меню появляется новое меню. К этому Menu я программно "цепляю" новые елементы. Если открыт Документ, то в зависимости от определенных условий я делаю некоторые элементы невидимыми или же невидимые элементы делаю видимыми(передаю параметру MenuItem.Visible false или true). Теперь во время тестов я наткнулся на один документ который содержит ещё один Add-On с собственным меню. В этом случае, мое Меню всегда выглядит так , как оно выглядело до открытия документа, в не зависимости от того какое значение имеет параметр Visible(причем значениe именно ,то что я передал) . Может ли кто-то подсказать в чем дело? P.S. Позиция моeго Меню в массиве Menus не меняется
Ваш Add-On запускается несколько раз (при открытии Visio и при открытии документа) или Вы после единственного запуска начинаете анализировать наличие и свойства документа?
Такое подозрение, что Ваш Add-On сначала что-то делает, потом вылетает и на попытки управлять свойством Visible уже просто не реагирует.
Как раз собирался стереть топик :)

мой Addon запускается при открытии Visio.
Как я понимаю, дело в Том что я выполнял Функцию SetCustomMenu(UIObject) для Application
Попробовал тоже самое сделать посже для Документа: теперь мое меню работает адекватно, но
"вражеское меню"( :) ) изчезло. Первая мысль: я своим UIObject'om заменил существующий. Буду проверять.
Так создаваемый UIObect обязательно заменяет существующий. Поэтому первым делом советуют смотреть, существует ли на данный момент пользовательское меню уровня документа или приложения, и выбирают, что взять в качестве прототипа - что-то из них или встроенное меню.
Я немного запутался.
Если я добавляю меню в массив пользовательских меню на уровне приложения, то при открытии документа я должен был бы видеть
меню которые находятся в массиве на уровня документа.
Я же вижу меню и того и другого массива.
Как это обьяснить?
P.S.
Только что проверил какие меню находятся
в массиве пользоватeльских меню на уровне документа и обнаружил,
что мной добавленое меню уровня приложения тоже там. ???

Menu

Есть такая проблема: открывается Visio с моим трафаретом. Пользователь может перетаскивать на страницу Shape'ы. Как сделать так, чтобы пользователь не смог открывать новые документы и создавать новые страницы ? А еще лучше как сделать недоступными для пользователя все меню, разве что кроме Edit, и все все панели инструментов ?

software->Toolbars and Menus

В трафарете software->Toolbars and Menus у всех шейпов есть точки благодаря которым они могут соединятся друг с другом, как они сделанны не могу разобраться? Но если два шейпа соединены этими точками то перетаскивая один шейп за ним тянется другой присоединёный причём это не групировка. Как сделать такое?
мое преположение но точно не знаю !

маленькие синие крестики на шейпах
это Connection Points
их поведение задается в ShapeSheetданного шейпа
чтобы они клеились надо поменять параметр в ячейке
quote:
Originally posted by Borg

В трафарете software->Toolbars and Menus у всех шейпов есть точки благодаря которым они могут соединятся друг с другом, как они сделанны не могу разобраться? Но если два шейпа соединены этими точками то перетаскивая один шейп за ним тянется другой присоединёный причём это не групировка. Как сделать такое?


Данное соединение называется жесткой связью. Характерным признаком жесткой связи являются маркеры подключенной фигуры красного цвета.

Более подробно [url]http://www.prodigitall.narod.ru/articles/article12.html[/url]
>> Brace в ShapeSheet я не нашёл ни чего что бы отличало эти шейпы от других только раздел 1-D который не доступен у остальных фигур
>> Digitall к сожелению это не то эти точки видны только когда шейп выделен и левая представляет из себя зелёный квадрат со звёздочкой, а правый зелёный квадрат с плюсом.
quote:
Originally posted by Borg


>> Digitall к сожелению это не то эти точки видны только когда шейп выделен и левая представляет из себя зелёный квадрат со звёздочкой, а правый зелёный квадрат с плюсом.


Так. Попробовал. Да. Действительно по-другому сделано. Смысл такой: берется линия, ограничивается угол, ограничивается длина. И делается 2 соединительных точки на концах линии. И все.

Тоже самое можно сделать и с 2-мерным объектом. Только поведение (behaviour) прописать.

Если требуется более подробные пояснения с примерами, то на e-mail...
существует три типа поведения Connection point.

1. Inward
2. Outward
3. Inward/outward

я приклеил крест к окружности в точке касания
теперь вот оторвать не могу

изменять тип коннекшн пойнт можно не заходя в ShapeSheet
через меню см. визио хелп



Пользовательское окно в Visio

Каким образом можно создать окно в Visio для отображения форм создаваемых в MS Visual Basic.
Ну, скажем так, задача сформулирована несколько некорректно. Я попробую ответить, а уж если не так понял вопрос, тогда придется уточнять.
В общем-то все зависит от того, что Вы сделали с формой, созданной в MS Visual Basic. Если Вы сделали на ее основе приложение (exe), то для Visio оно будет выглядеть как Add-on и может вызывается как из меню Visio, так и определенному событию.
Возьму пример из работющей программы.
Вот код в MS Visual Basic:
Текст Add-on CouSet
------------------------------------------------------------------
Dim Shp As Visio.Shape
Private Sub Command1_Click()
Shp.Data1 = Combo1.Text
Shp.Cells("EventDblClick").Formula = "RUNADDON(""CouSet.exe"")"
Shp.Cells("EventXFMod").Formula = "RUNADDON(""CouUpdate.exe"")"
End
End Sub

Private Sub Form_Activate()
Dim appVisio As Visio.Application
Dim pagObj As Visio.Page
Set appVisio = GetObject(, "Visio.Application")
Set pagObj = appVisio.ActivePage
i = InStr(Command, "/shape=")
If (i = 0) Then
Set Shp = pagObj.DrawRectangle(1, 6, 1.3937, 6.19685)
Shp.Name = "MCounter"
Shp.Text = "0"
Else
s = Mid(Command, i + 7)
Set Shp = pagObj.Shapes.Item(s)
End If
...
Программа содержит форму, на которой ComboBox и кнопка. Сначала запускается через меню Add-On. При этом срабатывает Form_Activate(), находит запустившее его Visio-приложение и рисует в нем прямоугольник MCounter.
Следующая завязка - при щелчке по кнопке на этой форме срабатывает Command1_Click(), который прописывает в ячейку шейп листа нарисованного прямоугольника вызов себя (Shp.Cells("EventDblClick").Formula = "RUNADDON(""CouSet.exe"")"). Теперь уже это приложение (с формой из MS Visual Basic) сможет запускаться при двойном щелчке по им же нарисованному шейпу.
Никаких дополнительных окон здесь не создается. Существует только окно с рисунком Visio и окно Add-on из MS Visual Basic.
А можно и просто нарисовать форму в самом Visio. Это делается через Tools/Macros/Visual Basic Editor/Insert/UserForm. Такая форма будет показываться просто по UserForm1.Show
Ну, а если Вам надо было не это, уточните вопрос.
quote:
Сначала запускается через меню Add-On

как это сделать в 2003
Здесь имелся в виду ручной запуск Add-On через меню Visio - Tools/Macros/ИмяAdd-On'а. Если Add-On лежит в папке Solutions, то его видно в этом меню.
А в Visio 2003 это изменили? Пора искать Visio 2003...