如何使用C#进行Visio二次开发

摘要:
有许多现成的项目和代码用于在VB6 NET中开发Visio。NET相对落后,但自从VisioSDK2007发布以来,针对Visio的C#开发越来越多。虽然开发思路与VB6有些相似,但平台不同,两者之间仍有一定距离。虽然总体速度有点慢,但DotNET框架已经变得更强大,更多的DotNET程序和开发人员加入,它将为您带来更高的集成价值和更好的开发前景。

      Visio在VB6中的开发有很多现成的项目及代码,但在.NET领域相对比较滞后,但是从Visio SDK2007发布以来,给予Visio的C#开发逐渐多了起来,虽然和VB6的开发思路有一定的相似,不过平台不一样,做出来的东西差别还是有一定的距离,虽然总体慢一点,但是,DotNET框架的逐渐强大以及更多的DotNet程序和开发人员的加入,带给大家更高的整合价值以及更美好的发展未来。
    本人将会在C#领域将Visio的二次开发进行下去,希望大家一起学习研究,碰撞出更美的火花

Visio Drawing Control控件使用
Visio开发必备
    Visio SDK 2007
         VisSDK.chm
         Visio Code Samples Library.chm
 Visio文档操作
     查看ShapeSheet属性及帮助内容
     宏的录制

Visio的几个重要对象

如何使用C#进行Visio二次开发第1张 Application
如何使用C#进行Visio二次开发第1张 Window (Application.ActiveWindow)
如何使用C#进行Visio二次开发第1张 Document (Application.ActiveDocument)
如何使用C#进行Visio二次开发第1张 Master、Shape

VisioObjects.jpg

Visio XML格式文件分析
 Master格式
Visio_Master.jpg
 
Pages/Shapes格式 
Visio_Page.jpg

 图纸的XML文档中,Master后面的Shapes集合中只有一个Shape对象
 图纸的Shapes集合有多个对象,每个对象的NameU和Name值可能不一样,一般使用NameU


Visio基本操作的实现

如何使用C#进行Visio二次开发第1张VisApplication = this.ctrlDrawing.Document.Application;
如何使用C#进行Visio二次开发第1张VisWindow 
= VisApplication.ActiveWindow;
如何使用C#进行Visio二次开发第1张VisDocument 
= VisApplication.ActiveDocument;
如何使用C#进行Visio二次开发第1张
如何使用C#进行Visio二次开发第1张
//Settings
如何使用C#进行Visio二次开发第1张
VisApplication.Settings.ShowShapeSearchPane = false//显示搜索形状窗体
如何使用C#进行Visio二次开发第1张
VisApplication.Settings.EnableAutoConnect = false//自动链接(2007默认)
如何使用C#进行Visio二次开发第1张
VisApplication.Settings.StencilBackgroundColor = 10070188//vbGrayText
如何使用C#进行Visio二次开发第1张
如何使用C#进行Visio二次开发第1张
//文档各种显示
如何使用C#进行Visio二次开发第1张
VisApplication.DoCmd((short)VisUICmds.visCmdViewRulers);
如何使用C#进行Visio二次开发第1张VisApplication.DoCmd((
short)VisUICmds.visCmdViewGrid);
如何使用C#进行Visio二次开发第1张VisApplication.DoCmd((
short)VisUICmds.ShowGuides);
如何使用C#进行Visio二次开发第1张VisApplication.DoCmd((
short)VisUICmds.ShowConnectPoints);
如何使用C#进行Visio二次开发第1张VisApplication.DoCmd((
short)VisUICmds.ShowPageBreaks);
如何使用C#进行Visio二次开发第1张
如何使用C#进行Visio二次开发第1张
//各种窗口
如何使用C#进行Visio二次开发第1张
VisApplication.DoCmd((short)VisUICmds.visCmdShapesWindow);
如何使用C#进行Visio二次开发第1张VisApplication.DoCmd((
short)VisUICmds.visCmdPanZoom);
如何使用C#进行Visio二次开发第1张VisApplication.DoCmd((
short)VisUICmds.visCmdCustProp);
如何使用C#进行Visio二次开发第1张VisApplication.DoCmd((
short)VisUICmds.visCmdSizePos);
如何使用C#进行Visio二次开发第1张
如何使用C#进行Visio二次开发第1张
如何使用C#进行Visio二次开发第1张SendKeys.Send(
"^(x)");
如何使用C#进行Visio二次开发第1张
//VisApplication.DoCmd((short)VisUICmds.visCmdUFEditCut);
如何使用C#进行Visio二次开发第1张
SendKeys.Send("{DELETE}");
如何使用C#进行Visio二次开发第1张
//VisApplication.DoCmd((short)VisUICmds.visCmdUFEditClear);
如何使用C#进行Visio二次开发第1张
SendKeys.Send("^+(p)");
如何使用C#进行Visio二次开发第1张
//VisApplication.DoCmd(VisUICmds.visCmdFormatPainter);
如何使用C#进行Visio二次开发第1张
SendKeys.Send("^(z)");
如何使用C#进行Visio二次开发第1张
//VisApplication.DoCmd(VisUICmds.visCmdEditUndo);

