Загрузка чернил в MathInputControl в C # - PullRequest
1 голос
/ 12 сентября 2010

Я пытаюсь использовать метод LoadInk в mathinputcontrol, но не могу понять, откуда создать объект IIDispInk, так как он выглядит как интерфейс.

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

Любое руководство будет высоко оценено.

Спасибо:)

Редактировать: для ясности, вот мой код до сих пор [править 2: под "пока", я имею в видуиз того, что было добавлено.Практически весь остальной мой код можно найти на SO в разделе о том, как создать MIC в C #] (спасибо Гансу Пассанту)

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 Ответ

2 голосов
/ 19 сентября 2010

Использование проекта + Добавить ссылку, вкладка Обзор. Перейдите в папку c: \ program files \ common files \ microsoft shared \ ink и выберите InkObj.dll. Теперь вы можете создать экземпляр MSINKAUTLib.InkDispClass. Он реализует IInkDisp и имеет методы Save и Load.

Вам придется привести объект к micautLib.IInkDisp, интерфейсы приходят из разных библиотек типов. И, наконец, прежде чем использовать LoadInk (), вы должны вызвать метод Show () MathInputControl. Сообщения об ошибках ужасны, все 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:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...