04.08.2013 Aufrufe

Erstellen von Tablet PC-Anwendungen mit VFP - dFPUG-Portal

Erstellen von Tablet PC-Anwendungen mit VFP - dFPUG-Portal

Erstellen von Tablet PC-Anwendungen mit VFP - dFPUG-Portal

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<strong>Erstellen</strong> <strong>von</strong> <strong>Tablet</strong> <strong>PC</strong>-<strong>Anwendungen</strong> <strong>mit</strong> Visual<br />

FoxPro<br />

Mike Stewart, Visual FoxPro Team, Microsoft Corporation<br />

Erfahren Sie, wie Sie in Visual FoxPro-<strong>Anwendungen</strong> das Microsoft® <strong>Tablet</strong> <strong>PC</strong> Platform<br />

SDK einsetzen, um <strong>mit</strong> „digitaler Tinte“ zu arbeiten, handschriftliche Eingaben zu<br />

akzeptieren, die durch <strong>Tablet</strong> <strong>PC</strong>-Steuerelemente ausgelösten Ereignisse zu behandeln<br />

und die „Tinte“ in Dateien dauerhaft zu speichern.<br />

Einführung<br />

Die Steuerelemente und APIs, die erforderlich<br />

sind, um viele der Ink-Features der<br />

Microsoft Windows® <strong>Tablet</strong> <strong>PC</strong> Edition<br />

nutzen zu können, finden Sie im <strong>Tablet</strong> <strong>PC</strong><br />

Platform SDK. Das <strong>Tablet</strong> <strong>PC</strong> Platform<br />

SDK können Sie <strong>von</strong> http://www.microsoft.com/windowsxp/tabletpc/developers/<br />

default.asp herunterladen. Es stellt die Ink-<br />

Objekte auf zwei Arten bereit: über die<br />

Component Object Model (COM) Automation,<br />

sowie über die Common Language<br />

Runtime (CLR) des Microsoft .NET Frameworks<br />

über managed APIs. Da Visual<br />

FoxPro nicht in die CLR kompiliert, konzentriert<br />

sich dieser Artikel auf die COM<br />

Automation APIs.<br />

Der <strong>Tablet</strong> <strong>PC</strong> betrachtet Ink anders als frühere<br />

Geräte, die ebenfalls Ink als Funktionalität<br />

umfassten. Bei früheren Geräten wie<br />

dem Apple Newton oder Microsoft Windows<br />

CE/Pocket <strong>PC</strong>-Geräten lag der<br />

Schwerpunkt auf der Erkennung <strong>von</strong> Ink als<br />

Handschrift. Beim <strong>Tablet</strong> <strong>PC</strong> hat sich diese<br />

Philosophie geändert, so dass Ink jetzt als<br />

Dateneingabe betrachtet wird, die Umwandlung<br />

in Text wird als zweiter Schwerpunkt<br />

betrachtet. Beispielsweise können Sie Notizen<br />

im Windows Journal, da im <strong>Tablet</strong> <strong>PC</strong><br />

und Microsofts OneNote enthalten ist, erfassen,<br />

ohne dass es erforderlich ist, diese<br />

Notizen in Text umzuwandeln. Das bedeutet,<br />

dass die Erkennungsfähigkeiten des<br />

<strong>Tablet</strong> <strong>PC</strong>s sehr gut sind, und dass für den<br />

Fall, dass Sie Ink in Text umwandeln müs-<br />

sen, eine sehr hohe Erkennungsquote erreicht<br />

wird.<br />

Die für <strong>VFP</strong>-Entwickler interessanten Objekte<br />

sind InkEdit, InkPicture und InkOverlay.<br />

Das Steuerelement InkEdit entspricht<br />

der Editbox <strong>von</strong> <strong>VFP</strong>. Der Unterschied besteht<br />

darin, dass InkEdit digitale Tinte akzeptiert<br />

und erkennt. Das Steuerelement<br />

InkPicture ist genau das, was Sie erwarten: in<br />

diesem Steuerelement kann ein Bild platziert<br />