调用工具条对象、菜单对象的方法
Application.CommandBars
Microsoft.Office.Core.CommandBars共享Office对象模型
使用CommandBar代替UIObject
CommandBar对象中,菜单及工具条是同一个东西
CommandBar、CommandBarButton、 CommandBarComboBox、CommandBarControl、 和 CommandBarPopup

示例:执行视图中的工具条的所有按钮事件。
如何使用C#进行Visio二次开发第1张Microsoft.Office.Core.CommandBars commandBars;
如何使用C#进行Visio二次开发第1张commandBars 
= (Microsoft.Office.Core.CommandBars)VisApplication.CommandBars;
如何使用C#进行Visio二次开发第1张
如何使用C#进行Visio二次开发第1张
foreach (Microsoft.Office.Core.CommandBarControl control in commandBars["View"].Controls)
如何使用C#进行Visio二次开发第43张如何使用C#进行Visio二次开发第44张
如何使用C#进行Visio二次开发第45张{
如何使用C#进行Visio二次开发第46张    Microsoft.Office.Core.CommandBarButton button 
=  control as  Microsoft.Office.Core.CommandBarButton;
如何使用C#进行Visio二次开发第46张    
if (button != null)
如何使用C#进行Visio二次开发第48张如何使用C#进行Visio二次开发第49张    
如何使用C#进行Visio二次开发第45张{
如何使用C#进行Visio二次开发第46张        button.Execute();
如何使用C#进行Visio二次开发第52张    }

如何使用C#进行Visio二次开发第53张}

如何使用C#进行Visio二次开发第1张
如何使用C#进行Visio二次开发第1张StringBuilder sb 
= new StringBuilder();
如何使用C#进行Visio二次开发第1张
foreach (Microsoft.Office.Core.CommandBar bar in commandBars)
如何使用C#进行Visio二次开发第43张如何使用C#进行Visio二次开发第44张
如何使用C#进行Visio二次开发第45张{
如何使用C#进行Visio二次开发第46张    sb.Append(
string.Format("CommandBar Name:{0}\r\n", bar.Name));
如何使用C#进行Visio二次开发第46张    
foreach(Microsoft.Office.Core.CommandBarControl control in bar.Controls)
如何使用C#进行Visio二次开发第48张如何使用C#进行Visio二次开发第49张    
如何使用C#进行Visio二次开发第45张{
如何使用C#进行Visio二次开发第46张        Microsoft.Office.Core.CommandBarButton button 
=  control as  Microsoft.Office.Core.CommandBarButton;
如何使用C#进行Visio二次开发第46张        
if(button != null)
如何使用C#进行Visio二次开发第48张如何使用C#进行Visio二次开发第49张        
如何使用C#进行Visio二次开发第45张{
如何使用C#进行Visio二次开发第46张            sb.Append(
string.Format("Button Name:{0} \r\n", button.Caption));
如何使用C#进行Visio二次开发第52张        }
                    
如何使用C#进行Visio二次开发第52张    }

如何使用C#进行Visio二次开发第53张}

