Condividi tramite


Esempio di hit test penna

Questo esempio illustra due metodi per trovare l'input penna, in base alla posizione dello schermo.

In questo esempio vengono usate le funzionalità seguenti:

  • Uso di un agente di raccolta input penna
  • Esecuzione di un hit test
  • Individuazione del punto più vicino

Accesso all'API Input penna

Prima di tutto, fare riferimento alle classi Tablet PC, disponibili in Windows Vista o Windows XP Tablet PC Edition Software Development Kit (SDK).

using Microsoft.Ink;

Gestione degli eventi di caricamento e disegno dei moduli

Gestore eventi load del modulo:

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

Il gestore eventi Paint del modulo controlla la modalità applicazione:

  • Nella modalità HitTest viene dipinto un cerchio intorno al cursore. La penna attiva è impostata nel metodo handleHitTest dell'applicazione.
  • Nella modalità NearestPoint viene dipinta una linea rossa tra il cursore e il punto più vicino al cursore. Il punto più vicino viene calcolato nel metodo handleNearestPoint dell'applicazione.
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);
}

Questo esempio ha un algoritmo di ripaint molto semplice. Con la relativa proprietà AutoRedraw impostata su TRUE, l'agente di raccolta input penna si riinteziona quando il modulo viene ridisegnato. Per semplificare il ridisegno del modulo, l'applicazione tiene traccia di un rettangolo di selezione, la variabile membro invalidateRect, per l'area in cui viene aggiunta la vernice, che viene invalidata ogni volta che il modulo viene ridisegnato.

Gestione degli eventi del menu

Il comando Exit disabilita l'oggetto InkCollector prima di uscire dall'applicazione.

Il comando Input penna aggiorna la modalità applicazione e lo stato del menu, abilita l'agente di raccolta input penna e invalida l'area precedentemente dipinta del modulo.

Entrambi i comandi Hit Test e Point più vicini modificano il cursore, aggiornano la modalità applicazione e lo stato del menu, disabilitano l'agente di raccolta input penna e invalidano l'area precedentemente dipinta del modulo.

Chiaro! il comando disabilita la proprietà InkCollector sostituendo la proprietà InkCollector dell'oggetto Ink con un nuovo oggetto Ink , genera un evento di comando Ink e forza un aggiornamento sul controllo.

Gestione degli eventi del mouse

Il gestore eventi MouseMove controlla la modalità applicazione:

  • In modalità input penna non viene eseguito alcun risultato, consentendo la raccolta dell'input penna normalmente dall'agente di raccolta input penna.
  • In modalità HitTest invia gli argomenti dell'evento al metodo handleHitTest dell'applicazione.
  • In modalità NearestPoint invia gli argomenti dell'evento al metodo handleNearestPoint dell'applicazione.

Esecuzione di un hit test

Il metodo handleHitTest dell'applicazione crea due punti, la posizione del cursore e un punto HitSize pixel distante dal cursore e quindi converte questi due punti da pixel a coordinate dello spazio penna.

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);
}

L'oggetto InkCollector usa quindi il metodo Microsoft.Ink.Ink.HitTest() per trovare eventuali tratti all'interno di pt3. X - pt2. Unità di spazio penna X del cursore pt2.

Strokes strokes = ic.Ink.HitTest(pt2, (float)(pt3.X - pt2.X));

Il metodo handleHitTest imposta quindi il colore della penna in base al fatto che i tratti siano stati trovati, invalida l'area invalidateRect, calcola una nuova area in cui viene disegnato il cerchio di hit test e quindi invalida la nuova area.

Individuazione del punto più vicino

Il metodo handleNearestPoint dell'applicazione crea due punti uguali alla posizione del cursore, uno di questi punti, pt, viene convertito nello spazio penna e usato nella chiamata al metodo NearestPoint dell'oggetto InkCollector. Il metodo NearestPoint restituisce l'oggetto Stroke più vicino al punto e imposta il parametro di output dell'indice a virgola mobile.

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);

Se non sono presenti tratti, il metodo NearestPoint restituisce NULL e la posizione del cursore viene usata come punto più vicino. In caso contrario, viene calcolata la posizione del tratto corrispondente all'indice a virgola mobile.

Le coordinate del punto più vicino vengono quindi convertite in pixel dallo spazio penna, il metodo handleNearestPoint invalida quindi l'area invalidateRect, calcola una nuova area in cui viene tracciata la riga al punto più vicino e invalida anche la nuova area.

Chiusura del modulo

Il metodo Dispose del modulo elimina l'oggetto InkCollector .