werden und der Anwender kann <strong>mit</strong> der digitalen<br />

Tinte auf diesem Bild malen. Das<br />

Steuerelement liegt unsichtbar über einem<br />

Fenster und kann Ink annehmen und verarbeiten.<br />

Anforderungen an das System<br />

• Microsoft <strong>Tablet</strong> <strong>PC</strong> Platform SDK<br />

• Microsoft Windows XP. Sie können<br />

das <strong>Tablet</strong> <strong>PC</strong> Platform SDK auch auf<br />

Microsoft Windows XP einsetzen, aber<br />

die Microsoft XP <strong>Tablet</strong> <strong>PC</strong> Edition ist<br />

dringend empfohlen.<br />

• Microsoft Visual FoxPro 8.0 oder höher.<br />

Es ist auch <strong>mit</strong> früheren Versionen<br />

<strong>von</strong> <strong>VFP</strong> möglich, nahezu alle Funktionalitäten<br />

des <strong>Tablet</strong> <strong>PC</strong> Platform SDK<br />

zu nutzen. Allerdings sind in <strong>VFP</strong> 8.0<br />

verschiedene Bugs, die die Zusammenarbeit<br />

<strong>mit</strong> der Microsoft XP <strong>Tablet</strong> <strong>PC</strong><br />

Edition betreffen, beseitigt worden.<br />

• Digitizer. Verschiedene Hersteller bieten<br />

Digitizer für die USB-Schnittstelle<br />

06-28 <strong>Tablet</strong> <strong>PC</strong>-<strong>Anwendungen</strong> <strong>mit</strong> <strong>VFP</strong> FoxX-Professional 16 Seite 1


an, beispielsweise Wacom (http://<br />

www.wacom.com) oder es können <strong>Anwendungen</strong><br />

entwickelt werden, die den<br />

eingebauten Digitizer eines <strong>Tablet</strong> <strong>PC</strong>x<br />

einsetzen.<br />

A) Nur auf einem <strong>Tablet</strong> <strong>PC</strong>?<br />

Das <strong>Tablet</strong> <strong>PC</strong> Platform SDK erfordert lediglich<br />

Microsoft Windows XP. Allerdings<br />

wird die Funktionalität der Steuerelemente<br />

durch den Einsatz <strong>von</strong> Windows XP <strong>Tablet</strong><br />

<strong>PC</strong> Edition signifikant erweitert. Ist das SDL<br />

nicht auf einem <strong>Tablet</strong> <strong>PC</strong> installiert, ist keine<br />

Erkennungsengine vorhanden und einige<br />

Steuerelemente akzeptieren kein Ink. Es ist<br />

also ratsam, wenn Sie zumindest zum Testen<br />

und Debuggen Zugriff auf einen <strong>Tablet</strong> <strong>PC</strong><br />

haben.<br />

Im Idealfall können Sie Ihre <strong>Anwendungen</strong><br />

auf einem <strong>Tablet</strong> <strong>PC</strong> codieren und debuggen.<br />

Aber wer will schon Code <strong>mit</strong> einem<br />

Stift schreiben? Auch die Tastaturen, über<br />

die einige <strong>Tablet</strong> <strong>PC</strong>s verfügen, haben nicht<br />

#define SM_TABLET<strong>PC</strong> 86<br />

Declare Integer GetSystemMetrics in Win32API Integer<br />

retVal = GetSystemMetrics(SM_TABLET<strong>PC</strong>)<br />

If retVal 0<br />

Wait Window "Running on a <strong>Tablet</strong> <strong>PC</strong>"<br />

Else<br />

Wait Window "*Not* running on a <strong>Tablet</strong> <strong>PC</strong>"<br />

Endif<br />

Ein Rückgabewert ungleich 0 zeigt allerdings<br />

noch nicht an, ob alle Komponenten des<br />

<strong>Tablet</strong> <strong>PC</strong> installiert sind und funktionieren.<br />

Um festzustellen, ob eine Komponente in-<br />

Ein Beispiel:<br />

Try<br />

oInkEdit = Newobject("InkEd.InkEdit.2")<br />