如何使用C#进行Visio二次开发第1张Form2 frm 
= new Form2();
如何使用C#进行Visio二次开发第1张frm.txtContent.Text 
= sb.ToString();
如何使用C#进行Visio二次开发第1张frm.Show();
如何使用C#进行Visio二次开发第1张
如何使用C#进行Visio二次开发第1张
如何使用C#进行Visio二次开发第1张
short flags = (short)VisOpenSaveArgs.visOpenDocked | (short)VisOpenSaveArgs.visOpenRO;
如何使用C#进行Visio二次开发第1张StencilOpenEx(wndVisio.Application, flags);
如何使用C#进行Visio二次开发第1张
如何使用C#进行Visio二次开发第43张如何使用C#进行Visio二次开发第44张
/**//// <summary>
如何使用C#进行Visio二次开发第46张
/// 打开模具的公共方法
如何使用C#进行Visio二次开发第46张
/// </summary>
如何使用C#进行Visio二次开发第46张
/// <param name="visApp">按引用调用的VisioApplication对象</param>
如何使用C#进行Visio二次开发第53张
/// <param name="flags">打开的模式</param>

如何使用C#进行Visio二次开发第1张private void StencilOpenEx(Application visApp, short flags)
如何使用C#进行Visio二次开发第43张如何使用C#进行Visio二次开发第44张
如何使用C#进行Visio二次开发第45张{
如何使用C#进行Visio二次开发第46张    List
<string> stencilList = GetStencils();
如何使用C#进行Visio二次开发第46张    
string stencilFileName;
如何使用C#进行Visio二次开发第46张    
如何使用C#进行Visio二次开发第46张    
foreach(string stencil in stencilList)
如何使用C#进行Visio二次开发第48张如何使用C#进行Visio二次开发第49张    
如何使用C#进行Visio二次开发第45张{
如何使用C#进行Visio二次开发第46张        stencilFileName 
= GetStencilsFileName(stencil);
如何使用C#进行Visio二次开发第46张        
if(!string.IsNullOrEmpty(stencilFileName))
如何使用C#进行Visio二次开发第48张如何使用C#进行Visio二次开发第49张        
如何使用C#进行Visio二次开发第45张{
如何使用C#进行Visio二次开发第46张            visApp.Documents.OpenEx(Portal.gc.gStencileFileBasePath 
+ stencilFileName, flags);
如何使用C#进行Visio二次开发第52张        }

如何使用C#进行Visio二次开发第52张    }

如何使用C#进行Visio二次开发第53张}

如何使用C#进行Visio二次开发第1张
如何使用C#进行Visio二次开发第1张
//关闭模具文件
如何使用C#进行Visio二次开发第1张
visApp.Documents["Switch.vss"].Close();
如何使用C#进行Visio二次开发第1张visApp.Documents[
"Span.vss"].Close();
如何使用C#进行Visio二次开发第1张visApp.Documents[
"Line.vss"].Close();
如何使用C#进行Visio二次开发第1张visApp.Documents[
"Label.vss"].Close();
如何使用C#进行Visio二次开发第1张visApp.Documents[
"Construct.vss"].Close();
如何使用C#进行Visio二次开发第1张visApp.Documents[
"Monitor.vss"].Close();


Visio Shape的属性操作
  StringToFormulaForString、FormulaStringToString函数
  访问属性
  设置属性
  添加属性

如何使用C#进行Visio二次开发第1张//列出模具组
如何使用C#进行Visio二次开发第1张
this.cmbStencilGroup.Items.Clear();
如何使用C#进行Visio二次开发第1张List
<string> stencilGroups = stencil.GetStencils();
如何使用C#进行Visio二次开发第1张
foreach (string group in stencilGroups)
如何使用C#进行Visio二次开发第43张如何使用C#进行Visio二次开发第44张
如何使用C#进行Visio二次开发第45张{
如何使用C#进行Visio二次开发第46张    
this.cmbStencilGroup.Items.Add(group);
如何使用C#进行Visio二次开发第53张}

