RealTimeStylus Ink 集合範例
此應用程式會在使用 RealTimeStylus 類別時示範筆跡集合和轉譯。
InkCollection 專案
此範例包含單一方案,其中包含一個專案 InkCollection。 應用程式會 InkCollection
定義包含單一類別的命名空間,也稱為 InkCollection
。 類別繼承自 Form 類別,並實作 IStylusAsyncPlugin 介面。
namespace InkCollection
{
public class InkCollection : Form, IStylusAsyncPlugin
{
//...
InkCollection 類別會定義一組用來指定各種筆跡粗細的私人常數。 類別也會宣告 RealTimeStylus 類別、 myRealTimeStylus
DynamicRenderer 類別和 myDynamicRenderer
Renderer 類別 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
私用實例,會儲存 所收集的 myRealTimeStylus
Stroke物件。
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 的預設值。 這是標準行為。 不過,如果您想要提供由 myDynamicRenderer
所 myRenderer
轉譯的筆跡所呈現的不同外觀,您可以變更 上的 myDynamicRenderer
DrawingAttributes屬性。 若要這樣做,請先取消批註下列幾行,再建置並執行應用程式。
// myDynamicRenderer.DrawingAttributes.PenTip = PenTip.Rectangle;
// myDynamicRenderer.DrawingAttributes.Height = (.5F)*MediumInkWidth;
// myDynamicRenderer.DrawingAttributes.Transparency = 128;
接下來,應用程式會建立 RealTimeStylus 物件,用來接收手寫筆通知,並將 DynamicRenderer 物件新增至同步外掛程式通知佇列。 具體而言, myRealTimeStylus
會將 新增 myDynamicRenderer
至 SyncPluginCollection 屬性。
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列舉定義StylusDown、Packets、StylusUp和Error通知中的興趣。
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 外掛程式範例。
相關主題