c# - 在 C# 中将墨迹加载到 MathInputControl

标签 c# windows windows-7

我正在尝试使用 mathinputcontrol 的 LoadInk 方法,但我不知道从哪里创建 IIDispInk 对象,因为它看起来只是一个接口(interface)。

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

任何指导将不胜感激。

谢谢:)

编辑:为清楚起见,这是我到目前为止的代码[编辑 2:“到目前为止”,我指的是已添加的内容。我的几乎所有其他代码都可以在如何在 C# 中创建 MIC 下的 SO 上找到](感谢 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);

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

灾难性故障(HRESULT 异常:0x8000FFFF (E_UNEXPECTED))

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

最佳答案

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

您必须将对象转换为 micautLib.IInkDisp,这些接口(interface)来自不同的类型库。最重要的是,在使用 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);

加上插入和关闭事件的事件处理程序。以及将窗口固定在正确位置的胶水。

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

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

啊,COM 的乐趣。这不是由 Microsoft.Ink.dll 包装的,这绝非偶然:)

关于c# - 在 C# 中将墨迹加载到 MathInputControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3693469/

相关文章:

c# - MvxTableViewCell 加载一个空 View

c# - [UWP][C#] 覆盖 Appx.cs 中设置的 backpress 导航

c# - 如何使用 sqlite 创建 asp.net web 应用程序

c++ - 如何防止 WSASend() 阻塞我的 UI 线程?

c# - NotifyIcon 单击事件未触发

JavaExe 和 Java 应用程序作为 Windows 系统服务与桌面交互

windows-7 - 安装了Win7 SDK。找不到 winDbg

c# - 使用csc时出现奇怪的警告

windows - os.File.SetReadDealine : file type does not support deadline

powershell - 在PowerShell中更改 "Windows font size (DPI)"?