Catch To oException<br />

Wait Window "InkEdit control is not installed!"<br />

Endtry<br />

Ein <strong>Tablet</strong> <strong>PC</strong> kann über zwei Anzeigemodi<br />

verfügen: Quer- und Hochformat. Meist<br />

wird das Querformat genutzt, wenn der<br />

<strong>Tablet</strong> <strong>PC</strong> angedockt ist oder als Standard-<br />

die volle Größe. Es gibt verschiedene Möglichkeiten,<br />

um dieses Problem zu umgehen.<br />

Eine Möglichkeit besteht darin, eine USB-<br />

Tastatur und -Maus einzusetzen (oder Sie<br />

nutzen eine Dockingstation, falls für Ihren<br />

<strong>Tablet</strong> <strong>PC</strong> eine solche verfügbar ist). Eine<br />

andere Möglichkeit besteht darin, das Feature<br />

Remote Desktop <strong>von</strong> Windows XP zu<br />

verwenden, um <strong>mit</strong> einem Desktop-Rechner<br />

auf den <strong>Tablet</strong> <strong>PC</strong> zuzugreifen.<br />

Entscheidungen zum Design<br />

Eine häufig gestellte Frage lautet: „Woher<br />

weiß ich, ob meine Anwendung auf einem<br />

<strong>Tablet</strong> <strong>PC</strong> ausgeführt wird?“ Die Antwort<br />

erhalten Sie durch einen Aufruf der<br />

Win32®-Funktion GetSystemMetrics <strong>mit</strong><br />

dem Parameter SM_TABLET<strong>PC</strong>(86). Ein<br />

Rückgabewert ungleich 0 zeigt an, dass<br />

Windows XP <strong>Tablet</strong> <strong>PC</strong> Edition ausgeführt<br />

wird; der Rückgabewert 0 zeigt an, dass dies<br />

nicht der Fall ist.<br />

stalliert ist, versuchen Sie, eine Instanz der<br />

Komponente zu erstellen und prüfen Sie<br />

dabei auf Fehler während der Erstellung.<br />

Laptop eingesetzt wird; im Hochformat wird<br />

er genutzt, wenn er als <strong>Tablet</strong> eingesetzt<br />

wird.<br />

06-28 <strong>Tablet</strong> <strong>PC</strong>-<strong>Anwendungen</strong> <strong>mit</strong> <strong>VFP</strong> FoxX-Professional 16 Seite 2


Abbildung 1. Das Querformat.<br />

Abbildung 2. Das Hochformat.<br />

Es kann vorkommen, dass Ihre Anwendung<br />

feststellen muss, ob der <strong>Tablet</strong> <strong>PC</strong> des Anwenders<br />

im Hoch- oder im Querformat ausgeführt<br />

wird, da<strong>mit</strong> die Größe der Bildschirmelemente<br />

entsprechend angepasst<br />

wird. Durch den Einsatz der Funktion<br />

SYSMETRIC() <strong>von</strong> <strong>VFP</strong> <strong>mit</strong> den Parametern<br />

1 oder 2 können Sie die Breite und Höhe<br />

der Anzeige feststellen. Ist die Breite geringer<br />

als die Höhe, befindet sich der <strong>Tablet</strong><br />

<strong>PC</strong> im Hochformat.<br />

Sie müssen beim Design Ihrer Anwendung<br />

noch weitere Entscheidungen treffen. Lesen<br />

Sie in der Hilfedatei des <strong>Tablet</strong> <strong>PC</strong> SDKs<br />

den Eintrag „Planning Your Application“.<br />

Tinte sammeln<br />

Die einfachste Möglichkeit, Eingaben per<br />

Stift entgegenzunehmen, ist der Einsatz des<br />

Objekts InkCollector, das durch das <strong>Tablet</strong><br />

<strong>PC</strong> Platform SDK zur Verfügung gestellt<br />

wird. Es ist extrem einfach einzusetzen und<br />

erfordert lediglich drei einfache Schritte zum<br />

Einrichten und Aktivieren. InkCollector<br />