如何使用C#进行Visio二次开发第1张
如何使用C#进行Visio二次开发第1张
如何使用C#进行Visio二次开发第1张
//根据模具组列出模具
如何使用C#进行Visio二次开发第1张
string stencilName = stencil.GetStencilsFileName(this.cmbStencilGroup.Text);
如何使用C#进行Visio二次开发第1张
this.cmbStencil.Items.Clear();
如何使用C#进行Visio二次开发第1张
string tempName;
如何使用C#进行Visio二次开发第1张
foreach (Master master in visApp.Documents[stencilName].Masters)
如何使用C#进行Visio二次开发第43张如何使用C#进行Visio二次开发第44张
如何使用C#进行Visio二次开发第45张{
如何使用C#进行Visio二次开发第46张    tempName 
= master.Name;
如何使用C#进行Visio二次开发第46张    
if (!stencil.IsExcludeItem(tempName))
如何使用C#进行Visio二次开发第48张如何使用C#进行Visio二次开发第49张    
如何使用C#进行Visio二次开发第45张{
如何使用C#进行Visio二次开发第46张        
this.cmbStencil.Items.Add(tempName);
如何使用C#进行Visio二次开发第52张    }

如何使用C#进行Visio二次开发第53张}

如何使用C#进行Visio二次开发第1张
如何使用C#进行Visio二次开发第1张
如何使用C#进行Visio二次开发第1张
//根据模具,获取对应的属性集合,遍历属性集合,列出属性名称
如何使用C#进行Visio二次开发第1张
string stencilName = stencil.GetStencilsFileName(this.cmbStencilGroup.Text);
如何使用C#进行Visio二次开发第1张
string masterName = this.cmbStencil.Text;
如何使用C#进行Visio二次开发第1张Visio.Shape shape 
= visApp.Documents[stencilName].Masters[masterName].Shapes[1];
如何使用C#进行Visio二次开发第1张
if (shape != null)
如何使用C#进行Visio二次开发第43张如何使用C#进行Visio二次开发第44张
如何使用C#进行Visio二次开发第45张{
如何使用C#进行Visio二次开发第46张    List
<StencilPropertyInfo> propInfos = property.GetPropertyCollection(shape);
如何使用C#进行Visio二次开发第46张    
foreach (StencilPropertyInfo info in propInfos)
如何使用C#进行Visio二次开发第48张如何使用C#进行Visio二次开发第49张    
如何使用C#进行Visio二次开发第45张{
如何使用C#进行Visio二次开发第46张        
this.cmbProperty.Items.Add(info.Name);
如何使用C#进行Visio二次开发第52张    }

如何使用C#进行Visio二次开发第53张}

如何使用C#进行Visio二次开发第1张
如何使用C#进行Visio二次开发第1张
如何使用C#进行Visio二次开发第1张
//根据模具、模具属性,列出对应的属性信息
如何使用C#进行Visio二次开发第1张
string stencilName = stencil.GetStencilsFileName(this.cmbStencilGroup.Text);
如何使用C#进行Visio二次开发第1张
string masterName = this.cmbStencil.Text;
如何使用C#进行Visio二次开发第1张Visio.Shape shape 
= visApp.Documents[stencilName].Masters[masterName].Shapes[1];
如何使用C#进行Visio二次开发第1张StencilPropertyInfo info 
= property.GetProperty(shape, this.cmbProperty.Text);
如何使用C#进行Visio二次开发第1张
if (info != null)
如何使用C#进行Visio二次开发第43张如何使用C#进行Visio二次开发第44张
如何使用C#进行Visio二次开发第45张{
如何使用C#进行Visio二次开发第46张    
this.txtName.Text = info.Name;//属性名称
如何使用C#进行Visio二次开发第46张
    this.txtValue.Text = info.Value;//属性值
如何使用C#进行Visio二次开发第46张
    this.txtFormat.Text = info.Format;//属性格式
如何使用C#进行Visio二次开发第46张
    this.txtSortKey.Text = info.Sort;//属性的排序
如何使用C#进行Visio二次开发第46张
    this.txtPrompt.Text = info.Prompt;//属性的提示信息
如何使用C#进行Visio二次开发第53张
}

