共用方式為


RealTimeStylus Ink 集合範例

此應用程式會在使用 RealTimeStylus 類別時示範筆跡集合和轉譯。

InkCollection 專案

此範例包含單一方案,其中包含一個專案 InkCollection。 應用程式會 InkCollection 定義包含單一類別的命名空間,也稱為 InkCollection 。 類別繼承自 Form 類別,並實作 IStylusAsyncPlugin 介面。

namespace InkCollection
{
    public class InkCollection : Form, IStylusAsyncPlugin
    {
        //...
      

InkCollection 類別會定義一組用來指定各種筆跡粗細的私人常數。 類別也會宣告 RealTimeStylus 類別、 myRealTimeStylusDynamicRenderer 類別和 myDynamicRendererRenderer 類別 myRenderer 的私人實例。 DynamicRenderer會轉譯目前正在收集的Stroke。 Renderer 物件 myRenderer 會轉譯已經收集的 Stroke 物件。

private const float ThinInkWidth = 10;
private const float MediumInkWidth = 100;
private const float ThickInkWidth = 200;

private RealTimeStylus myRealTimeStylus;

private DynamicRenderer myDynamicRenderer;
private Renderer myRenderer;

類別也會宣告 Hashtable 物件, myPackets 此物件用來儲存一或多個 Cursor 物件所收集的封包資料。 手寫筆物件的Id值會當做雜湊表索引鍵使用,以唯一識別為指定 Cursor 物件收集的封包資料。

Ink物件的 myInk 私用實例,會儲存 所收集的 myRealTimeStylusStroke物件。

private Hashtable myPackets;
        
private Ink myInk;

表單載入事件

在表單的 Load 事件處理常式中, myDynamicRenderer 會使用採用控制項做為引數的 DynamicRenderer 具現化,並以 myRenderer 無引數建構函式建構。

private void InkCollection_Load(object sender, System.EventArgs e)
{
    myDynamicRenderer = new DynamicRenderer(this);
    myRenderer = new Renderer();
    // ...

請注意轉譯器具現化之後的批註,因為在 myDynamicRenderer 轉譯筆跡時會使用 DrawingAttributes 的預設值。 這是標準行為。 不過,如果您想要提供由 myDynamicRenderermyRenderer 轉譯的筆跡所呈現的不同外觀,您可以變更 上的 myDynamicRendererDrawingAttributes屬性。 若要這樣做,請先取消批註下列幾行,再建置並執行應用程式。

    // myDynamicRenderer.DrawingAttributes.PenTip = PenTip.Rectangle;
    // myDynamicRenderer.DrawingAttributes.Height = (.5F)*MediumInkWidth;
    // myDynamicRenderer.DrawingAttributes.Transparency = 128;

接下來,應用程式會建立 RealTimeStylus 物件,用來接收手寫筆通知,並將 DynamicRenderer 物件新增至同步外掛程式通知佇列。 具體而言, myRealTimeStylus 會將 新增 myDynamicRendererSyncPluginCollection 屬性。

    myRealTimeStylus = new RealTimeStylus(this, true);

    myRealTimeStylus.SyncPluginCollection.Add(myDynamicRenderer);

表單接著會新增至非同步外掛程式通知佇列。 具體而言, InkCollection 會新增至 AsyncPluginCollection 屬性。 最後, myRealTimeStylus 會啟用 和 myDynamicRenderer ,並具現化 myPackets 和 myInk。

    myRealTimeStylus.AsyncPluginCollection.Add(this);

    myRealTimeStylus.Enabled = true;
    myDynamicRenderer.Enabled = true;  
      
    myPackets = new Hashtable();
    myInk = new Ink();
}

除了連結功能表處理常式來變更筆跡色彩和大小之外,實作 介面之前,還需要一個簡短的程式碼區塊。 此範例必須處理表單的 Paint 事件。 在事件處理常式中,應用程式必須重新 myDynamicRenderer 整理,因為 Stroke 物件可能在 Paint 事件發生時收集。 在此情況下,必須重新繪製已經收集的 Stroke 物件部分。 靜態 轉譯器 可用來重新繪製已經收集的 Stroke 物件。 這些筆劃位於 Ink 物件中,因為它們會在繪製時放置於該處,如下一節所示。

private void InkCollection_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
    myDynamicRenderer.Refresh();

    myRenderer.Draw(e.Graphics, myInk.Strokes);
} 

實作 IStylusAsyncPlugin 介面

範例應用程式會定義它在 DataInterest 屬性實作中接收的通知類型。 因此,DataInterest 屬性會定義 RealTimeStylus 物件轉送至表單的通知。 在此範例中,DataInterest 屬性會透過DataInterestMask列舉定義StylusDownPacketsStylusUpError通知中的興趣。

public DataInterestMask DataInterest
{
    get
    {
        return DataInterestMask.StylusDown |
               DataInterestMask.Packets |
               DataInterestMask.StylusUp |
               DataInterestMask.Error;
    }
}

手寫筆觸碰數位板表面時,就會發生 手寫筆Down 通知。 發生這種情況時,此範例會配置用來儲存 手寫筆 物件的封包資料的陣列。 StylusDown 方法中的 StylusDownData會新增至陣列,並使用 Stylus 物件的Id屬性做為索引鍵,將陣列插入雜湊表中。

public void StylusDown(RealTimeStylus sender, StylusDownData data)
{
    ArrayList collectedPackets = new ArrayList();

    collectedPackets.AddRange(data.GetData());

    myPackets.Add(data.Stylus.Id, collectedPackets);
}

當畫筆在數位板介面上移動時,就會發生 封包 通知。 發生這種情況時,應用程式會將新的 StylusDownData 新增至 Stylus 物件的封包陣列。 它會使用手寫筆物件的 Id 屬性做為索引鍵,從雜湊表擷取手寫筆的封包陣列。 然後,新的封包資料會插入擷取的陣列中。

public void Packets(RealTimeStylus sender, PacketsData data)
{
    ((ArrayList)(myPackets[data.Stylus.Id])).AddRange(data.GetData());
}

手寫筆離開數位板表面時,就會發生 手寫筆通知 。 發生此通知時,此範例會從雜湊表擷取此手寫筆物件的封包陣列,從雜湊表中移除該物件,因為不再需要該物件、新增新的封包資料,並使用封包資料的陣列來建立新的Stroke物件。 stroke

public void StylusUp(RealTimeStylus sender, StylusUpData data)
{
    ArrayList collectedPackets = (ArrayList)myPackets[data.Stylus.Id];
    myPackets.Remove(data.Stylus.Id);

    collectedPackets.AddRange(data.GetData());

    int[] packets = (int[])(collectedPackets.ToArray(typeof(int)));
    TabletPropertyDescriptionCollection tabletProperties =
        myRealTimeStylus.GetTabletPropertyDescriptionCollection(data.Stylus.TabletContextId);

    Stroke stroke = myInk.CreateStroke(packets, tabletProperties);
    if (stroke != null) 
    {
         stroke.DrawingAttributes.Color = myDynamicRenderer.DrawingAttributes.Color;
         stroke.DrawingAttributes.Width = myDynamicRenderer.DrawingAttributes.Width;
    } 
}

如需顯示 RealTimeStylus 類別更強固用法的範例,包括使用自訂外掛程式建立,請參閱 RealTimeStylus 外掛程式範例

Microsoft.Ink.Renderer

Microsoft.StylusInput.DynamicRenderer

Microsoft.StylusInput.RealTimeStylus

Microsoft.StylusInput.IStylusAsyncPlugin

存取及操作手寫筆輸入