拖放到一个组中-MS Visio VBA

时间:2018-09-07 22:47:08

标签: vba visio

我正在通过VBA宏和UserForms将Visio用作建模工具。模型的形状可以具有与“子级”相同类型的形状,然后又可以具有子级……

目前,我只能通过从模具中拖放来添加“顶级”形状。我正在使用ShapeAdded事件打开用户窗体,然后让用户输入Shape Data。

只有通过单独的UserForm才能添加具有父级的形状,该UserForm从模型中所有对象的列表中获取Shape Data和父级对象。然后,它调用一个遍历页面上所有形状的函数,直到找到所需的“父”为止,然后使用父对象的Drop方法将新形状放置在正确的位置。然后,该形状也会添加到父形状的组中。

有什么办法可以通过拖放实现?即我可以通过VBA找出用户将新形状放在哪个“父”形上,以便可以通过编程将它们组合在一起? (此外,我需要将父子关系的信息同步到数据库,因此我需要获取父形状对象以访问其形状数据。)

我想要这个是因为它允许用户直接在父形状中选择所需的位置,并且使用模版中的拖放操作然后使用用户窗体更加直观。

我可以考虑的唯一选择是在删除形状后打开Userform并从用户那里获取父信息,然后找到父形状并将新形状添加到其组中->这取决于用户从列表中选择相同对象时,他将其放在上面,这可能会导致问题。我想自动检测新放置的形状下方的形状,只允许用户输入新形状的数据。

1 个答案:

答案 0 :(得分:2)

通常,您在Visio中使用容器来实现这种功能,而不是使用组。容器对您所描述的拖放功能更加友好(例如:当用户将形状悬停在某个容器上时,它会突出显示,并向用户指示该形状可用作放置目标)。此外,容器还提供专门的API,可让您列出容器中的形状,向容器中添加形状或从容器中删除形状以及调整功能的大小。

观看以下教育视频: https://support.office.com/en-us/article/video-organize-shapes-in-containers-75e42442-038a-48f6-9206-b029266cbfc7

或者此Microsoft Visio博客文章:https://blogs.msdn.microsoft.com/visio/2009/08/25/organizing-diagrams-with-containers/

以下是API的概述: https://developer.microsoft.com/en-us/visio/blogs/container-list-and-callout-api-in-visio-2010/