Ejemplo de prueba de posicionamiento de lápiz
En este ejemplo se muestran dos métodos para buscar entrada de lápiz, dada una ubicación de pantalla.
En este ejemplo se usan las siguientes características:
- Uso de un recopilador de lápiz
- Realización de una prueba de posicionamiento
- Buscar el punto más cercano
Acceso a la API de Ink
En primer lugar, haga referencia a las clases tablet PC, ubicadas en el Kit de desarrollo de software de Windows Vista o Windows XP Tablet PC Edition (SDK).
using Microsoft.Ink;
Control de eventos de carga y pintura de formularios
Controlador de eventos Load del formulario:
- Crea un objeto InkCollector , ic, para el formulario.
- Establece la propiedad CollectionMode del objeto InkCollector para omitir los gestos.
- Habilita inkCollector.
- Establece la propiedad AutoRedraw del objeto InkCollector en 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;
El controlador de eventos Paint del formulario comprueba el modo de aplicación:
- En el modo HitTest, pinta un círculo alrededor del cursor. El lápiz activo se establece en el método handleHitTest de la aplicación.
- En el modo NearestPoint, pinta una línea roja entre el cursor y el punto más cercano al cursor. El punto más cercano se calcula en el método handleNearestPoint de la aplicación.
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);
}
Este ejemplo tiene un algoritmo de reintentos muy sencillo. Con su propiedad AutoRedraw establecida en TRUE, el recopilador de tinta vuelve a dibujarse cuando se vuelve a dibujar el formulario. Para simplificar el nuevo dibujo del formulario, la aplicación realiza un seguimiento de un cuadro de límite, la variable miembro invalidateRect, para el área donde se agrega pintura, que se invalida cada vez que se vuelve a dibujar el formulario.
Controlar eventos de menú
El comando Exit deshabilita InkCollector antes de salir de la aplicación.
El comando Ink actualiza el modo de aplicación y el estado del menú, habilita el recopilador de tintas y invalida la región pintada previamente del formulario.
Los comandos Prueba de posicionamiento y Punto más cercano cambian el cursor, actualizan el modo de aplicación y el estado del menú, deshabilitan el recopilador de tinta y invalidan la región pintada previamente del formulario.
¡Claro! el comando deshabilita inkCollector al reemplazar la propiedad InkCollector del objeto Ink por un nuevo objeto Ink , genera un evento de comando Ink y fuerza una actualización en el control.
Controlar eventos del mouse
El controlador de eventos MouseMove comprueba el modo de aplicación:
- En el modo Ink, no hace nada, lo que permite recopilar la entrada de lápiz normalmente por el recopilador de tintas.
- En el modo HitTest, envía los argumentos de evento al método handleHitTest de la aplicación.
- En el modo NearestPoint, envía los argumentos de evento al método handleNearestPoint de la aplicación.
Realización de una prueba de posicionamiento
El método handleHitTest de la aplicación crea dos puntos, la ubicación del cursor y un punto HitSize píxeles distantes del cursor y, a continuación, convierte estos dos puntos de píxeles en coordenadas de espacio de entrada de lápiz.
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);
}
A continuación, el objeto InkCollector usa el método Microsoft.Ink.Ink.HitTest() para buscar los trazos que se encuentran en pt3. X - pt2. Unidades de espacio de entrada de lápiz X del cursor, pt2.
Strokes strokes = ic.Ink.HitTest(pt2, (float)(pt3.X - pt2.X));
A continuación, el método handleHitTest establece el color del lápiz en función de si se encontraron trazos, invalida la región invalidateRect, calcula una nueva región en la que se dibuja el círculo de prueba de posicionamiento y, a continuación, invalida la nueva región.
Buscar el punto más cercano
El método handleNearestPoint de la aplicación crea dos puntos iguales a la ubicación del cursor, uno de estos puntos, pt, se convierte en espacio de entrada de lápiz y se usa en la llamada al método NearestPoint del objeto InkCollector de InkCollector. El método NearestPoint devuelve el objeto Stroke más cercano al punto y establece el parámetro de salida del índice de punto flotante.
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);
Si no hay trazos, el método NearestPoint devuelve NULL y la ubicación del cursor se usa como punto más cercano. De lo contrario, se calcula la ubicación del trazo correspondiente al índice de punto flotante.
A continuación, las coordenadas de punto más cercanas se convierten en píxeles del espacio de entrada de lápiz, el método handleNearestPoint invalida la región invalidateRect, calcula una nueva región en la que se dibuja la línea al punto más cercano y también invalida la nueva región.
Cerrar el formulario
El método Dispose del formulario elimina el objeto InkCollector .