C#进行Visio二次开发之界面设计及架构设计

写C#进行Visio二次开发的系列文章有很多篇了,都是写一些经验总结和技术知识的分享,本文继续来探讨这方面开发的一些心得,主要介绍下WinForm界面的设计和Visio软件的架构设计。
先看看我花了N个月的业余时间完成的软件概貌,然后大家一起讨论下相关的技术知识。
Visio_MainForm.jpg

软件界面主要有菜单区、工具条区、图纸内容区、右边的管理区、状态条区等等,主要注意的是采用了ToolStripPanel来进行布局,然后并使用了有名的WeifenLuo.WinFormsUI.Docking.dll控件对图纸内容区、右边的管理区进行控制。
其他就是细致的修改了:如为按钮、菜单添加图片,调整样式等。

Visio的SDK提供了很多基本的操作功能,如下面所示的这些功能,主要都是通过调用其内部函数实现的。
Visio_File.jpg  Visio_View.jpg

其中文件中的另存为和导出AutoCad的操作是通过下面代码完成的。
            SaveFileDialog dlg = new SaveFileDialog();
            dlg.FileName 
= Portal.gc.gVisioImage.VisioName;
            dlg.Filter 
= "Visio文件(*.vsd)|*.vsd|所有文件(*.*)|*.*";
            dlg.FilterIndex 
= 1;
            
if (dlg.ShowDialog() == DialogResult.OK)
            
{
                
if (dlg.FileName.Trim() != string.Empty)
                
{
                    
if (File.Exists(dlg.FileName))
                    
{
                        File.Copy(Portal.gc.gVisioTemplateFilePath, dlg.FileName, 
true);
                    }

                    
else
                    
{
                        File.Copy(Portal.gc.gVisioTemplateFilePath, dlg.FileName);
                    }

                }

            }

            SaveFileDialog dlg = new SaveFileDialog();
            dlg.FileName 
= "";
            dlg.Filter 
= "AutoCAD 绘图 (*.dwg)|*.dwg|所有文件(*.*)|*.*";
            dlg.FilterIndex 
= 1;
            
if (dlg.ShowDialog() == DialogResult.OK)
            
{
                
if (dlg.FileName.Trim() != string.Empty)
                
{
                    VisApplication.ActivePage.Export(dlg.FileName);
                }

            }


其中的视图中有很多Visio的视图窗口需要控制,如形状窗口、自定义属性窗口、扫视缩放窗口、大小位置窗口、其他还有如标尺、网格等显示设置需要控制。这些都是通过调用Application.DoCmd((short)commandID);函数实现的,只要传入了相应的命令ID,那么就达到了控制显示的功能。如自定义属性窗口为VisUICmds.visCmdCustProp,形状窗口为VisUICmds.visCmdShapesWindow,标尺为VisUICmds.visCmdViewRulers,网格为VisUICmds.visCmdViewGrid,这些属性都是可以在SDK中查找到的。

缩放图纸操作,请参考我的一篇文章:C#进行Visio二次开发之图纸缩放操作的实现 里面有具体的实现过程。

Visio_Other.jpgVisio_MarkerMenu.jpg
以上的格式和形状菜单项中的操作也是通过Application.DoCmd((short)commandID);函数实现的,只要查询到相应的命令ID即可进行调用,你花点时间看看VisUICmds枚举下都有那些命令ID可以调用就可以了。
以上图片中关于右键菜单的操作,请参考我前面写的一篇文章C#进行Visio二次开发之自定义右键菜单 

再来说说软件的架构设计吧。
整个UI层主要应用了前面介绍过的WeifenLuo.WinFormsUI.Docking.dll的控件(即图中的DockingControl组件),还有就是Visio Drawing Control的OCX控件了(图中的VisioOCX组件)。
两边是各个层中用到的通用类(Commons)和实体类(Entity)。
Visio_Architecture.jpg

Visio的二次开发,除了需要操作Visio的文件(包含多个模具文件,Viso文档)还有就是也需要和数据库打交道(没有数据库的程序会逊色很多的)。
为了较好区分和协调他们的访问,我设定了一个访问边界:访问数据库的层不会访问Visio文件对象,访问Visio文件对象的不会去访问数据库,它们统一由业务层(Business)调配,各层之间分享Entity层的信息即可。
数据库的底层访问通过利用Enterprise Library的模块完成,因此DAL层只需要做较少的工作即可完成对数据库的访问了。
主要研究技术:代码生成工具、Visio二次开发、送水管理软件等共享软件开发
专注于Winform开发框架、WCF开发框架的研究及应用。
  转载请注明出处:
撰写人:伍华聪  http:
//www.iqidi.com 
    

posted on 2008-06-27 20:54 伍华聪 阅读(6665) 评论(10) 编辑 收藏

评论

#1楼  回复 引用 查看   

@伍华聪
对你的Visio的二次开发系列比较有兴趣,Visio 功能强大接口丰富,不知道是否可以很方便的控制图的元素对象,进行动态展示?我原来开发了一个矢量图绘图组件,目的是为了做类似一些监控画面,因为图需要实时的展示某种状态;
2008-06-27 22:38 | 萧寒      

#2楼[楼主]  回复 引用 查看   

可以动态展示,通过Shape对象的PinX,PinY即可定位具体的位置
2008-06-28 13:13 | 伍华聪      

#3楼  回复 引用   

呵呵,很强大呀,学习了
2009-04-29 09:52 | miracle_wh[未注册用户]

#4楼  回复 引用   

fgg

#5楼  回复 引用   

能否提供部分源代码供学习

#6楼  回复 引用   

请问一下,类似于你这样的程序,是否需要客户机上一定要安装Viso2003或者更高版本
2009-09-01 15:16 | fogluo[未注册用户]

#7楼[楼主]  回复 引用 查看   

是的,一定要安装Visio才可以用。
2009-09-01 15:42 | 伍华聪      

#8楼  回复 引用 查看   

我是刚开始visio开发的,我想问问那个界面中左边那栏的形状是自己做出来的,还是用控件直接调出来的?谢谢!
2009-09-15 01:34 | y0603      

#9楼[楼主]  回复 引用 查看   

直接调出来的啊
2009-09-15 22:06 | 伍华聪      

#10楼  回复 引用 查看   

我想问问是怎样把那个形状的窗口调用出来的?
2009-09-16 16:33 | y0603      

导航

<2008年6月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

公告

昵称:伍华聪
园龄:6年7个月
荣誉:推荐博客
粉丝:656
关注:22

搜索

 

常用链接

最新随笔

我的标签

随笔档案(199)

文章分类(14)

文章档案(15)

相册

我的好友

我的技术支持站点(http://www.iqidi.com)

积分与排名

  • 积分 - 624413
  • 排名 - 79

最新评论

阅读排行榜

评论排行榜

推荐排行榜