WinForms - Vývoj TabletPC aplikací
Co tento článek ukazuje
- Úvodní informace o vývoji aplikací pro platformu TabletPC
- Popis nejdůležitějších třid z namespace
Microsoft.Ink
- Ukázka zpracovávající vstup z pera
Počítače typu TabletPC (s operačním systémem Windows XP TabletPC Edition) umožňují uživateli ovládat systém pomocí stylusu (pera). Na TabletPC lze samozřejmě spouštět všechny normální programy, ale pokud chcete ve vaší aplikaci využít některé výhody, které tato platforma přináší (například rozeznávání rukou psaného textu) mohou se vám hodit informace v tomto článku. Pěkným příkladem aplikace podporující TabletPC je součást Microsoft Office s názvem OneNote [1]. V následujícím článku se dozvíte, že přidat do své .NET aplikace některé funkce pro podporu TabletPC není vůbec tak složité jak se na první pohled zdá.
Pro vývoj aplikací pro TabletPC vám stačí nainstalovat TabletPC SDK [2], které pro instalaci vyžaduje Windows XP nebo Windows 2003. Samotné SDK obsahuje několik ukázkových aplikací, které demonstrují základní operace, které lze na TabletPC provádět.
Kreslení a psaní na TabletPC
Při kreslení nebo psaní na TabletPC se nakreslené objekty ukládají ve vektorovém
formátu. Aplikace může tato data zachytávat a libovolně zpracovávat.
Data jsou označována jako inkoust (Ink
) a lze s nimi pracovat
pomocí managed objektů.
InkCollector
Základní třídou, která přidává do aplikace podporu psaní rukou je třída
InkCollector
. Psaní rukou lze aktivovat na libovolný ovládací prvek
nebo celý formulář. Pokud je InkCollector
aktivní, tak se při pohybu
nad ovládacím prvkem kurzor změní na tečku (tip) a po ovládacím prvku je možno kreslit.
K nakresleným čárám lze přistupovat pomocí objektu InkCollector
a nebo
pomocí událostí (například událost Stroke
je vyvolána poté co uživatel
nakreslí křivku). Následující ukázka umožní psaní po celém formuláři:
// Objekt na zachytavani psani a kresleni private InkCollector inkCollect; private void Form_Load(object sender, EventArgs e) { // Vytvori objekt na zachytavani psanych textu // parametr urcuje ovladaci prvek/form na ktery se ma psat inkCollect = new InkCollector(this.Handle); inkCollect.Enabled = true; }
Kompletní kód naleznete v TabletPC SDK
Rozeznávání rukopisu
Jednou z největších výhod Windows XP TabletPC Edition je rozeznávání rukopisu,
které (bohužel zatím ne v české verzi) dokáže rozeznávat rukou napsaný text.
Pro tuto funkci je již potřeba operační systém pro TabletPC, protože
objekty pro rozpoznávání textu (Recognizers
) nejsou na běžných
systémech k dispozici. Následující ukázka doplňuje předcházející fragment
kódu o metodu, která rozpozná napsaný text:
private void btnRecognize_Click(object sender,EventArgs e) { // Kontrola jestli je dostupny objekt na rozpoznavani Recognizers rec=new Recognizers(); if (rec.Count==0) { MessageBox.Show("Funkce je dostupna pouze na TabletPC."); return; } // Prevest nakreslene cary na text string text=inkCollect.Ink.Strokes.ToString(); MessageBox.Show(text); // Smaze nakreslene cary inkCollect.Ink.DeleteStrokes(); Refresh(); }
Kompletní kód naleznete v TabletPC SDK
V ukázce se nejprve kontroluje zda je v počítači nainstalován nějaký objekt
pro rozeznávání a pokud ano převedou se čáry na text pomocí metody ToString
.
Toto je pouze nejjednodušší příklad. Ke složitějšímu rozeznávání textu lze použít
třídu RecognizerContext
[3], pomocí které lze
rozeznávání ovlivnit a získat více informací o výsledku.
Ukázková aplikace
Následující ukázková aplikace je zaměřená spíše na další zpracování nakreslených čar.
Funguje tak, že uživateli umožní pomocí objektu InkCollector
kreslit
a po nakreslení čáry na ovládací prvek čáru zruší a podle ní vybarví v ovládacím
prvku plochu ohraničenou právě nakreslenou křivku. Funkce TabletPC se tedy
používají pouze při kreslení křivek. To je možná mírně netypický příklad,
ale všechny typické naleznete v SDK a pokud v aplikaci chcete více než rozeznávání
rukou psaného textu, bude další zpracování nakreslených čar potřeba.
Nejprve při inicializaci vytvoříme objekt na kreslení (jako v předcházejícím
příkladě) a ještě bitmapu do které se budou kreslit vyplněné plochy
(drawBox
je ovládací prvek PictureBox
, ve kterém
se tato bitmapa bude zobrazovat).
// Objekt pro zachytavani INK dat InkCollector col; // Bitmapa na kterou se kresli Bitmap tmp; private void Form1_Load(object sender, System.EventArgs e) { // Inicializace bitmapy tmp=new Bitmap(drawBox.Width,drawBox.Height); drawBox.Image=tmp; using(Graphics gr=Graphics.FromImage(tmp)) gr.FillRectangle(Brushes.White,0,0,tmp.Width,tmp.Height); // Inicializace objektu pro zachytavani car col=new InkCollector(drawBox); col.Enabled=true; // Udalost, ktera se vyvola po nakresleni cary col.Stroke+=new InkCollectorStrokeEventHandler(col_Stroke); }
Nyní se ještě podíváme na metodu, která zpracovává nakreslenou křivku.
Získat pole bodů, kterými křivka prochází je poměrně snadné, ale toto
pole obsahuje body ve vyšším rozlišení než je rozlišení obrazovky,
proto je potřeba je před vykreslováním do bitmapy převést
do rozlišení obrazovky. Poté se vyplněná křivka pomocí metody
FillClosedCurve
nakreslí do bitmapy.
// Udalost ke ktere dojde pri nakresleni krivky private void col_Stroke(object sender, InkCollectorStrokeEventArgs e) { // Ziskat body nakreslene krivky a prevest je na pixely Point[] pts=e.Stroke.BezierPoints; // Prevod bodu na rozliseni obrazovky using(Graphics g=CreateGraphics()) col.Renderer.InkSpaceToPixel(g,ref pts); // Vybarvit krivku (cernou barvou) using(Graphics gr=Graphics.FromImage(tmp)) gr.FillClosedCurve(Brushes.Black,pts); // Vymazat nakreslenou caru col.Ink.DeleteStrokes(); drawBox.Refresh(); }
Soubory na stažení a odkazy
- [1] OneNote 2003 Product overview [^]
- [2] TabletPC Software Development Kit 1.7 [^] - Microsoft.com
- [3] RecognizerContext class [^] - MSDN