共用方式為


筆跡點擊測試範例

此範例說明在螢幕位置下尋找筆跡的兩種方法。

此範例會使用下列功能:

  • 使用筆跡收集器
  • 執行點擊測試
  • 尋找最接近的點

存取筆跡 API

首先,參考位於 Windows Vista 或 Windows XP Tablet PC Edition Software Development Kit (SDK) 的平板電腦類別。

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,同時以新的Ink 物件取代 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 會轉換成筆跡空間,並用於 對 InkCollectorInk 物件之 NearestPoint 方法的呼叫。 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 物件。