wird einem Formular über das Windows-<br />

Handle (hWnd) des Formulars hinzugefügt<br />

und ermöglicht dem gesamten Formular die<br />

Eingabe per Stift.<br />

B) Ink Collection auf einem<br />

Formular ermöglichen<br />

1. <strong>Erstellen</strong> Sie ein neues Objekt <strong>mit</strong> dem<br />

InkCollector.<br />

2. Fügen Sie dem Windows-Handle des<br />

Formulars den InkCollector hinzu.<br />

3. Aktivieren sie den InkCollector, indem<br />

Sie dessen Eigenschaft Enabled auf .T.<br />

setzen.<br />

Führen Sie den folgenden Code aus und<br />

starten Sie die Eingabe per Stift.<br />

06-28 <strong>Tablet</strong> <strong>PC</strong>-<strong>Anwendungen</strong> <strong>mit</strong> <strong>VFP</strong> FoxX-Professional 16 Seite 3


Local oInkCollector as MSINKAUT.inkcollector.1<br />

Local oForm1 as Form<br />

oForm1 = NewObject("form")<br />

*-- Create a new InkCollector, and set the<br />

*-- window handle to be the form on which<br />

*-- we want to work with the InkCollector<br />

oInkCollector = NewObject("msinkaut.inkcollector.1")<br />

oInkCollector.hWnd = oForm1.HWnd<br />

*-- That's it, we're done setting it up. Enable<br />

*-- the InkCollector so we can start using it.<br />

oInkCollector.Enabled = .t.<br />

*-- InkCollector is turned on, show the form<br />

oForm1.Show<br />

Read Events<br />

Beachten Sie, dass dies der <strong>Tablet</strong> <strong>PC</strong>-spezifische Code ist:<br />

oInkCollector = NewObject("msinkaut.inkcollector.1")<br />

oInkCollector.hWnd = oForm1.HWnd<br />

Wenn Sie das Windows Journal eingesetzt<br />

haben, werden Sie eventuell erwarten, dass<br />

Sie in einer <strong>Tablet</strong> <strong>PC</strong>-Anwendung die Möglichkeit<br />

haben, Ink zu markieren, zu ändern<br />

und zu löschen. Wenn Sie das Objekt Ink-<br />

Collector einsetzen, können Sie auf Ihrem<br />

Formular zeichnen, das Geschriebene akzeptieren<br />

und die Ink anschließend löschen. Allerdings<br />

können Sie die Methode InkCollector<br />

in Ihrer <strong>VFP</strong>-Anwendung nicht einsetzen,<br />

um Ink zu markieren, zu ändern oder<br />

zu löschen. Dafür setzen Sie die Klasse InkOverlay<br />

ein. InkOverlay ist ein erweitertes<br />

InkCollector, so dass Sie über die vollständige<br />

Funktionalität verfügen.<br />

*-------------------------------------<br />

*-- Program: InkOl1.prg<br />

*--<br />

*-- Author: Mike Stewart<br />

*-- Comments: Simple InkOverlay demo using an<br />

*-- InkOverlay class with a recognizer<br />

*-- button.<br />

*-------------------------------------<br />

PUBLIC oform1<br />

oform1=NEWOBJECT("InkOverlayDemo1")<br />

oform1.Show<br />

RETURN<br />

DEFINE CLASS InkOverlayDemo1 AS form<br />

Top = 0<br />

Left = 0<br />

Height = 416<br />

Width = 659<br />

DoCreate = .T.<br />

Caption = "Form1"<br />

Name = "Form1"<br />

ADD OBJECT inkRecognize AS Commandbutton WITH ;<br />

C) Die Klasse InkOverlay<br />

Der Einsatz der Klasse InkOverlay ist so<br />

einfach wie der Einsatz der Klasse InkCollector.<br />

Aufgrund der zusätzlichen Funktionalitäten<br />

ist aber bei dieser Klasse einiges<br />

mehr zu beachten. Beginnen wir <strong>mit</strong> einem<br />

einfachen Formular, das InkOverlay enthält<br />

