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

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的几个重要对象

 Application
 Window (Application.ActiveWindow)
 Document (Application.ActiveDocument)
 Master、Shape

如何使用C#进行Visio二次开发_第1张图片

Visio XML格式文件分析
 Master格式
如何使用C#进行Visio二次开发_第2张图片
 
Pages/Shapes格式 
如何使用C#进行Visio二次开发_第3张图片

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


Visio基本操作的实现

VisApplication  =   this .ctrlDrawing.Document.Application;
VisWindow 
=  VisApplication.ActiveWindow;
VisDocument 
=  VisApplication.ActiveDocument;

// Settings
VisApplication.Settings.ShowShapeSearchPane  =   false // 显示搜索形状窗体
VisApplication.Settings.EnableAutoConnect  =   false // 自动链接(2007默认)
VisApplication.Settings.StencilBackgroundColor  =   10070188 // vbGrayText

// 文档各种显示
VisApplication.DoCmd(( short )VisUICmds.visCmdViewRulers);
VisApplication.DoCmd((
short )VisUICmds.visCmdViewGrid);
VisApplication.DoCmd((
short )VisUICmds.ShowGuides);
VisApplication.DoCmd((
short )VisUICmds.ShowConnectPoints);
VisApplication.DoCmd((
short )VisUICmds.ShowPageBreaks);

// 各种窗口
VisApplication.DoCmd(( short )VisUICmds.visCmdShapesWindow);
VisApplication.DoCmd((
short )VisUICmds.visCmdPanZoom);
VisApplication.DoCmd((
short )VisUICmds.visCmdCustProp);
VisApplication.DoCmd((
short )VisUICmds.visCmdSizePos);


SendKeys.Send(
" ^(x) " );
// VisApplication.DoCmd((short)VisUICmds.visCmdUFEditCut);
SendKeys.Send( " {DELETE} " );
// VisApplication.DoCmd((short)VisUICmds.visCmdUFEditClear);
SendKeys.Send( " ^+(p) " );
// VisApplication.DoCmd(VisUICmds.visCmdFormatPainter);
SendKeys.Send( " ^(z) " );
// VisApplication.DoCmd(VisUICmds.visCmdEditUndo);

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

示例:执行视图中的工具条的所有按钮事件。
Microsoft.Office.Core.CommandBars commandBars;
commandBars 
=  (Microsoft.Office.Core.CommandBars)VisApplication.CommandBars;

foreach  (Microsoft.Office.Core.CommandBarControl control  in  commandBars[ " View " ].Controls)
{
    Microsoft.Office.Core.CommandBarButton button 
=  control as  Microsoft.Office.Core.CommandBarButton;
    
if (button != null)
    
{
        button.Execute();
    }

}


StringBuilder sb 
=   new  StringBuilder();
foreach  (Microsoft.Office.Core.CommandBar bar  in  commandBars)
{
    sb.Append(
string.Format("CommandBar Name:{0}\r\n", bar.Name));
    
foreach(Microsoft.Office.Core.CommandBarControl control in bar.Controls)
    
{
        Microsoft.Office.Core.CommandBarButton button 
=  control as  Microsoft.Office.Core.CommandBarButton;
        
if(button != null)
        
{
            sb.Append(
string.Format("Button Name:{0} \r\n", button.Caption));
        }
                    
    }

}

Form2 frm 
=   new  Form2();
frm.txtContent.Text 
=  sb.ToString();
frm.Show();


short  flags  =  ( short )VisOpenSaveArgs.visOpenDocked  |  ( short )VisOpenSaveArgs.visOpenRO;
StencilOpenEx(wndVisio.Application, flags);

/// <summary>
/// 打开模具的公共方法
/// </summary>
/// <param name="visApp">按引用调用的VisioApplication对象</param>
/// <param name="flags">打开的模式</param>

private   void  StencilOpenEx(Application visApp,  short  flags)
{
    List
<string> stencilList = GetStencils();
    
string stencilFileName;
    
    
foreach(string stencil in stencilList)
    
{
        stencilFileName 
= GetStencilsFileName(stencil);
        
if(!string.IsNullOrEmpty(stencilFileName))
        
{
            visApp.Documents.OpenEx(Portal.gc.gStencileFileBasePath 
+ stencilFileName, flags);
        }

    }

}


// 关闭模具文件
visApp.Documents[ " Switch.vss " ].Close();
visApp.Documents[
" Span.vss " ].Close();
visApp.Documents[
" Line.vss " ].Close();
visApp.Documents[
" Label.vss " ].Close();
visApp.Documents[
" Construct.vss " ].Close();
visApp.Documents[
" Monitor.vss " ].Close();


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

