Beispiel für das Formular für automatische Ansprüche
Das Beispiel für automatische Ansprüche behandelt ein hypothetisches Szenario für einen Versicherungsassessor. Die Arbeit des Prüfers erfordert, dass er die Kunden zu Hause oder in ihrem Unternehmen besucht und ihre Anspruchsinformationen in ein Formular eingibt. Um die Produktivität des Prüfers zu erhöhen, entwickelt seine IT-Abteilung eine Tablet-Anwendung, mit der er schnell und präzise Anspruchsinformationen über zwei Freihandsteuerelemente eingeben kann: InkEdit - und InkPicture-Steuerelemente .
In diesem Beispiel wird ein InkEdit-Steuerelement für jedes Texteingabefeld verwendet. Ein Benutzer gibt die relevanten Informationen zu einer Versicherungspolice und einem Fahrzeug mit einem Stift in diese Felder ein. Das InkPicture-Steuerelement wird verwendet, um einem Automobilbild Freihand hinzuzufügen, um beschädigte Bereiche des Fahrzeugs hervorzuheben. Das Beispiel für automatische Ansprüche ist für C# und Microsoft Visual Basic .NET verfügbar. In diesem Thema wird visual Basic .NET beschrieben.
Die AutoClaims-Klasse ist als Unterklasse von System.Windows.Forms.Form definiert, und eine geschachtelte Klasse wird zum Erstellen und Verwalten von Freihandebenen für verschiedene Arten von Schäden definiert. Vier Ereignishandler werden definiert, um die folgenden Aufgaben auszuführen:
- Initialisieren der Formular- und Freihandebenen.
- Neu zeichnet das InkPicture-Steuerelement aus.
- Auswählen einer Freihandebene über das Listenfeld.
- Ändern der Sichtbarkeit einer Freihandebene
Hinweis
Versionen dieses Beispiels sind in C# und Visual Basic .NET verfügbar. Die in diesem Abschnitt erläuterte Version ist Visual Basic .NET. Die Konzepte sind zwischen den Versionen identisch.
Definieren der Formular- und Freihandebene
Sie müssen den Microsoft.Ink-Namespace importieren:
Imports Microsoft.Ink
// The Ink namespace, which contains the Tablet PC Platform API
using Microsoft.Ink;
Als Nächstes wird in der AutoClaims-Klasse eine geschachtelte InkLayer
Klasse definiert und ein Array von vier InkLayer
Objekten deklariert. (InkLayer enthält ein Microsoft.Ink.Ink.Ink-Objekt zum Speichern von Freihand sowie System.Drawing.Color - und Boolesche Werte zum Speichern der Farbe und des ausgeblendeten Zustands der Ebene.) Ein fünftes Freihandobjekt wird zum Behandeln von Freihand für die InkPicture deklariert, wenn alle Freihandebenen ausgeblendet sind.
' Declare the array of ink layers used the vehicle illustration.
Dim inkLayers(3) As InkLayer
' Declare an empty ink object (used when we don't want to draw
' any ink).
Dim emptyInk As Ink
' Declare a value to hold the index of selected ink
Dim selectedIndex As Integer
' Declare a value to hold whether the selected ink is hidden
Dim selectedHidden As Boolean
// Declare the array of ink layers used the vehicle illustration.
InkLayer[] inkLayers;
// Declare an empty ink object (used when we don't want to draw
// any ink).
Ink emptyInk;
// Declare a value to hold the index of selected ink
int selectedIndex = -1;
// Declare a value to hold whether the selected ink is hidden
bool selectedHidden = false;
Jede Ebene verfügt über ein eigenes Freihandobjekt . In der Anspruchsform gibt es vier diskrete Bereiche von Interesse (Körper, Fenster, Reifen und Scheinwerfer), sodass vier InkLayer-Objekte verwendet werden. Ein Benutzer kann eine beliebige Kombination von Ebenen gleichzeitig anzeigen.
Initialisieren der Formular- und Freihandebene
Der Load
Ereignishandler initialisiert das Freihandobjekt und die vier InkLayer
Objekte.
' Initialize the empty ink
emptyInk = New Ink()
' Initialize the four different layers of ink on the vehicle diagram:
' vehicle body, windows, tires, and headlights.
inkLayers(0) = New InkLayer(New Ink(), Color.Red, False)
inkLayers(1) = New InkLayer(New Ink(), Color.Violet, False)
inkLayers(2) = New InkLayer(New Ink(), Color.LightGreen, False)
inkLayers(3) = New InkLayer(New Ink(), Color.Aqua, False)
// Initialize the empty ink
emptyInk = new Ink();
// Initialize the four different layers of ink on the vehicle diagram:
// vehicle body, windows, tires, and headlights.
inkLayers = new InkLayer[4];
inkLayers[0] = new InkLayer(new Ink(), Color.Red, false);
inkLayers[1] = new InkLayer(new Ink(), Color.Violet, false);
inkLayers[2] = new InkLayer(new Ink(), Color.LightGreen, false);
inkLayers[3] = new InkLayer(new Ink(), Color.Aqua, false);
Wählen Sie dann den ersten Eintrag (Textkörper) im Listenfeld aus.
' By default, select the first ink layer
lstAnnotationLayer.SelectedIndex = 0
// By default, select the first ink layer
lstAnnotationLayer.SelectedIndex = 0;
Legen Sie schließlich die Freihandfarbe für das InkPicture-Steuerelement auf den aktuell ausgewählten Listenfeldeintrag fest.
inkPictVehicle.DefaultDrawingAttributes.Color =
inkLayers(lstAnnotationLayer.SelectedIndex).ActiveColor
inkPictVehicle.DefaultDrawingAttributes.Color = inkLayers[lstAnnotationLayer.SelectedIndex].ActiveColor;
Neuzeichnen des InkPicture-Steuerelements
Im geerbten Paint-Ereignishandler des InkPicture-Steuerelements werden die Freihandebenen überprüft, um zu bestimmen, welche ausgeblendet sind. Wenn eine Ebene nicht ausgeblendet ist, zeigt die Ereignisprozedur sie mithilfe der Draw-Methode der Renderer-Eigenschaft an. Wenn Sie im Objektbrowser nachsehen, sehen Sie, dass die Microsoft.Ink.InkPicture.Renderer-Eigenschaft als Microsoft.Ink.Renderer-Objekt definiert ist:
Private Sub inkPictVehicle_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles inkPictVehicle.Paint
Dim layer As InkLayer
' Cycle through each ink layer. If it is visible, paint it.
' Note that it is necessary to customize the paint
' behavior, since we want to hide/show different ink layers.
For Each layer In inkLayers
If (Not layer.Hidden) Then
inkPictVehicle.Renderer.Draw(e.Graphics, layer.ActiveInk.Strokes)
End If
Next
End Sub
private void inkPictVehicle_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
// Cycle through each ink layer. If it is visible, paint it.
// Note that it is necessary to customize the paint
// behavior, since we want to hide/show different ink layers.
foreach (InkLayer layer in inkLayers)
{
if (!layer.Hidden)
{
inkPictVehicle.Renderer.Draw(e.Graphics,layer.ActiveInk.Strokes);
}
}
}
Auswählen einer Freihandebene über das Listenfeld
Wenn der Benutzer ein Element im Listenfeld auswählt, überprüft der SelectedIndexChanged-Ereignishandler zuerst, ob sich die Auswahl geändert hat und ob das InkPicture-Steuerelement derzeit keine Freihandsammlung enthält. Anschließend wird die Freihandfarbe des InkPicture-Steuerelements auf die entsprechende Farbe für die ausgewählte Freihandebene festgelegt. Außerdem wird das Kontrollkästchen Ebene ausblenden aktualisiert, um die ausgeblendete status der ausgewählten Freihandebene widerzuspiegeln. Schließlich wird die geerbte Refresh-Methode des InkPicture-Steuerelements verwendet, um nur die gewünschten Ebenen innerhalb des Steuerelements anzuzeigen.
Private Sub chHideLayer_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chHideLayer.CheckedChanged
' Provided that the new checked hidden value is different than
' the previous value...
If (Not (chHideLayer.Checked = selectedHidden)) Then
If (Not (inkPictVehicle.CollectingInk)) Then
' Update the array indicating the visibility of each ink layer
inkLayers(lstAnnotationLayer.SelectedIndex).Hidden = chHideLayer.Checked
' Set the active ink object to the selected ink
' Note that if the current layer is not visible, empty
' ink is used to prevent flicker.
inkPictVehicle.InkEnabled = False
If (chHideLayer.Checked) Then
inkPictVehicle.Ink = emptyInk
Else
inkPictVehicle.Ink = inkLayers(lstAnnotationLayer.SelectedIndex).ActiveInk
End If
' Update the previous checkbox value to the current
selectedHidden = chHideLayer.Checked
' If the layer is marked hidden, disable ink collection
inkPictVehicle.InkEnabled = Not chHideLayer.Checked
Me.Refresh()
Else
' If ink collection is enabled, the active ink cannot be changed
' and it is necessary to restore the checkbox to its previous value.
chHideLayer.Checked = selectedHidden
MessageBox.Show("Cannot change visiblity while collecting ink.")
End If
End If
End Sub
private void lstAnnotationLayer_SelectedIndexChanged(object sender, System.EventArgs e)
{
// Provided that the new selected index value is different than
// the previous value...
if (lstAnnotationLayer.SelectedIndex != selectedIndex)
{
if (!inkPictVehicle.CollectingInk)
{
// Set the ink and visiblity of the current ink layer
inkPictVehicle.DefaultDrawingAttributes.Color = inkLayers[lstAnnotationLayer.SelectedIndex].ActiveColor;
chHideLayer.Checked = inkLayers[lstAnnotationLayer.SelectedIndex].Hidden;
// Set the active ink object to the selected ink
// Note that if the current layer is not visible, empty
// ink is used to prevent flicker.
inkPictVehicle.InkEnabled = false;
inkPictVehicle.Ink = chHideLayer.Checked?emptyInk:inkLayers[lstAnnotationLayer.SelectedIndex].ActiveInk;
inkPictVehicle.InkEnabled = !chHideLayer.Checked;
selectedIndex = lstAnnotationLayer.SelectedIndex;
this.Refresh();
}
else
{
// If ink collection is enabled, the active ink cannot be changed
// and it is necessary to restore the selection to its previous value.
lstAnnotationLayer.SelectedIndex = selectedIndex;
MessageBox.Show("Cannot change active ink while collecting ink.");
}
}
}
Ändern der Sichtbarkeit einer Freihandebene
Der CheckedChanged
Ereignishandler überprüft zunächst, ob sich die Auswahl geändert hat und ob das InkPicture-Steuerelement derzeit keine Freihandeingabe sammelt. Anschließend wird die ausgeblendete status der ausgewählten Freihandebene aktualisiert, und die InkPicture-Steuerung des InkPicture-Steuerelements wird auf FALSE, festgelegt.
Als Nächstes wird die InkEnabled-Eigenschaft des InkPicture-Steuerelements auf FALSE festgelegt, bevor die Ink-Eigenschaft aktualisiert wird.
Schließlich ist das InkPicture-Steuerelement für das jeweilige Fahrzeugteil aktiviert oder deaktiviert, je nachdem, ob das Kontrollkästchen Ebene ausblenden aktiviert ist, und die Refresh-Methode des InkPicture-Steuerelements wird verwendet, um nur die gewünschten Ebenen innerhalb des Steuerelements anzuzeigen.
Private Sub chHideLayer_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chHideLayer.CheckedChanged
' Provided that the new checked hidden value is different than
' the previous value...
If (Not (chHideLayer.Checked = selectedHidden)) Then
If (Not (inkPictVehicle.CollectingInk)) Then
' Update the array indicating the visibility of each ink layer
inkLayers(lstAnnotationLayer.SelectedIndex).Hidden = chHideLayer.Checked
' Set the active ink object to the selected ink
' Note that if the current layer is not visible, empty
' ink is used to prevent flicker.
inkPictVehicle.InkEnabled = False
If (chHideLayer.Checked) Then
inkPictVehicle.Ink = emptyInk
Else
inkPictVehicle.Ink = inkLayers(lstAnnotationLayer.SelectedIndex).ActiveInk
End If
' Update the previous checkbox value to the current
selectedHidden = chHideLayer.Checked
' If the layer is marked hidden, disable ink collection
inkPictVehicle.InkEnabled = Not chHideLayer.Checked
Me.Refresh()
Else
' If ink collection is enabled, the active ink cannot be changed
' and it is necessary to restore the checkbox to its previous value.
chHideLayer.Checked = selectedHidden
MessageBox.Show("Cannot change visiblity while collecting ink.")
End If
End If
End Sub
private void chHideLayer_CheckedChanged(object sender, System.EventArgs e)
{
// Provided that the new checked hidden value is different than
// the previous value...
if (chHideLayer.Checked != selectedHidden)
{
if (!inkPictVehicle.CollectingInk)
{
// Update the array indicating the visibility of each ink layer
inkLayers[lstAnnotationLayer.SelectedIndex].Hidden = chHideLayer.Checked;
// Set the active ink object to the selected ink
// Note that if the current layer is not visible, empty
// ink is used to prevent flicker.
inkPictVehicle.InkEnabled = false;
inkPictVehicle.Ink = chHideLayer.Checked?emptyInk:inkLayers[lstAnnotationLayer.SelectedIndex].ActiveInk;
// If the layer is marked hidden, disable ink collections
inkPictVehicle.InkEnabled = !chHideLayer.Checked;
// Update the previous checkbox value to reflect the current
selectedHidden = chHideLayer.Checked;
this.Refresh();
}
else
{
// If ink collection is enabled, the active ink cannot be changed
// and it is necessary to restore the checkbox to its previous value.
chHideLayer.Checked = selectedHidden;
MessageBox.Show("Cannot change visiblity while collecting ink.");
}
}
}
Schließen des Formulars
Im generierten Code von Windows Form Designer werden die Steuerelemente InkEdit und InkPicture der Komponentenliste des Formulars hinzugefügt, wenn das Formular initialisiert wird. Wenn das Formular geschlossen wird, werden die Steuerelemente InkEdit und InkPicture sowie die anderen Komponenten des Formulars durch die Dispose-Methode des Formulars verworfen. Die Dispose-Methode des Formulars verfügt auch über die Freihandobjekte , die für das Formular erstellt werden.
Zugehörige Themen