und das die Möglichkeit hinzufügt, festzustellen,<br />

was der Anwender schreibt. Beachten<br />

Sie, dass Sie, um die Schaltfläche Recognize<br />

zu betätigen, Alt-R betätigen müssen.<br />

Gleich erfahren Sie, weshalb dies so ist.<br />

06-28 <strong>Tablet</strong> <strong>PC</strong>-<strong>Anwendungen</strong> <strong>mit</strong> <strong>VFP</strong> FoxX-Professional 16 Seite 4


Top = 368, ;<br />

Left = 20, ;<br />

Caption = "\


Mit nur 38 Zeilen Code verfügen wir über<br />

ein funktionierendes Formular, das Ink akzeptiert<br />

und das die Fähigkeit besitzt, die<br />

Eingabe zu erkennen und sie in ein Steuerelement<br />

<strong>von</strong> <strong>VFP</strong> zu schreiben, das an ein<br />

Feld gebunden ist und dessen Wert in eine<br />

Tabelle geschrieben werden kann.<br />

Wenn Sie den oben stehenden Code ausführen,<br />

werden Sie festgestellt haben, dass es<br />

schwierig war, <strong>mit</strong> dem Stift oder der Maus<br />

auf die Schaltfläche Recognize zu klicken.<br />

Dies liegt daran, dass das gesamte Formular<br />

umfasst wird, wenn Sie ihm das Objekt InkOverlay<br />

hinzufügen. Dieses Verhalten entspricht<br />

dem der Klasse InkCollector. Offen-<br />

Procedure SetRectangle<br />

LOCAL oInkRectangle as MSINKAUT.inkrectangle<br />

oInkrectangle = NEWOBJECT("msinkaut.inkrectangle")<br />

*-- Set the bottom of the rectangle<br />

*-- to be the top of the editbox.<br />

*-- Doing this means the InkOverlay<br />

*-- will not overlap our controls.<br />

oInkRectangle.Bottom = thisform.edtRecognized.Top<br />

*-- The rest of the dimensions of the<br />

*-- rectangle will match those of the<br />

*-- form.<br />

oinkrectangle.Top = thisform.Top<br />

oinkrectangle.Left = thisform.Left<br />

oinkrectangle.Right = thisform.Width - thisform.Left<br />

*-- Call the method by passing our InkRectangle<br />

*-- and we're done.<br />

ThisForm.InkOverlay.SetWindowInputRectangle(oInkRectangle)<br />

sichtlich klappt dies bei den meisten <strong>Anwendungen</strong><br />

nicht, da der Großteil der Formulare<br />

Textboxen und andere Steuerelemente<br />

enthält, in denen die Eingaben der Benutzer<br />

aufgenommen werden.<br />

Für dieses Problem gibt es eine einfache Lösung.<br />

Sie besteht darin, für InkOverlay ein<br />

Rechteck zu definieren. Das <strong>Tablet</strong> <strong>PC</strong> Platform<br />

SDK stellt für genau diesen Zweck das<br />

Objekt InkRectangle und die Methode InkOverlay.SetWindowInputRectangle<br />

bereit.<br />

Die Änderungen am oben stehenden Code<br />

sind minimal. Zunächst einmal erstellen Sie<br />

<strong>mit</strong> dem folgenden Code die Methode<br />

SetRectangle.<br />

Anschließend rufen Sie diese Methode aus der Methode Init des Formulars heraus auf:<br />

.AttachMode = 1 && IOAM_InFront<br />

this.setrectangle<br />

Führen Sie den Code aus und Sie werden<br />

feststellen, dass der Eingabebereich für den<br />

Stift jetzt auf den Bereich der Editbox beschränkt<br />

ist.<br />

Eine andere Lösung besteht darin, die Eigenschaft<br />

InkOverlay.AttachMode auf 0<br />

(IOAM_Behind) zu setzen. Da<strong>mit</strong> wird InkOverlay<br />

hinter den Steuerelementen auf<br />

dem Formular platziert, so dass Sie die Steuerelemente<br />

wie normal nutzen können. Ein<br />

