Поделиться через


Пример теста рукописного ввода

В этом примере показаны два метода поиска рукописного ввода с учетом расположения экрана.

В этом примере используются следующие функции:

  • Использование сборщика рукописного ввода
  • Выполнение теста нажатия
  • Поиск ближайшей точки

Доступ к API Рукописного ввода

Сначала укажите классы планшетных компьютеров, расположенные в пакете SDK для Windows Vista или Windows XP Tablet PC Edition.

using Microsoft.Ink;

Обработка событий загрузки формы и рисования

Обработчик событий Load формы:

// 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 .