Dela via


Testprov för bläckträff

Det här exemplet illustrerar två metoder för att hitta bläck, givet en plats på skärmen.

Följande funktioner används i det här exemplet:

  • Använda en bläckuppsamlare
  • Genomföra ett träfftest
  • Hitta närmaste punkt

Åtkomst till ink-API:et

Börja med att referera till Tablet PC-klasserna, som finns i Windows Vista eller Windows XP Tablet PC Edition Software Development Kit (SDK).

using Microsoft.Ink;

Hantera inläsnings- och målningshändelser för formulär

Formulärets lasthändelsehanterare:

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

Formulärets Paint-händelsehanterare kontrollerar programläget:

  • I HitTest-läget målar den en cirkel runt markören. Den aktiva pennan anges i programmets handleHitTest-metod.
  • I NearestPoint-läget målas en röd linje mellan markören och punkten närmast markören. Den närmaste punkten beräknas i programmets handleNearestPoint-metod.
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);
}

Det här exemplet har en mycket enkel ommålningsalgoritm. Med egenskapen AutoRedraw inställd på TRUE, omritar sig bläckinsamlare när formuläret ritas om. För att förenkla omritningen av formuläret spårar programmet en avgränsningsruta, medlemsvariabeln invalidateRect, för det område där färg läggs till, vilket ogiltigförklaras varje gång formuläret ritas om.

Hantera menyhändelser

Kommandot Avsluta inaktiverar InkCollector- innan programmet avslutas.

Kommandot Ink uppdaterar programläget och menystatusen, aktiverar ink-insamlaren och ogiltigförklarar formulärets tidigare målade region.

Både kommandona Träfftest och Närmaste punkt ändrar markören, uppdaterar programläget och menystatusen, inaktiverar bläckinsamlaren och ogiltigförklarar den tidigare målade regionen på formuläret.

Den klara! kommandot inaktiverar InkCollector- när inkcollector-objektets Ink-egenskap ersätts med ett nytt Ink-objekt, genererar en ink-kommandohändelse och tvingar fram en uppdatering av kontrollen.

Hantera mushändelser

Händelsehanteraren MouseMove kontrollerar programläget:

  • I ink-läget gör den inget och möjliggör därmed att bläck samlas in normalt av bläckinsamlaren.
  • I HitTest-läge skickar den händelseargumenten till programmets handleHitTest-metod.
  • I NearestPoint-läge skickar den händelseargumenten till programmets handleNearestPoint-metod.

Utföra ett träffprov

Programmets handleHitTest-metod skapar två punkter, markörens plats och en punkts HitSize-pixlar långt från markören och konverterar sedan dessa två punkter från pixlar till koordinater för pennanteckningsutrymme.

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

Sedan använder InkCollector--objektet metoden Microsoft.Ink.Ink.HitTest() för att hitta eventuella streck inom pt3.X - pt2.X pennutrymmesenheter för markören, pt2.

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

Metoden handleHitTest anger sedan pennfärgen baserat på om linjer hittades, ogiltigförklarar regionen invalidateRect, beräknar en ny region som träfftestcirkeln ritas in i och ogiltigförklarar sedan den nya regionen.

Hitta närmaste punkt

Applikationens handleNearestPoint-metod skapar två punkter som båda motsvarar markörens position. Den ena av dessa punkter, pt, konverteras till bläckyta och används i anropet till NearestPoint-metoden för InkCollector:s Ink-objekt. NearestPoint-metoden returnerar det Stroke--objekt som är närmast punkten och sätter utdataparametern för flyttalindex.

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

Om inga linjer finns returnerar NearestPoint-metoden NULL-och markörens plats används som närmaste punkt. I annat fall beräknas platsen på den linje som motsvarar flyttalsindexet.

De närmaste punktkoordinaterna konverteras sedan till bildpunkter från pennutrymmet, metoden handleNearestPoint ogiltigförklarar sedan invalidateRect-regionen, beräknar en ny region som linjen till närmaste punkt ritas in och ogiltigförklarar även den nya regionen.

Stänga formuläret

Formulärets Dispose-metod tar bort objektet InkCollector.