Problem dieser Lösung besteht darin, dass<br />

der Anwender zwischen den Steuerelementen<br />

schreiben kann, aber nicht auf ihnen.<br />

Eine <strong>mit</strong> der Methode SetInputWindowTectangle<br />

gut definierte Inking-Oberfläche<br />

könnte für Ihre Anwender die bessere Lösung<br />

sein.<br />

Auswählen und Löschen <strong>von</strong> Ink<br />

Der folgende Code zeigt, wie eine Combobox<br />

für die Auswahl zwischen drei Cursorn<br />

hinzugefügt wird:<br />

• Ink Cursor – für Zeichnen und<br />

Schreiben.<br />

• Selection Lasso – eingesetzt für die<br />

Markierung <strong>von</strong> Ink.<br />

• Eraser – eingesetzt für das Löschen<br />

<strong>von</strong> Ink.<br />

06-28 <strong>Tablet</strong> <strong>PC</strong>-<strong>Anwendungen</strong> <strong>mit</strong> <strong>VFP</strong> FoxX-Professional 16 Seite 6


Zunächst fügen Sie der Klassendefinition eine Combobox hinzu:<br />

ADD OBJECT inkPenType AS combobox WITH ;<br />

RowSourceType = 1, ;<br />

RowSource = "Ink,Select,Delete", ;<br />

Height = 24, ;<br />

Left = 36, ;<br />

Top = 428, ;<br />

Width = 168, ;<br />

Name = "inkPenType"<br />

Jetzt fügen Sie dem Ereignis InteractiveChange der Combobox den folgenden Code hinzu, um<br />

die Eigenschaft EditingMode auf der Basis der Auswahl des Anwenders einzustellen:<br />

PROCEDURE inkPenType.InteractiveChange<br />

DO Case<br />

CASE this.Value = "Ink"<br />

thisform.inkoverlay.EditingMode = 0 && IOEM_Ink<br />

CASE this.Value = "Select"<br />

thisform.inkoverlay.EditingMode = 2 && IOEM_Select<br />

CASE this.Value = "Delete"<br />

thisform.inkoverlay.EditingMode = 1 && IOEM_Delete<br />

*-- Lastly, set the EraserMode based on<br />

*-- whether entire strokes should be erased<br />

*-- when the pen touches the screen,<br />

*-- or if pixels should be erased:<br />

*-- Set EraserMode to 0 to erase strokes,<br />

*-- or 1 to erase pixels<br />

*-- thisform.inkoverlay.EraserMode = 0<br />

thisform.Inkoverlay.EraserMode = 1<br />

ENDCASE<br />

ENDPROC<br />

Durch eine Auswahl der entsprechenden<br />

Option in der Combobox kann der Anwender<br />

jetzt das Verhalten des Stifts ändern.<br />

Speichern und Laden <strong>von</strong> Ink<br />

Vermutlich will der Anwender das <strong>von</strong> ihm<br />

Geschriebene speichern und zu einem späteren<br />

Zeitpunkt neu laden.<br />

ADD OBJECT cmdSave AS commandbutton WITH ;<br />

Top = 360, ;<br />

Left = 357, ;<br />

Height = 27, ;<br />

Width = 84, ;<br />

Caption = "\


Das Ink-Objekt des InkOverlay nutzt seine<br />

Methode Save, um ein Byte-Array zurückzugeben,<br />

das das Ink auf dem InkOverlay repräsentiert.<br />

Mit Hilfe <strong>von</strong> FoxPros Funktion<br />

STRTOFILE() kann dieses Byte-Array (das<br />

PROCEDURE cmdLoad.Click<br />

lsInk = CREATEBINARY(FILETOSTR(GETFILE("isf")))<br />

thisform.inkoverlay.Enabled = 0<br />

thisform.inkoverlay.ink.Load(lsInk)<br />

thisform.inkoverlay.Enabled = 1<br />

FoxPro als String behandelt) anschließend<br />

auf der Festplatte gespeichert werden.<br />

Um das gespeicherte Ink-Objekt über die<br />

