惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
博客园 - 司徒正美
Last Week in AI
Last Week in AI
Recent Announcements
Recent Announcements
Y
Y Combinator Blog
博客园 - 聂微东
M
MIT News - Artificial intelligence
博客园_首页
Jina AI
Jina AI
博客园 - 叶小钗
酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
F
Fortinet All Blogs
aimingoo的专栏
aimingoo的专栏
小众软件
小众软件
Vercel News
Vercel News
The Cloudflare Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
云风的 BLOG
云风的 BLOG
N
Netflix TechBlog - Medium
B
Blog
Google DeepMind News
Google DeepMind News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - ant-boss

pl/sql转义字符的问题 备份/恢复SQL Server EXP/IMP 命令参数 Programming with the Microsoft Office Visio 2003 ActiveX Control 使用Visio 2003 Drawing Control开发应用(5) 使用Visio 2003 Drawing Control开发应用(3) 使用Visio 2003 Drawing Control开发应用(1) 使用Visio 2003 Drawing Control开发应用(2) Visio 2003 开发入门 软件数字签名 在ASP.NET下用Microsoft Excel进行数据分析与报表 水晶报表常见问题(转载) Access 类型转换函数 My97日期控件 My97 DatePicker Ver 3.0.1 showModalDialog 使用TransactionScope 实现事务管理 datagrid数据导出到excel文件给客户端下载的几种方法 VSS(Visual SourceSafe)使用入门 [转] 使用asp.net 2.0和SQL SERVER 2005构建多层应用
使用Visio 2003 Drawing Control开发应用(4)
ant-boss · 2007-10-25 · via 博客园 - ant-boss

还有一个很好的方法,就是直接发送命令
  #region 向Visio工作区发送Visio命令
  [StructLayout(LayoutKind.Sequential)]
   public struct OLECMDTEXT
  {
   public UInt32 cmdtextf;
   public UInt32 cwActual;
   public UInt32 cwBuf;
   public char rgwz;
  }

  [StructLayout(LayoutKind.Sequential)]
   public struct OLECMD
  {
   public UInt32 cmdID;
   public UInt64 cmdf;
  }

  [ComImport(), Guid("B722BCCB-4E68-101B-A2BC-00AA00404770"), InterfaceType

(ComInterfaceType.InterfaceIsIUnknown)]
   public interface IOleCommandTarget
  {
   [PreserveSig()]
   int QueryStatus([In, MarshalAs(UnmanagedType.Struct)] ref Guid pguidCmdGroup, [MarshalAs

(UnmanagedType.U4)] int cCmds, [In, Out] IntPtr prgCmds, [In, Out] IntPtr pCmdText);

   [PreserveSig()]
   int Exec(ref Guid pguidCmdGroup, uint nCmdID, uint nCmdExecOpt, object[] pvaIn, [In, Out,

MarshalAs(UnmanagedType.LPArray)] object[] pvaOut);
  }

  /// <summary>
  /// 发送OLE命令
  /// </summary>
  /// <param name="command"></param>
  private void SendCommand(UInt32 command)
  {
   IOleCommandTarget commandTarget =
    (IOleCommandTarget)visDrawing.GetOcx();

   try
   {
    Guid CLSID_Application = new Guid("{0x00021A20, 0x0000, 0x0000, {0xC0, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x46}}");
    commandTarget.Exec(ref CLSID_Application, command, 0, null, null);
   }
   catch(System.Runtime.InteropServices.COMException ex)
   {
    MessageBox.Show(ex.ToString());
   }
  }
  #endregion
这个是从msdn online中的一篇文章学来的。
比如想显示标尺和网格配置的对话框出来
  public void RulesAndGrid(TulipMenuItem item)
  {
   this.SendCommand((UInt32)Visio.VisUICmds.visCmdRulerGridDlg);
  }
那个对话框就出来了。:D
页面设置
  public void PageSetup(TulipMenuItem item)
  {
   this.SendCommand((UInt32)Visio.VisUICmds.visCmdPageMeasureUnitsDlg);
  }
还有好多好多的对话框可以用发命令方式出来
很多快捷键一样可以用,比如Ctrl+F,F3什么的

如果掌握了前面我写的东西,应该开发一个像样的东西就不是很难了。主要是要和自己的业务逻辑挂钩起来。

关于Drawing Control的文章很少,在msdn online上有几篇文章,可以看看,很不错的,有一个例子带了一个VisioUtility.cs的类,有一些用处的。
要解决一些棘手的问题,靠VBA是一个很好的方式。

下面说一些问题:
1、如果你用到这个control的form是mdichild。就要注意,当你第一次打开,没有问题,但是当你关闭了这个子form,再开一个的时候,就会出现异常。如果保留第一个打开的子form不动,打开第二个就没事。这个问题是因为什么一直不知道,最后我的解决方法是主窗体一开就建立一个隐藏的子form
   FormWorkspace formHide = new FormWorkspace(new BusinessProcessResource(), FormMain.userID, "", false, "");
2、带有这个control的form在打开的时候,偶尔会出现异常,那个异常的id根本哪里都查不到。我只能这样做:
    MessageBox.Show(this, "发生未处理的错误,请关闭后重新打开\n" + ex.Message, "异常错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
3、有时候,这个控件里发生异常的时候,异常并不抛出,用try catch根本没有办法得到,会被生生吃了,什么反应没有,这个只能慢慢的去找。
4、有些事件有问题,比如我想抓住Ctrl+Z,也就是Undo的执行,我用Keyup来抓,结果是有时候能抓到,有时抓不到。
5、ShapeSheet的UI在控件中是显示不出来的
6、只能是单窗体运行
7、不能嵌到其他ActivX control中(其他Activex control也一样)
8、不能放到Infopath form中(好像Infopath sp1可以了)
9、不包含VBA


好了,我知道的也就差不多了。当然有很多很多的细节没有说。如果这些没有条理的所谓文章能对大家有帮助,那也是大家的理解能力好,这么乱的东西我自己也看不懂了。:D