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
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