• 如何使用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

    VisioObjects.jpg

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

     图纸的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函数
      访问属性
      设置属性
      添加属性

    //列出模具组
    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二次开发、酒店管理系统、仓库管理系统等共享软件开发
    专注于Winform开发框架/混合式开发框架Web开发框架Bootstrap开发框架微信门户开发框架的研究及应用
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
        
  • 相关阅读:
    C++中的字符串可以这样换行写
    2020年最受欢迎的 10 门编程语言
    10 本最适合初学者和高级程序员的Python书籍
    手把手教你用 Python + Flask 搭建个人博客
    CentOS VS Ubuntu,谁才是更好的 Linux 版本?
    Python丨为什么你学不好设计模式?
    突破C++瓶颈,在此一举!
    从零上手 GDB 调试,看这个教程就够了~
    搞机器学习需要数学基础吗?
    用 Python 读写 Excel 表格,就是这么的简单粗暴且乏味
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/963593.html
Copyright © 2020-2023  润新知