Entwickeln für den Tablet PC Das Microsoft Tablet PC Platform SDK Frank Prengel, <frankpr@microsoft.com> Technologieberater .NET Strategy & Developer Group Microsoft Deutschland GmbH
Agenda Tablet PC: Hardware & Software Tablet-Funktionalität Stifteingabe Digitale Tinte Schrifterkennung Entwickeln für den Tablet PC Das SDK im Überblick Managed Libraries Design-Richtlinien Zusammenfassung
... und ganz wichtig: Input erbeten! Ihre Ideen Ihre Meinungen Ihre Vorstellungen Ihre Wünsche Ihre Kritik
Back to the Future Der Tablet PC hat viele Vorgänger ...
before it´s railroading time. Was haben wir gelernt? You can´t railroad before it´s railroading time. Robert Heinlein
2002 – der Tablet PC Die gewohnte PC-Infrastruktur: Windows XP Die Mobilität eines Sub-Notebooks Die Flexibilität von Stift + Papier
Agenda Tablet PC: Hardware & Software Tablet-Funktionalität Stifteingabe Digitale Tinte Schrifterkennung Entwickeln für den Tablet PC Das SDK im Überblick Managed Libraries Design-Richtlinien Zusammenfassung
Hardware (1/2) Elektromagnetischer Digitizer unter dem LCD kabelloser Stift erkennt "hovering" kann Neigung & Rotation erkennen Abtastrate > 100 Hz Auflösung > 600 dpi
Hardware (2/2) Tablet-Buttons "Grab and go" Ersatz für CTRL+ALT+DEL UP, DOWN, ENTER, ESCAPE "Grab and go" zuverlässiges Hotplugging Landscape- und Portrait-Darstellung ohne Reboot "Aufwachen" aus dem Stand-By-Modus < 3 Sek. Legacy-free kein PS/2, RS232, LPT, ... USB, Firewire; evtl. (W)LAN, Bluetooth, ...
Software (1/2) Betriebssystem: Microsoft Windows XP Professional Windows XP Service Pack 1 .NET Framework 1.0 SP2 Tablet PC Components Windows XP Professional Tablet PC Compo-nents Service Pack 1
Software (2/2) Tablet-spezifische Software: außerdem verfügbar: Stifteingabe Ink-Steuerelemente Gesten-, Schrift- und Spracherkennung Input Panel Windows Journal Sticky Notes Ink Ball außerdem verfügbar: Microsoft Office XP Pack for Tablet PC Snippet Tool
Agenda Tablet PC: Hardware & Software Tablet-Funktionalität Stifteingabe Digitale Tinte Schrifterkennung Entwickeln für den Tablet PC Das SDK im Überblick Managed Libraries Design-Richtlinien Zusammenfassung
API / Run-Time Interfaces Architektur ... im Überblick: Gestures Ink Recognition Kernel Mode User Mode API / Run-Time Interfaces Recognizers Microsoft (US, JPN, etc.) Gestures, Shapes Others Mouse Driver HID HID Mini Custom Interaktion mit Hardware nur über Gesture-Komponenten
Tablet Input Subsystem Anwendungen erhalten Pen-Input-Daten durch Shared Memory Queue (nicht durch Windows Messages) HID Input Device * WISP = Windows Ink Services for Pen
Gesten System Gestures Application Gestures Hover, Tap, Double-Tap, Tap-and-Hold, etc. emulieren Mausaktionen Application Gestures Backspace, Enter, Scratch-out, etc. Shortcuts für bestimmte Aktionen
Ink Ein erster Test. "digitale Tinte" – so natürlich wie möglich Echtzeitrendern, Bezièrkurven, Anti-Aliasing Drucksensitivität, Stiftformen, subtraktives Farbmischen für handschriftliche Eingabe für visuelles Feedback & Anmerkungen Ein erster Test.
Schrifterkennung sekundär & nicht vollkommen! Texteingabe
Agenda Tablet PC: Hardware & Software Tablet-Funktionalität Stifteingabe Digitale Tinte Schrifterkennung Entwickeln für den Tablet PC Das SDK im Überblick Managed Libraries Design-Richtlinien Zusammenfassung
Entwickeln für den Tablet PC "Think in Ink" Ink als eigenständiger Datentyp kann als solcher gespeichert & verarbeitet werden Schrifterkennung ist kein vollwertiger Tastatur-Ersatz besondere Anforderungen an das User Interface vereinfachte & natürliche Dateneingabe Größe der Controls Entdecke die Möglichkeiten!
Das Tablet PC Platform SDK aktuelle Version: 1.5 unterstützte Plattformen: Windows 2000 Professional SP2 * Windows XP Professional * Windows XP Tablet PC Edition unterstützte Tools: Visual Studio 6.0 SP5 Visual Studio .NET Visual Studio .NET 2003 (* Keine Schrifterkennung. Ohne SDK keine Ink Collection.)
Das Tablet PC Platform SDK Managed (= .NET) APIs für Stift & Ink COM Automation APIs (C/C++, VB6) Ink Controls InkEdit, InkPicture Dokumentation Beispielanwendungen Laufzeitbibliotheken für die Verwendung des SDK auf Nicht-Tablet-PCs
Tablet PC Platform
Das SDK im Überblick
Managed APIs Tablet Input API (Pen API) Ink & Gestures sammeln Pen Buttons abfragen Ink Data Management API (Ink API) Ink speichern & bearbeiten Ink Recognition API (Recognition API) Ink inter- pre- tieren
Objektmodell InkCollector InkOverlay Ink Strokes Stroke Renderer DrawingAttributes Tablet Recognizers Pen API Recognizer Ink API RecognizerContext Reco API
Pen API
Pen API - Überblick Tablet & Tablets Cursor & Cursors Info über verfügbare Digitizer & Input Devices Cursor & Cursors Info über verfügbare (abstrakte) Stiftspitzen InkCollector & InkOverlay Ink aufnehmen & anzeigen Events zu Gesten, Buttons & Tips InkOverlay: Auswahl & Löschen zusätzlich
Tablets Information über vorhandene Digitizer Tip Pressure Winkel zwischen Tablet & Stift Stiftrotation Auflösung Hovering & Abstand Stift-Tablet Cursor-ID Tablet PnP-ID
Die Klasse Tablet wichtige Eigenschaften: wichtige Methoden: HardwareCapabilities CursorMustTouch, CursorsHavePhysicalIds, HardProximity, Integrated MaximumInputRectangle Name PlugAndPlayId wichtige Methoden: IsPacketPropertySupported(System.Guid) GetPropertyMetrics(System.Guid) DeviceWalker
InkCollector Echtzeit-Ink-Input für Anwendungen "Ink Canvas": Region für Input einfach einschalten: InkCollector ic = new InkCollector(Handle); ic.Enabled = true; diverse Events Stroke, Gesture Pen Movement: CursorInRange, CursorButtonDown, NewPackets etc. Mouse Trigger Events: DoubleClick etc. Tablet Hardware Events: TabletAdded, TabletRemoved InkCollector InputWatcher
InkOverlay enthält InkCollector ermöglicht zusätzlich Bearbeiten & Löschen: InkOverlayEditingMode Ink Select: Lasso-Modus für Auswahl, Resizing etc. Delete: Löschmodus EraserMode StrokeErase PointErase ( -> EraserWidth (in 1/100 mm) ) zusätzliche Events: Rendering: Painting, Painted Editing: SelectionChanging, StrokesDeleted etc. HelloInkOverlay
Packets Datenblöcke mit Ink-Information können enthalten (PacketProperty): X, Y, PacketStatus , NormalPressure, RollRotation etc. HW- & treiberabhängig! Anwendung kann angeben, welche Daten sie verwenden möchte: ic.DesiredPacketDescription = new Guid[] { PacketProperty.X, PacketProperty.Y };
Packets anschaulich PacketPropWatcher
Ink API
Ink API Ink, Stroke & Strokes DrawingAttributes Ink-Datenstruktur & einzelne Linienzüge Laden & Speichern aus Streams & Clipboard möglich DrawingAttributes optisches Erscheinungsbild der Linienzüge, wie z.B. Farbe, Transparenz, Linienstärke, Antialiasing
Ink verwaltet, manipuliert & speichert Input von InkCollector & InkOverlay enthält Strokes und Strokes-Collection unterstützt "hit detection" Koordinatensystem: HIMETRIC (Einheit: 0.01mm) Events: InkAdded, InkDeleted
Stroke Stroke: Datensatz, aufgenommen während einer Sequenz Pen Down Pen Move Pen Up Sammlung von Packets besitzt eindeutige ID (int) im Ink-Objekt Achtung: Jede Stiftaktion erzeugt einen Stroke! Nicht jeder Stroke ist sichtbar! besitzt Eigenschaft Deleted (!) Manipulation über das Ink-Objekt: AddStrokesAtRectangle, CreateStroke(Point[] pts), DeleteStroke, DeleteStrokes, ExtractStrokes etc. StrokeIdViewer
Strokes Strokes –Collection gehört zu Ink-Objekt read-only; enthält Verweise auf Stroke-Objekte; kein Ownership Bsp.: InkOverlay.Selection erzeugen: Strokes CreateStrokes(); Strokes CreateStrokes(int[] ids); Methoden: Add, Clear, Remove, Contains etc. Events: StrokesAdded, StrokesDeleted
Ink rendern (1) Klasse Renderer kann Ink-Daten in grafischen Output "übersetzen" unterstützt Zoom, Größenänderungen, Scrollen, Rotation
Ink rendern (2) InkCollector & InkOverlay haben Renderer-Eigenschaft Draw-Methode kann auf Graphics-Objekt oder Device Context zeichnen: void Draw(Graphics g, Stroke s) void Draw(Graphics g, Stroke s, DrawingAttributes da) void Draw(Graphics g, Strokes strokes) void Draw(IntPtr hdc, Stroke s) void Draw(IntPtr hdc, Stroke s, DrawingAttributes da) void Draw(IntPtr hdc, Strokes strokes) Umwandlung HIMETRIC Pixel: InkSpaceToPixel, PixelToInkSpace
Transformationen Verschieben: Move(float dx, dy) Art der Transformation Linienstärke skaliert? object nein view ja Verschieben: Move(float dx, dy) Drehen: Rotate(float deg [, Point pt]) Skalieren: Scale(float fx, fy [, bool scaleWidth]) Transformieren: GetObjectTransform(ref Matrix m) GetViewTransform(ref Matrix m) SetObjectTransform(Matrix m) SetViewTransform(Matrix m) InkMagnify
DrawingAttributes Formatierungsinfos für die Darstellung von Ink: bool AntiAliased Color Color bool FitToCurve: Gerade oder Bézier? float Height: für rechteckige Stiftspitze bool IgnorePressure PenTip PenTip: Ball, Rectangle RasterOperation RasterOperation: CopyPen (normaler Stift), MaskPen (Text Marker) etc. byte Transparency: 0=undurchsichtig, 255=unsichtbar float Width: in HIMETRIC-Einheiten InkFormatter
Strokes für Fortgeschrittene Punkte eines Linienzugs bearbeiten: Point[] Stroke.GetPoints(...) int Stroke.SetPoints(...) Point[] Stroke.GetFlattenedBezierPoints(...) ... Schnittpunkte: float[] SelfIntersections float[] FindIntersections(Strokes sks) StrokeIntersection[] GetRectangleIntersections Packets: int[] GetPacketData(...) int[] GetPacketValuesByProperty(Guid id, ...) ... InkHoles
Schnittpunkte
Hit Testing ... durch Punkte: Strokes Ink.HitTest(Point p, float radius) ... durch Rechtecke: Strokes Ink.HitTest(Rectangle r, float percent) ... durch "Lasso": Strokes Ink.HitTest(Point[] pts, float percent) Strokes Ink.HitTest(Point[] pts, float percent, out Point[] arrLassoPts) nächste Punkte: Stroke Ink.NearestPoint(Point p, ...) float Stroke.NearestPoint(Point p, ...)
Ink serialisieren speichern: byte[] Ink.Save(PersistenceFormat f, CompressionMode c) f: Base64Gif, Base64InkSerializedFormat, Gif, InkSerializedFormat (ISF) c: Default, Maximum, NoCompression nur für ISF laden: void Ink.Load(byte[] inkData) Strokes-Collection speichern: Ink.CustomStrokes(String name, Strokes sks) Zusatzdaten speichern: ExtendedProperties (für Ink, Stroke) Id, Data Serialization
Ink ins Clipboard kopieren: IDataObject Ink.ClipboardCopy(...) einfügen: Strokes Ink.ClipboardPaste(...) testen: bool Ink.CanPaste(...)
Recognition API
Recognition API Recognizer RecognizerContext RecognitionResult repräsentiert eine Recognition Engine normalerweise sprachspezifisch RecognizerContext Unterstützung für den Recognizer bzgl. des zu erkennenden Inhalts RecognitionResult erkannter Text & mögliche Alternativen
Recognizer synchrone oder asynchrone Umwandlung von Ink in Text Input: Strokes-Collection eines Ink-Objekts Output: RecognitionResult mit möglichen Textwerten verschiedene Recognizer können verschiedene Sprachen oder Zwecke unterstützen nicht nur Text kann erkannt werden: Formen, Noten, etc. möglich Anwendungsgesten – Ink-basiert z.Zt. 8 Sprachen unterstützt US English, International English, Japanisch, Deutsch, Französisch, Simplified & Traditional Chinese, Koreanisch
Synchron vs Asynchron auch "Vordergrund" vs "Hintergrund" Erkennung im selben Thread wie die Anwendung? asynchron: bei zeitkritischen Anwendungen oder großen Mengen von Ink schwieriger zu programmieren Mittelweg: Teilerkennung ("partial recognition") Recognizer startet, sobald Ink verfügbar ist, korrigiert Ergebnis laufend meist in eigenem Thread
Zuverlässigkeit Texterkennung ist nicht einfach & selten eindeutig! Recognizer liefert nicht nur Textstring, sondern auch Aussagewahrscheinlichkeit ("confidence level") Alternativvorschläge zugehörige Strokes Anwendung sollte Korrektur-UI anbieten
Texterkennung für Einsteiger Ink.Strokes.ToString() nutzt Default Recognizer liefert wahrscheinlichstes Ergebnis synchrone Erkennung für komplettes Ink InkRecognition
Gesten erkennen 38 Application Gestures ScratchOut, Triangle, ArrowUp, ... CollectionMode.InkAndGesture / GestureOnly Ereignis: Gesture auswerten oder InkCollectorGestureEventArgs.Cancel=true Stroke-Event feuert Methode SetGestureStatus legt fest, welche Gesten erkannt werden sollen alle erkennen: ApplicationGesture.AllGestures
Erkennung nichttrivial Recognizer-Objekt zur Steuerung der Texterkennung Eigenschaft Capabilities ArbitraryAngle, DownAndLeft etc. Collection Recognizers liefert verfügbare Recognizer GetDefaultRecognizer RecognizerContext für spezifische Texterkennung Modus: RecognitionFlags Input-Typ, Wortlisten etc.
RecognizerContext nutzen Objekt erstellen (Recognizer.CreateRecognizerContext()) evtl. Eigenschaften setzen Strokes übergeben evtl. EndInkInput() aufrufen erkennen: RecognizerContext.Recognize(out RecognitionStatus rs) liefert RecognitionResult-Objekt TopString-Eigenschaft gibt wahrscheinlichstes Ergebnis BackGroundRecognize() für asynchrone Erkennung
Alternativen nutzen RecognitionAlternate-Klasse liefert Infos zu Interpretationsmöglichkeiten RecognitionResult.TopAlternate für wahrscheinlichsten Treffer GetAlternatesFromSelection() für weitere Möglichkeiten RecoProposition
Text & Ink verbinden Resultate können mit dem Ink-Objekt gespeichert werden Eigenschaft Strokes.RecognitionResult kann über RecognitionResult.SetStrokesResult() gesetzt werden
Erkennung verbessern Eigenschaft Factoid des RecognizerContext-Objekts gibt Hinweis darauf, was erkannt werden soll: recoCtxt.Factoid="EMAIL|WEB" Factoids sind Strings DIGIT, DEFAULT, CURRENCY, DATE etc. Eigenschaft Wordlist enthält Sammlung von Strings, welche bevorzugt erkannt werden sollen: WordList wl=new WordList(); wl.Add("Gugelhupf"); recoCtxt.WordList=wl; RecognitionOption
Ink Controls
Überblick Steuerelemente für Windowsanwendungen InkEdit InkPicture ähnlich RichText-Controls, zusätzlich Ink Input & Texterkennung Versionen für .NET, ActiveX, Win32 InkPicture ähnlich InkCollector, InkOverlay Ink auf Bildern (JPG, BMP, PNG, GIF) Versionen für .NET & ActiveX
InkEdit Eigenschaften: Methoden: InkMode: InkAndGesture, Ink, Disabled Status: Idle, Collecting, Recognizing InkInsertMode: InsertAsText, InsertAsInk DrawingAttributes UseMouseForInput (bool) Cursor (Maus-Cursor!) Methoden: Ink[] SelInks() InkDisplayMode SelInksDisplayMode() Ink, Text InkEditDemo
Erkennung beeinflussen Recognizer-Eigenschaft für detaillierte Einstellungen Factoid-Eigenschaft verfügbar RecoTimeout: Wartezeit vor Umsetzung Erkennung manuell starten: Recognize() Gesture-Ereignis und SetGestureStatus() für Gestenerkennung Default: DownLeft[Long] (Return), UpRight[Long] (Tab), Right (Space), Left (Bkspc)
InkPicture Kombination aus InkOverlay und PictureBox InkEnabled statt (InkOverlay.)Enabled PaperForm
Neu in Version 1.5 PenInputPanel Divider frei programmierbarer Eingabebereich unterstützt TSF & Korrektur Divider Ink-Analyse, Trennung von Text & Grafik PIPSerialization
Designrichtlinien visuelle Kennzeichnung von Eingabebereichen DPI-Abhängigkeit Bildschirmorientierung (1024x768 768x1024) Modalität (Schreiben, Löschen, Zeigen, …) expliziter Wechsel & Zustandsanzeige Ergonomie Zielen: Bereiche <5mm schwer zu treffen Auswählen: Lasso-Tool Hovering: spezielle Version von COMCTL32.DLL
Designrichtlinien Parallaxe durch Bildschirmdicke & Lichtbrechung Kalibrierung Rechts-/Linkshänder (Menüs!) Performancefragen für natürlich wirkendes Schreiben
Agenda Tablet PC: Hardware & Software Tablet-Funktionalität Stifteingabe Digitale Tinte Schrifterkennung Entwickeln für den Tablet PC Das SDK im Überblick Managed Libraries Design-Richtlinien Zusammenfassung
Zusammenfassung Ink ist das grundlegende Objekt in stiftbasierten Anwendungen. Das SDK bietet umfangreiche & komfortable Möglichkeiten zur Manipulation von Ink, zur Analyse & Schrifterkennung. Für Standardaufgaben stehen Ink Controls zur Verfügung. Es bestehen besondere Anforderungen an das UI-Design.
Fragen!? Uff...
Buchempfehlung Rob Jarrett, Philip Su “Building Tablet PC Applications” Microsoft Press 2003 ISBN 0-7356-1723-6
Weiterführende Infos Tablet PC Platform SDK http://msdn.microsoft.com/downloads/default.asp?url= /downloads/sample.asp?url=/MSDN-FILES/027/002/015/msdncompositedoc.xml Tablet Developer Info @ Microsoft http://www.microsoft.com/windowsxp/tabletpc/ developers/default.asp Tablet PC Developer Community http://www.tabletpcdeveloper.com/
Slides & Demos http://www.frankpr.de/ Vielen Dank!