Загрузка чернил в MathInputControl в C#
Я пытаюсь использовать метод LoadInk в mathinputcontrol, но я не могу понять, где создать объект IIDispInk, так как он выглядит как интерфейс.
http://msdn.microsoft.com/en-us/library/dd372605(VS.85).aspx
Любое руководство будет высоко ценится.
Спасибо:)
Изменить: для ясности, вот мой код до сих пор [редактировать 2: под "пока", я имею в виду то, что было добавлено. Практически весь остальной мой код можно найти на SO в разделе о том, как создать MIC в C#] (спасибо 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, который загружает и сохраняет этот файл в порядке, поэтому я предполагаю, что, поскольку метод loadInkTest.Load() не выдает исключение (обычно это не стесняется делать это)) что он загрузил данные ОК. Если есть предложение относительно лучшего (или более очевидного) места для получения байтов, пожалуйста, дайте мне знать.
1 ответ
Используйте Project + Add Reference, вкладку Обзор. Перейдите в папку c:\program files\common files\microsoft shared\ink и выберите InkObj.dll. Теперь вы можете создать экземпляр MSINKAUTLib.InkDispClass. Он реализует IInkDisp и имеет методы Save и Load.
Вам придется привести объект к micautLib.IInkDisp, интерфейсы приходят из разных библиотек типов. И самое главное, вы должны вызвать метод Show() MathInputControl, прежде чем использовать 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);
Плюс обработчики событий для события вставки и закрытия. И клей, чтобы получить окно в нужном месте.
Также помните, что библиотека типов micautLib зависит от разрядности компьютера. Проблемой является метод SetOwnerWindow(), вы действительно хотите использовать его для предотвращения исчезновения диалога за другим окном. Его аргумент объявлен как LONG_PTR, тип, который является 32-разрядным в 32-разрядной операционной системе, 64-разрядным в x64. Оконная ручка. Когда вы используете Visual Studio, вы всегда получите 32-битную версию этого метода, поскольку VS - 32-битная программа.
Если вы планируете поддерживать 64-битные операционные системы, вам придется создать отдельную версию вашей программы. Начиная с запуска 64-битной версии Tlbimp.exe (не Visual Studio) для создания оболочки взаимодействия. Так что аргумент будет 64-битным значением и совместим с окном Handle, который вы передадите методу.
Ах, радости COM. Не случайно, что это не было упаковано Microsoft.Ink.dll:)