Schaltfläche Load neu zu laden, nutzen Sie<br />

die Methode Ink.Load:<br />

*--Tell control to redraw, or changes will not be made visible.<br />

*-- Use the InkRectangle object we<br />

*-- created during form Init.<br />

ThisForm.inkoverlay.Draw(ThisForm.InkRectangle)<br />

ENDPROC<br />

Beachten Sie den Einsatz der Funktion<br />

CREATEBINARY(), wenn die Ink-Datei in<br />

eine FoxPro-Variable eingelesen wird. Dies<br />

ist erforderlich, um sie in ein Format zu<br />

bringen, die das Objekt InkOverlay akzeptiert.<br />

Beachten Sie auch, dass das InkOverlay<br />

zunächst deaktiviert werden muss, bevor das<br />

Ink geladen wird. Andernfalls würde ein<br />

Fehler auftreten.<br />

Versuchen Sie folgendes: Speichern Sie etwas<br />

Ink in einer Datei, beenden Sie das<br />

Formular, führen es erneut aus und laden Sie<br />

das <strong>von</strong> Ihnen erstellte Ink. Jetzt klicken Sie<br />

auf die Schaltfläche Recognize. Das InkOverlay<br />

erkennt das Ink! Dies liegt daran, dass<br />

das InkOverlay nicht nur die Position der<br />

Pixel speichert, so dass es später erneut angezeigt<br />

werden kann, sondern es werden<br />

auch die Metadaten gespeichert, die für die<br />

Erkennung erforderlich sind.<br />

Was ist in diesen Metadaten enthalten? Die<br />

Metadaten der Datei enthalten Informationen<br />

wie das Datum und den Zeitstempel<br />

sowie auch eine eindeutige Identifizierung<br />

für jeden Stich.<br />

Das Steuerelement InkEdit<br />

Abbildung 4. Hinzufügen eines Microsoft InkEdit-Steuerelements auf einem Formular.<br />

Das Steuerelement InkEdit ist ein erweitertes<br />

RichText-Steuerelement. Es wurde entworfen,<br />

um eine einfache Möglichkeit zu<br />

schaffen, Ink zu akzeptieren, anzuzeigen und<br />

zu erkennen. Um ein Steuerelement InkEdit<br />

auf einem <strong>VFP</strong>-Formular zu implementieren,<br />

ziehen Sie ein ActiveX-Steuerelement<br />

<strong>von</strong> der Steuerelemente-Toolbar des Formulars.<br />

Wenn Sie danach gefragt werden, markieren<br />

Sie das InkEdit-Steuerelement.<br />

06-28 <strong>Tablet</strong> <strong>PC</strong>-<strong>Anwendungen</strong> <strong>mit</strong> <strong>VFP</strong> FoxX-Professional 16 Seite 8


Wenn Sie das Formular ausführen, akzeptiert<br />

das Steuerelement InkEdit das Ink und<br />

erkennt es nach der vorgegebenen Zeit <strong>von</strong><br />

200 Millisekunden. Sie können die Zeit bis<br />

zur Erkennung über die Eigenschaft RecognitionTimeout<br />

des Steuerelements InkEdit<br />

ändern. InkEdit verfügt über in der Eigenschaft<br />

Text über den Vorgabewert „Olecontrol1“,<br />

was Sie aber später auf einfache<br />

Weise ändern können.<br />

Abbildung 5. Vor der Erkennung.<br />

Abbildung 6. Nach der Erkennung.<br />

PUBLIC ofrminkpicture<br />

ofrminkpicture=NEWOBJECT("frminkpicture")<br />

ofrminkpicture.Show<br />

RETURN<br />

DEFINE CLASS frminkpicture AS form<br />

Top = 0<br />

Left = 0<br />

Height = 460<br />

Width = 469<br />

DoCreate = .T.<br />

Caption = "InkPicture Form"<br />

AllowOutput = .F.<br />

Name = "frmInkPicture"<br />

ADD OBJECT olecontrol1 AS olecontrol WITH ;<br />

Top = 12, ;<br />

Left = 7, ;<br />