如何使用C#进行Visio二次开发第1张
如何使用C#进行Visio二次开发第1张
如何使用C#进行Visio二次开发第1张
//根据模具,获取属性对象集合
如何使用C#进行Visio二次开发第1张
public List<StencilPropertyInfo> GetPropertyCollection(Visio.Shape shape)
如何使用C#进行Visio二次开发第43张如何使用C#进行Visio二次开发第44张
如何使用C#进行Visio二次开发第45张{
如何使用C#进行Visio二次开发第46张    List
<StencilPropertyInfo> list = new List<StencilPropertyInfo>();
如何使用C#进行Visio二次开发第46张    StencilPropertyInfo propertyInfo;
如何使用C#进行Visio二次开发第46张    Visio.Cell shapeCell;
如何使用C#进行Visio二次开发第46张    
short shortSectionProp = (short)VisSectionIndices.visSectionProp;
如何使用C#进行Visio二次开发第46张
如何使用C#进行Visio二次开发第46张    
if (shape != null)
如何使用C#进行Visio二次开发第48张如何使用C#进行Visio二次开发第49张    
如何使用C#进行Visio二次开发第45张{
如何使用C#进行Visio二次开发第46张        
for (short i = 0; i < shape.get_RowCount(shortSectionProp) - 1; i++ )
如何使用C#进行Visio二次开发第48张如何使用C#进行Visio二次开发第49张        
如何使用C#进行Visio二次开发第45张{
如何使用C#进行Visio二次开发第46张            
if (shape.get_CellsSRCExists(shortSectionProp, i, (short)VisCellIndices.visCustPropsLabel, 0!= 0)
如何使用C#进行Visio二次开发第48张如何使用C#进行Visio二次开发第49张            
如何使用C#进行Visio二次开发第45张{
如何使用C#进行Visio二次开发第46张                propertyInfo 
= new StencilPropertyInfo();
如何使用C#进行Visio二次开发第46张
如何使用C#进行Visio二次开发第46张                shapeCell 
= shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsLabel);
如何使用C#进行Visio二次开发第46张                propertyInfo.Name 
= VisioUtility.FormulaStringToString(shapeCell.RowNameU);
如何使用C#进行Visio二次开发第46张
如何使用C#进行Visio二次开发第46张                shapeCell 
= shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsPrompt);
如何使用C#进行Visio二次开发第46张                propertyInfo.Prompt 
= VisioUtility.FormulaStringToString(shapeCell.FormulaU);
如何使用C#进行Visio二次开发第46张
如何使用C#进行Visio二次开发第46张                shapeCell 
= shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsFormat);
如何使用C#进行Visio二次开发第46张                propertyInfo.Format 
= VisioUtility.FormulaStringToString(shapeCell.FormulaU);
如何使用C#进行Visio二次开发第46张
如何使用C#进行Visio二次开发第46张                shapeCell 
= shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsValue);
如何使用C#进行Visio二次开发第46张                propertyInfo.Value 
= VisioUtility.FormulaStringToString(shapeCell.FormulaU);
如何使用C#进行Visio二次开发第46张
如何使用C#进行Visio二次开发第46张                shapeCell 
= shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsSortKey);
如何使用C#进行Visio二次开发第46张                propertyInfo.Sort 
= VisioUtility.FormulaStringToString(shapeCell.FormulaU);
如何使用C#进行Visio二次开发第46张
如何使用C#进行Visio二次开发第46张                
//shapeCell = shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsType);
如何使用C#进行Visio二次开发第46张                
//propertyInfo.PropType = VisioUtility.FormulaStringToString(shapeCell.FormulaU);
如何使用C#进行Visio二次开发第46张
如何使用C#进行Visio二次开发第46张                
//shapeCell = shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsInvis);
如何使用C#进行Visio二次开发第46张                
//propertyInfo.InVisible = VisioUtility.FormulaStringToString(shapeCell.FormulaU);
如何使用C#进行Visio二次开发第46张
如何使用C#进行Visio二次开发第46张                
//如何使用C#进行Visio二次开发第45张如何使用C#进行Visio二次开发第45张如何使用C#进行Visio二次开发第45张..
如何使用C#进行Visio二次开发第46张
                list.Add(propertyInfo);
如何使用C#进行Visio二次开发第52张            }

如何使用C#进行Visio二次开发第52张        }

