Visio的DrawingControl暴露出来很多事件,一般来说是够用了。可是有时候,我们还觉得这些事件不够用,比如说: 我们想在拖动某个形状时触发事件来处理,可是直接从drawingcontrol里面是没有这样的事件的,查了查也没有这样的事件。 于是,我可以这样做。   Visio.Shape shape = this.axDrawingControl1.Window.Application.ActivePage.Shapes[1];    shape.TextChanged +=new Microsoft.Office.Interop.Visio.EShape_TextChangedEventHandler(shape_TextChanged);    shape.CellChanged +=new Microsoft.Office.Interop.Visio.EShape_CellChangedEventHandler(shape_CellChanged);

当然真正应用的时候,这个shape不能像我上面那样取,这里注册了两个事件,一个是该Shape的文本发生改变的事件,一个是Cell改变的事件,在事件处理中   private void shape_CellChanged(Microsoft.Office.Interop.Visio.Cell Cell)   {    if(Cell.Name == "PinX" || Cell.Name == "PinY")     MessageBox.Show("LocationChanged");   } 这样,该Shape位置发生变化我们就可控了。

posted on 2004-10-18 15:31 什么都不知道 阅读(805) 评论(13)  编辑 收藏

评论

 

# re: 使用Visio 2003 Drawing Control开发应用(补1) 2005-01-05 14:31 zhaoxpi

请教一个问题。急,谢谢! 我用c#+visio2003开发了一个机房管理软件,但是在客户机安装完成后(程序用到的visio drawing control控件已经打包进去了),需要visio的部分运行不了,发现只有在机器上安装了一整套visio软件后才可以运行我自己的软件。请问为什么?难道客户机上必须安装整套visio吗?  

# re: 使用Visio 2003 Drawing Control开发应用(补1) 2005-01-05 19:26 什么都不知道

是的,必须安装 我在该系列中的第一篇(?)中说过这个问题。必须安装visio2003才可以,而且必须安装.net可编程支持组件(typical安装不装) 这个安装可以用脚本写出silent installation的,所以你可以放在一个安装包内,具体你可以看我从前的文章  

# 好,谢谢 2005-01-06 09:37 zhaoxpi

好,谢谢  

# re: 使用Visio 2003 Drawing Control开发应用(补1) 2005-01-06 11:47 afirst

小弟正在研究c#开发visio2003的问题,可否给一些思路呢?  

# re: 使用Visio 2003 Drawing Control开发应用(补1) 2005-01-06 11:48 afirst

或者相关的文档,我在网上查找,实在太少了。 去电脑书店,很少有卖的。如果可以我告诉你信箱,谢谢了  

# re: 使用Visio 2003 Drawing Control开发应用(补1) 2005-01-06 18:42 什么都不知道

visio 2003能实现的(比如绘图) + visio 2003不能实现的(比如和你的业务数据库打交道),而且你不想个性化visio 2003,是想单独开发个程序,就是用这个drawing control的目的 相关的文档包括msdn都很少,我这个系列应该算是最全的了,只是我没有多少时间把他写的很详细  

# re: 使用Visio 2003 Drawing Control开发应用(补1) 2005-01-06 23:34 zhaoxpi

继续请教!谢谢! 我不想让用户使用visio自己提供的右键菜单,所以我自己创建了contextmenu,但是现在的问题是没办法扑捉到点击右键时的鼠标位置,因为drawing control内部的鼠标坐标没办法转换到winform的坐标。 请问有什么办法解决吗?  

# re: 使用Visio 2003 Drawing Control开发应用(补1) 2005-01-07 18:16 什么都不知道

 

   可以,比如下面你输入那个control的实例,然后是点坐标,就可以返回算完的坐标
private Point PageUnitsToPixels( ref AxMicrosoft.Office.Interop.VisOcx.AxDrawingControl axDrawingControl, double x,  double y) { try {   double vLeft, vTop, vWidth, vHeight;   axDrawingControl.Window.GetViewRect( out vLeft, out vTop, out vWidth, out vHeight);   // calculate position   int xForm = (int) (axDrawingControl.Left + (axDrawingControl.Width/vWidth)*(x-vLeft));   int yForm = (int) (axDrawingControl.Top + (axDrawingControl.Height/vHeight)*(vTop-y));   
  return new Point( xForm, yForm );   } catch(Exception ex) {   return new Point(0, 0); } }    
不过这个算法在使用visio的stencil窗口的情况下,有计算上的偏差,因为影响不是特别大,我就没有仔细研究了,应该可以实现精确定位

re: 使用Visio 2003 Drawing Control开发应用(补1)

 

原链接:http://www.cnblogs.com/wingofwind/articles/132611.html