Udostępnij przez


Przykładowy test trafień atramentu

W tym przykładzie pokazano dwie metody znajdowania tuszu, na podstawie lokalizacji na ekranie.

W tym przykładzie są używane następujące funkcje:

  • Korzystanie z kolektora atramentu
  • Wykonywanie testu trafienia
  • Lokalizowanie najbliższego punktu

Uzyskiwanie dostępu do interfejsu API pisma odręcznego

Najpierw należy odwołać się do klas komputerów tabletowych znajdujących się w zestawie Sdk (Software Development Kit) systemu Windows Vista lub Windows XP Tablet Pc Edition.

using Microsoft.Ink;

Obsługa zdarzeń ładowania formularza i rysowania

Procedura obsługi zdarzeń ładowania formularza:

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

Program obsługi zdarzenia Paint formularza sprawdza tryb aplikacji.

  • W trybie HitTest maluje okrąg wokół kursora. Aktywne pióro jest ustawione w metodzie handleHitTest aplikacji.
  • W trybie Najbliższego punktu maluje czerwoną linię między kursorem a punktem najbliższym kursorem. Najbliższy punkt jest obliczany w metodzie handleNearestPoint aplikacji.
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);
}

Ten przykład ma bardzo prosty algorytm przemalowania. Z właściwością AutoRedraw ustawioną na TRUE, kolektor atramentu odświeża się, gdy formularz jest ponownie rysowany. Aby uprościć ponowne rysowanie formularza, aplikacja śledzi pole ograniczenia, zmienną składową invalidateRect, dla obszaru, w którym jest dodawana farba, która jest unieważniona za każdym razem, gdy formularz jest ponownie rysowany.

Obsługa zdarzeń menu

Polecenie Exit wyłącza InkCollector przed zamknięciem aplikacji.

Polecenie pisma odręcznego aktualizuje tryb aplikacji i stan menu, włącza kolektor pisma odręcznego i unieważnia wcześniej rysowany obszar formularza.

Polecenia Hit Test i Najbliższy punkt zmieniają kursor, aktualizują tryb aplikacji i stan menu, wyłączają zestaw do zbierania atramentu oraz unieważniają poprzednio malowany region formularza.

Jasne! Polecenie wyłącza InkCollector , zastępując właściwość ink nowym obiektem Ink , generuje zdarzenie polecenia Ink i wymusza odświeżenie kontrolki.

Obsługa zdarzeń myszy

Program obsługi zdarzeń MouseMove sprawdza tryb aplikacji:

  • W trybie atramentu urządzenie nie wykonuje żadnych czynności, co pozwala na normalne zbieranie atramentu przez kolektor atramentu.
  • W trybie HitTest przesyła argumenty zdarzeń do metody handleHitTest aplikacji.
  • W trybie NearestPoint wysyła argumenty zdarzenia do metody handleNearestPoint aplikacji.

Wykonywanie testu trafienia

Metoda handleHitTest aplikacji tworzy dwa punkty: lokalizację kursora i punkt oddalony o HitSize pikseli od kursora, a następnie konwertuje te dwa punkty z pikseli na współrzędne przestrzeni atramentowej.

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

Następnie obiekt InkCollector używa metody Microsoft.Ink.Ink.HitTest(), aby znaleźć wszystkie kreski znajdujące się w odległości pt3.X - pt2.X jednostek przestrzeni atramentu od kursora pt2.

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

Metoda handleHitTest ustawia następnie kolor pióra na podstawie tego, czy znaleziono pociągnięcia, unieważnia region invalidateRect, oblicza nowy region, w którym jest rysowany okrąg testu trafienia, a następnie unieważnia nowy region.

Lokalizowanie najbliższego punktu

Metoda handleNearestPoint aplikacji tworzy dwa punkty, oba równe lokalizacji kursora, z których jeden, pt, jest konwertowany na przestrzeń tuszu i używany w wywołaniu metody obiektu InkCollector'a, Ink. Metoda NearestPoint zwraca obiekt Stroke znajdujący się najbliżej punktu i ustawia parametr wyjściowy indeksu zmiennoprzecinkowego.

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

Jeśli nie ma żadnych pociągnięć, metoda NearestPoint zwraca NULL, a lokalizacja kursora jest używana jako punkt najbliższy. W przeciwnym razie obliczana jest lokalizacja na ścieżce odpowiadająca indeksowi zmiennoprzecinkowemu.

Współrzędne najbliższego punktu są następnie konwertowane na piksele z przestrzeni atramentu. Następnie metoda handleNearestPoint unieważnia region invalidateRect, oblicza nowy region, w którym rysowana jest linia do najbliższego punktu, i również unieważnia nowy region.

Zamykanie formularza

Metoda Dispose formularza usuwa obiekt InkCollector.