Height = 444, ;<br />

Width = 360, ;<br />

OleClass = "msinkaut.inkpicture.1"<br />

OleLCID = "1033"<br />

Da das Steuerelement InkEdit auf dem<br />

Steuerelement RichText basiert, können die<br />

Anwender Eingaben im Steuerelement InkEdit<br />

vornehmen, genau wie sie es <strong>von</strong> der<br />

Standard-Textbox oder -Editbox gewohnt<br />

sind. Durch den Einsatz des Steuerelements<br />

InkEdit können Sie <strong>Anwendungen</strong> erstellen,<br />

die dem Anwender die Option eröffnen, Daten<br />

wahlweise <strong>mit</strong> der Tastatur oder <strong>mit</strong> dem<br />

Stift einzugeben.<br />

Das Steuerelement InkPicture<br />

Das Steuerelement InkPicture kombiniert<br />

die meisten der Attribute des Steuerelements<br />

InkOverlay <strong>mit</strong> der Fähigkeit, Ink über eine<br />

Grafikdatei zu legen. Der folgende Code<br />

demonstriert, wie ein Formular <strong>mit</strong> einem<br />

InkPicture-Steuerelement erstellt wird und<br />

gibt dem Anwender die Möglichkeit, die<br />

Grafik auszuwählen, die geladen werden soll.<br />

Das Steuerelement InkPicture kann auch<br />

genau wie ein InkEdit-Steuerelement auf ein<br />

Formular gezogen werden. In Abbildung 4<br />

ist es das Steuerelement direkt unter dem<br />

InkEdit<br />

06-28 <strong>Tablet</strong> <strong>PC</strong>-<strong>Anwendungen</strong> <strong>mit</strong> <strong>VFP</strong> FoxX-Professional 16 Seite 9<br />

.


Name = "Olecontrol1"<br />

ADD OBJECT cmdload AS commandbutton WITH ;<br />

Top = 24, ;<br />

Left = 374, ;<br />

Height = 27, ;<br />

Width = 84, ;<br />

Caption = "\


PROCEDURE cmdcolor.Click<br />

thisform.olecontrol1.DefaultDrawingAttributes.Color =;<br />

GetColor()<br />

ENDPROC<br />

Die Collection DefaultDrawingAttributes<br />

bietet eine Vielzahl an Möglichkeiten, die<br />

Art zu ändern, in der das Ink gezeichnet<br />

wird. In diesem Beispiel ist Color das einzige<br />

Element der Collection und der Code ruft<br />

einfach FoxPros Funktion GETCOLOR()<br />

auf, um die Farbwahl des Anwenders entgegenzunehmen.<br />

Wie schon das Steuerelement InkOverlay<br />

kann auch das Steuerelement InkPicture Ink<br />

erkennen, speichern und laden. Der Code<br />

für die Erledigung dieser Aufgabe <strong>mit</strong> dem<br />

Steuerelement InkOverlay führt direkt über<br />

das Steuerelement InkPicture.<br />

Zusammenfassung<br />

Dies sind lediglich einige der Dinge, die Sie<br />

<strong>mit</strong> dem <strong>Tablet</strong> <strong>PC</strong> SDK und Visual FoxPro<br />

auf dem <strong>Tablet</strong> <strong>PC</strong> erledigen können. Der<br />

Artikel hat die Aufgabe, Sie auf die Möglichkeiten<br />

aufmerksam zu machen, die Ihnen<br />

beim Schreiben <strong>von</strong> <strong>Anwendungen</strong> für den<br />

<strong>Tablet</strong> <strong>PC</strong> zur Verfügung stehen. Eine vollständige<br />

Liste der Eigenschaften, Ereignisse<br />

und Methoden der hier behandelten Steuerelemente<br />

finden Sie in der Hilfedatei des<br />

<strong>Tablet</strong> <strong>PC</strong> SDK.<br />

06-28 <strong>Tablet</strong> <strong>PC</strong>-<strong>Anwendungen</strong> <strong>mit</strong> <strong>VFP</strong> FoxX-Professional 16 Seite 11

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!