在C#中将墨迹加载到MathInputControl

时间:2010-09-12 02:11:13

标签: c# windows windows-7

我正在尝试使用mathinputcontrol的LoadInk方法,但我无法弄清楚从哪里创建IIDispInk对象,因为它似乎只是一个接口。

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

任何指导都将受到高度赞赏。

谢谢:)

编辑:为清楚起见,这里是我的代码到目前为止[编辑2:“到目前为止”,我的意思是添加了什么。几乎所有其余的代码都可以在SO下找到如何在C#中创建MIC的方式(感谢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);

不幸的是,这会引发完全相同的异常

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

C:\ Tim \ bytes.isf包含从InkPicture控件保存的字节,它加载并保存这个文件OK,所以我假设因为loadInkTest.Load()方法没有抛出异常(通常它不害羞)这样做)它加载数据确定。如果有更好(或更明显)的地方建议获取字节,请告诉我。

1 个答案:

答案 0 :(得分:2)

使用Project + Add Reference,Browse选项卡。导航到c:\ program files \ common files \ microsoft shared \ ink并选择InkObj.dll。您现在可以创建MSINKAUTLib.InkDispClass的实例。它实现了IInkDisp并具有Save和Load方法。

您必须将对象强制转换为micautLib.IInkDisp,接口来自不同类型的库。而且,在使用LoadInk()之前,必须首先调用MathInputControl的Show()方法。错误报告很悲惨,一切都是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);

Insert和Close事件的Plus事件处理程序。还有用于将窗户放在正确位置的胶水。

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

如果您计划支持64位操作系统,则必须构建程序的单独版本。从运行64位版本的Tlbimp.exe(不是Visual Studio)开始创建interop包装器。这样参数将是一个64位的值,并与你传递给方法的Handle窗口兼容。

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