在CSharp中使用WinGraphviz,一个COM图论组件,兼谈COM接口IStream在.NET下的互操作。...

文章的IStream由 gray在评论中给与了解决,请自上而下阅读 15.gif
Graphviz
是AT&T实验室的一个项目,提供了通过DOT语言(一种自定义的语言)绘出图论中有向图的工具,当然Graphviz也完全可以用于无向图的绘制。 在图(这里作为数据结构)的可视化方面,Graphviz是非常理想的工具。

WinGraphviz基于Graphviz项目,在Win32平台上,将Graphviz封装为一个COM对象,从而可以在Windows下方便的使用。

WinGraphviz是COM组件,在它的网页上没有提供C#的示例,所以我这里就尝试着写了一个:WinGraphViz_Demo.rar,如果对这个组件感兴趣的,请到WinGraphviz主页下载WinGraphviz_v1.02.25s.cab,按照上面提示方法安装后,即可看到结果。

程序讲解到此结束,以下为程序缺憾,请熟悉COM和.NET互操作的网友赐教:

在学习过程中,发现虽然WinGraphviz提供了IBinaryImage接口,其中的Dump方法支持一个拥有IStream接口的COM对象的写入,但是在.NET平台上,我却没有发现能够支持,COM的IStream的.NET类,.NET下的PictureBox也不支持COM的stdole.IPictureDisp图像文件接口。所以实现采用了最笨的存到C:\Temp.emf,然后再读出来的办法,肯定有更好的办法,但是暂时我想不出……



(一天后添加)没想到博客园高手如云,哈哈, gray给出的评论给了我相当的指导,讲老实话,直到现在我对ComStream的工作原理还是不甚了了,但无论如何,现在总算完全解决了IStream问题,不用临时文件过渡了。使用ComStream的关键代码如下:

None.gif WINGRAPHVIZLib.DOT my_Dot  =   new  WINGRAPHVIZLib.DOTClass();
None.gif
if (my_Dot.Validate(textBox.Text) == true )
ExpandedBlockStart.gif
{
InBlock.gif    WINGRAPHVIZLib.BinaryImage bi
=my_Dot.ToEMF(textBox.Text);
InBlock.gif    UCOMIStream iStream 
= null;
InBlock.gif    ComStream.CreateStreamOnHGlobal(
0falseout iStream);
InBlock.gif    bi.Dump((WINGRAPHVIZLib.IStream) iStream);
InBlock.gif    ComStream comStream 
= new ComStream(ref iStream);
InBlock.gif
InBlock.gif    
// comStream must reset to position 0 if use Metafile, But needn't if use Bitmap, Why?
InBlock.gif
    comStream.Position = 0;    
InBlock.gif
InBlock.gif    Metafile mf 
= new Metafile(comStream);
InBlock.gif    pictureBox.Height 
= mf.Height;
InBlock.gif    pictureBox.Width 
= mf.Width;
InBlock.gif    
this.Height = mf.Height;
InBlock.gif    
this.Width = mf.Width;
InBlock.gif    pictureBox.Image 
= mf;
ExpandedBlockEnd.gif}

None.gif

WinGraphViz_Demo.rar已经更新了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值