Пример теста рукописного ввода
В этом примере показаны два метода поиска рукописного ввода с учетом расположения экрана.
В этом примере используются следующие функции:
- Использование сборщика рукописного ввода
- Выполнение теста нажатия
- Поиск ближайшей точки
Доступ к API Рукописного ввода
Сначала укажите классы планшетных компьютеров, расположенные в пакете SDK для Windows Vista или Windows XP Tablet PC Edition.
using Microsoft.Ink;
Обработка событий загрузки формы и рисования
Обработчик событий Load формы:
- Создает объект InkCollector ic для формы.
- Задает свойство CollectionMode объекта InkCollector, чтобы игнорировать жесты.
- Включает InkCollector.
- Устанавливает для свойства AutoRedraw объекта InkCollector значение TRUE.
// Create the InkCollector, and turn it on
ic = new InkCollector(Handle); // attach it to the form's frame window
// default to ink-enabled mode
mode = ApplicationMode.Ink;
ic.CollectionMode = CollectionMode.InkOnly;
// turn the collector on
ic.Enabled = true;ic.AutoRedraw = true;
Обработчик событий Paint формы проверяет режим приложения:
- В режиме HitTest он рисует круг вокруг курсора. Активное перо задается в методе handleHitTest приложения.
- В режиме NearestPoint он закрашивает красную линию между курсором и точкой, ближайшей к нему. Ближайшая точка вычисляется в методе handleNearestPoint приложения.
if( mode == ApplicationMode.HitTest)
{
e.Graphics.DrawEllipse(activepen, penPt.X - HitSize/2, penPt.Y - HitSize/2, HitSize, HitSize);
}
else if( mode == ApplicationMode.NearestPoint )
{
e.Graphics.DrawLine(redPen, penPt, nearestPt);
}
Этот пример имеет очень простой алгоритм перекраски. Если свойству AutoRedraw присвоено значение TRUE, сборщик рукописного ввода перерисовывается при перерисовке формы. Чтобы упростить перерисовку формы, приложение отслеживает ограничивающий прямоугольник ( переменную-член invalidateRect) для области, в которую добавляется краска, которая становится недействительной при каждом перерисовывание формы.
Обработка событий меню
Команда Exit отключает InkCollector перед выходом из приложения.
Команда Ink обновляет режим приложения и состояние меню, включает сборщик рукописного ввода и делает недействительной ранее окрашенную область формы.
Команды Проверка нажатия и Ближайшая точка изменяют курсор, обновляют режим приложения и состояние меню, отключают сборщик рукописного ввода и делают недействительной ранее окрашенную область формы.
Ясно! Команда отключает InkCollector при замене свойства InkCollector объекта InkCollector новым объектом Ink , создает событие команды Ink и принудительно обновляет элемент управления.
Обработка событий мыши
Обработчик событий MouseMove проверяет режим приложения:
- В режиме рукописного ввода он не выполняет никаких действий, позволяя сборщику рукописного ввода собираться обычным образом.
- В режиме HitTest он отправляет аргументы события в метод handleHitTest приложения.
- В режиме NearestPoint он отправляет аргументы события в метод handleNearestPoint приложения.
Выполнение теста попадания
Метод handleHitTest приложения создает две точки: расположение курсора и точку HitSize, удаленную от курсора, а затем преобразует эти две точки из пикселей в координаты пространства рукописного ввода.
penPt = new Point(e.X, e.Y);
Point pt2 = new Point(e.X, e.Y);
Point pt3 = new Point(e.X + HitSize/2, e.Y);
using (Graphics g = CreateGraphics())
{
ic.Renderer.PixelToInkSpace(g, ref pt1);
ic.Renderer.PixelToInkSpace(g, ref pt2);
}
Затем объект InkCollector использует метод Microsoft.Ink.Ink.HitTest() для поиска росчерков, находящихся в пределах pt3. X — pt2. X единиц пространства рукописного ввода курсора, pt2.
Strokes strokes = ic.Ink.HitTest(pt2, (float)(pt3.X - pt2.X));
Затем метод handleHitTest задает цвет пера в зависимости от того, были ли найдены штрихи, делает недействительной область invalidateRect, вычисляет новую область, в которую нарисовывается круг проверки попадания, а затем делает новую область недействительной.
Поиск ближайшей точки
Метод handleNearestPoint приложения создает две точки, равные расположению курсора. Одна из этих точек, pt, преобразуется в пространство рукописного ввода и используется в вызове метода NearestPoint объекта InkCollector InkCollector. Метод NearestPoint возвращает объект Stroke , ближайший к точке, и задает выходной параметр индекса с плавающей запятой.
using (Graphics g = CreateGraphics())
{
// Remember pen location
Point inkPenPt = new Point(e.X, e.Y);
// Convert the pen location into a location in ink space
ic.Renderer.PixelToInkSpace(g, ref inkPenPt);
// ...
float fIndex;
Stroke stroke = ic.Ink.NearestPoint(inkPenPt, out fIndex);
Если штрихи отсутствуют, метод NearestPoint возвращает значение NULL, а в качестве ближайшей точки используется расположение курсора. В противном случае вычисляется расположение росчерка, соответствующее индексу с плавающей запятой.
Затем координаты ближайших точек преобразуются в пиксели из пространства рукописного ввода. Затем метод handleNearestPoint делает недействительной область invalidateRect, вычисляет новую область, в ней отрисовывается линия до ближайшей точки, а также делает недействительной новую область.
Закрытие формы
Метод Dispose формы удаляет объект InkCollector .