TP

WinForms - Vývoj TabletPC aplikací

Co tento článek ukazuje

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

Published: Saturday, 11 June 2005, 3:03 AM
Author: Tomas Petricek
Typos: Send me a pull request!
Tags: