将油墨加载到C#中的MathInputControl中

我试图使用mathinputcontrol的LoadInk方法,但我不知道在哪里创buildIIDispInk对象,因为它似乎是一个接口。

http://msdn.microsoft.com/en-us/library/dd372605(VS.85).aspx

任何指导将不胜感激。

谢谢 :)

编辑:为清楚起见,这里是我的代码到目前为止[编辑2:“到目前为止”,我的意思是什么被添加。 几乎所有其余的代码都可以在SO下find,如何在C#中创buildMIC](感谢Hans Passant)

MSINKAUTLib.InkDispClass loadInkTest = new MSINKAUTLib.InkDispClass(); Stream stream = File.Open("C:\\Tim\\bytes.isf", FileMode.Open); byte[] bytes = new byte[stream.Length]; stream.Read(bytes, 0, bytes.Length); loadInkTest.Load(bytes); ctrl.LoadInk((micautLib.IInkDisp)loadInkTest); 

不幸的是,这抛出了完全相同的exception

Catastrophic failure (Exception from HRESULT: 0x8000FFFF (E_UNEXPECTED))

C:\ Tim \ bytes.isf包含从InkPicture控件中保存的字节,它加载并保存了这个文件,所以我假定loadInkTest.Load()方法没有抛出exception(通常这样做并不害羞)它加载的数据OK。 如果有更好(或更明显)的地方获得字节的build议,请让我知道。

Solutions Collecting From Web of "将油墨加载到C#中的MathInputControl中"

使用项目+添加引用,浏览选项卡。 导航到c:\ program files \ common files \ microsoft shared \ ink并选择InkObj.dll。 现在可以创建MSINKAUTLib.InkDispClass的实例。 它实现IInkDisp并具有保存和加载方法。

您必须将该对象投射到micautLib.IInkDisp,接口来自不同的类型库。 紧凑的,你必须首先调用MathInputControl的Show()方法,然后使用LoadInk()。 错误报告是悲惨的,一切都是E_UNEXPECTED。 我得到的代码工作:

  var ctl = new micautLib.MathInputControl(); var ink = new MSINKAUTLib.InkDisp(); ink.Load(System.IO.File.ReadAllBytes("c:\\temp\\test.isf")); var iink = (micautLib.IInkDisp)ink; ctl.Show(); ctl.LoadInk(iink); 

插入和关闭事件的Plus事件处理程序。 而胶水把窗户放在正确的地方。

另外请注意,micautLib类型库对机器的位数有依赖性。 麻烦制造者是SetOwnerWindow()方法,你真的想用它来防止对话框消失在另一个窗口的后面。 它的参数被声明为LONG_PTR,一种在32位操作系统上是32位,在64位上是64位的类型。 窗户把手。 当您使用Visual Studio时,您将始终获得该方法的32位版本,因为VS是一个32位程序。

如果你打算支持64位操作系统,那么你将不得不建立一个单独的程序版本。 从运行64位版本的Tlbimp.exe(不是Visual Studio)开始创建interop包装。 这样的参数将是一个64位的值,并与您传递给方法的窗口句柄兼容。

啊,COM的乐趣。 没有真正的意外,这是不是由Microsoft.Ink.dll包裹:)