// 列出模具组
this .cmbStencilGroup.Items.Clear();
List
< string >  stencilGroups  =  stencil.GetStencils();
foreach  ( string  group  in  stencilGroups)
{
    
this.cmbStencilGroup.Items.Add(group);
}



// 根据模具组列出模具
string  stencilName  =  stencil.GetStencilsFileName( this .cmbStencilGroup.Text);
this .cmbStencil.Items.Clear();
string  tempName;
foreach  (Master master  in  visApp.Documents[stencilName].Masters)
{
    tempName 
= master.Name;
    
if (!stencil.IsExcludeItem(tempName))
    
{
        
this.cmbStencil.Items.Add(tempName);
    }

}



// 根据模具,获取对应的属性集合,遍历属性集合,列出属性名称
string  stencilName  =  stencil.GetStencilsFileName( this .cmbStencilGroup.Text);
string  masterName  =   this .cmbStencil.Text;
Visio.Shape shape 
=  visApp.Documents[stencilName].Masters[masterName].Shapes[ 1 ];
if  (shape  !=   null )
{
    List
<StencilPropertyInfo> propInfos = property.GetPropertyCollection(shape);
    
foreach (StencilPropertyInfo info in propInfos)
    
{
        
this.cmbProperty.Items.Add(info.Name);
    }

}



// 根据模具、模具属性,列出对应的属性信息
string stencilName = stencil.GetStencilsFileName(this .cmbStencilGroup.Text);
string masterName = this
.cmbStencil.Text;
Visio.Shape shape 
= visApp.Documents[stencilName].Masters[masterName].Shapes[1
];
StencilPropertyInfo info 
= property.GetProperty(shape, this
.cmbProperty.Text);
if (info != null
)
{
    
this.txtName.Text = info.Name;//属性名称
    this.txtValue.Text = info.Value;//属性值
    this.txtFormat.Text = info.Format;//属性格式
    this.txtSortKey.Text = info.Sort;//属性的排序
    this.txtPrompt.Text = info.Prompt;//属性的提示信息
}



// 根据模具,获取属性对象集合
public  List < StencilPropertyInfo >  GetPropertyCollection(Visio.Shape shape)
{
    List
<StencilPropertyInfo> list = new List<StencilPropertyInfo>();
    StencilPropertyInfo propertyInfo;
    Visio.Cell shapeCell;
    
short shortSectionProp = (short)VisSectionIndices.visSectionProp;

    
if (shape != null)
    
{
        
for (short i = 0; i < shape.get_RowCount(shortSectionProp) - 1; i++ )
        
{
            
if (shape.get_CellsSRCExists(shortSectionProp, i, (short)VisCellIndices.visCustPropsLabel, 0!= 0)
            
{
                propertyInfo 
= new StencilPropertyInfo();

                shapeCell 
= shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsLabel);
                propertyInfo.Name 
= VisioUtility.FormulaStringToString(shapeCell.RowNameU);

                shapeCell 
= shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsPrompt);
                propertyInfo.Prompt 
= VisioUtility.FormulaStringToString(shapeCell.FormulaU);

                shapeCell 
= shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsFormat);
                propertyInfo.Format 
= VisioUtility.FormulaStringToString(shapeCell.FormulaU);

                shapeCell 
= shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsValue);
                propertyInfo.Value 
= VisioUtility.FormulaStringToString(shapeCell.FormulaU);

                shapeCell 
= shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsSortKey);
                propertyInfo.Sort 
= VisioUtility.FormulaStringToString(shapeCell.FormulaU);

                
//shapeCell = shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsType);
                
//propertyInfo.PropType = VisioUtility.FormulaStringToString(shapeCell.FormulaU);

                
//shapeCell = shape.get_CellsSRC(shortSectionProp, i, (short)VisCellIndices.visCustPropsInvis);
                
//propertyInfo.InVisible = VisioUtility.FormulaStringToString(shapeCell.FormulaU);

                
//..
                list.Add(propertyInfo);
            }

        }

    }


    
return list;
}



// 根据模具和属性名称,获取属性对象信息
public  StencilPropertyInfo GetProperty(Visio.Shape shape,  string  propertyName)
{
    List
<StencilPropertyInfo> list = GetPropertyCollection(shape);
    StencilPropertyInfo propertyInfo 
= null
;
    
foreach(StencilPropertyInfo tempInfo in
 list)
    
{
        
if (tempInfo.Name == propertyName)
        
{
            propertyInfo 
= tempInfo;
            
break;
        }

    }


    
return propertyInfo;
}

你可能感兴趣的:(visio)