我正在尝试使用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()方法没有抛出异常(通常它不害羞)这样做)它加载数据确定。如果有更好(或更明显)的地方建议获取字节,请告诉我。
答案 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包装:)。