如何使用C#进行Visio二次开发第52张    }

如何使用C#进行Visio二次开发第46张
如何使用C#进行Visio二次开发第46张    
return list;
如何使用C#进行Visio二次开发第53张}

如何使用C#进行Visio二次开发第1张
如何使用C#进行Visio二次开发第1张
如何使用C#进行Visio二次开发第1张
//根据模具和属性名称,获取属性对象信息
如何使用C#进行Visio二次开发第1张
public StencilPropertyInfo GetProperty(Visio.Shape shape, string propertyName)
如何使用C#进行Visio二次开发第43张如何使用C#进行Visio二次开发第44张
如何使用C#进行Visio二次开发第45张{
如何使用C#进行Visio二次开发第46张    List
<StencilPropertyInfo> list = GetPropertyCollection(shape);
如何使用C#进行Visio二次开发第46张    StencilPropertyInfo propertyInfo 
= null;
如何使用C#进行Visio二次开发第46张    
foreach(StencilPropertyInfo tempInfo in list)
如何使用C#进行Visio二次开发第48张如何使用C#进行Visio二次开发第49张    
如何使用C#进行Visio二次开发第45张{
如何使用C#进行Visio二次开发第46张        
if (tempInfo.Name == propertyName)
如何使用C#进行Visio二次开发第48张如何使用C#进行Visio二次开发第49张        
如何使用C#进行Visio二次开发第45张{
如何使用C#进行Visio二次开发第46张            propertyInfo 
= tempInfo;
如何使用C#进行Visio二次开发第46张            
break;
如何使用C#进行Visio二次开发第52张        }

如何使用C#进行Visio二次开发第52张    }

如何使用C#进行Visio二次开发第46张
如何使用C#进行Visio二次开发第46张    
return propertyInfo;
如何使用C#进行Visio二次开发第53张}

免责声明:文章转载自《如何使用C#进行Visio二次开发》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇10个优秀的JavaScript参考手册universal link使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

吐槽下若依(RuoYi)系统的权限系统(shiro和spring-security)

spring-security以RuoYi-Vue为例,当前版本是3.1.0。然后是系统中很多地方用LoginUserloginUser=tokenService.getLoginUser来获取当前用户数据,这个需要再解析token,然后从redis缓存中读取的数据,不明白为什么不直接从SecurityUtils.getLoginUser()中获取,明明已经...

甲骨文ARM架构云服务器部署宝塔+.net 5.0

前言前段时间,甲骨文推出了一款采用ARM架构的免费服务器,可以申请永久免费的4核、24GB内存、4G带宽,非常棒。然而,由于ARM架构的CPU。例如,编译和安装MySQL 5.7是可以的,所以不需要麻烦。创建后,ssh被连接并切换到根帐户sudo-i II。安装宝塔。创建服务器。更新包并安装BBR后,您可以使用官方脚本yu_install-wget&...

【转】QImage 图像格式小结

构造图像:,QImagemyImage1=QImage;根据文件名打开图像。如果图像本身是32位或24位,则程序中的图像是32位。如果图像本身是8位或1位,则程序中的对应图像是8位或者1位。宽度表示图像宽度,高度表示图像高度。...

layui table 打印表格

例如,layui的表单打印方法是将表单的数据重新组合成新页面,但它只能打印当前页面的内容。仅仅说实话是不够的。我整个上午都找到了一些,并说他们自己换了,但他们并不满意。这没用。我只能打印当前页面的内容。我的想法是编写一个函数,传递显示的列和要打印的数据,然后直接打印。不要胡说八道。直接转到代码。...

Nginx实战-后端应用健康检查

utm_source=tuicool&utm_medium=referral公司前一段对业务线上的nginx做了整理,重点就是对nginx上负载均衡器的后端节点做健康检查。比如如果将max_fails设置为0,则代表不对后端服务器进行健康检查,这样还会使fail_timeout参数失效。...

IPv6地址的ping、telnet等操作

最近,我在研究https协议如何传输数据。我用wireshark捕捉数据包并分析它们。我发现客户端和谷歌网站在传输数据时使用了IPv6地址,因此我测试了与IPv6地址相关的基本功能。...