Beispiel für das Formular für automatische Ansprüche

Im Beispiel für automatische Ansprüche wird ein hypothetisches Szenario für einen Versicherungsbewerter behandelt. Die Arbeit des Bewerters erfordert, dass er die Kunden zu Hause oder im Unternehmen besucht und seine Anspruchsinformationen in ein Formular eingibt. Um die Produktivität des Prüfers zu steigern, entwickelt seine IT-Abteilung eine Tablet-Anwendung, mit der er Anspruchsinformationen schnell und präzise über zwei Freihandsteuerelemente eingeben kann: InkEdit- und InkPicture-Steuerelemente.

In diesem Beispiel wird für jedes Texteingabefeld ein InkEdit-Steuerelement verwendet. Ein Benutzer gibt die relevanten Informationen zu einer Versicherungsrichtlinie und zum Fahrzeug mit einem Stift in diese Felder ein. Das InkPicture-Steuerelement wird verwendet, um Inkks über ein Autobild hinzuzufügen, um beschädigte Bereiche des Autos hervorzuheben. Das Beispiel für automatische Ansprüche ist für C # und Microsoft Visual Basic .NET verfügbar. In diesem Thema wird die Visual Basic .NET beschrieben.

Die AutoClaims-Klasse ist als Unterklasse von System.Windows definiert. Forms.Form und eine geschachtelte Klasse werden zum Erstellen und Verwalten von Ebenen von Ink für verschiedene Arten von Beschädigungen definiert. Vier Ereignishandler werden definiert, um die folgenden Aufgaben auszuführen:

  • Initialisieren der Formular- und Ink-Ebenen.
  • Neu gezeichnetes InkPicture-Steuerelement.
  • Auswählen einer Ink-Ebene über das Listenfeld.
  • Ändern der Sichtbarkeit einer Ink-Schicht.

Hinweis

Versionen dieses Beispiels sind in C # und Visual Basic .NET verfügbar. Die in diesem Abschnitt beschriebene Version ist Visual Basic .NET. Die Konzepte sind zwischen den Versionen identisch.

Definieren der Ebenen "Form" und "Ink"

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 wird deklariert. (InkLayer enthält ein Microsoft.Ink.Ink-Objekt zum Speichern von Freihand und System.Drawing.Color und boolesche Werte zum Speichern der Farbe und des ausgeblendeten Zustands der Ebene.) Ein fünftes Ink-Objekt wird für die Verarbeitung von InkPicture deklariert, wenn alle Ink-Ebenen 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 Ink-Objekt. Es gibt vier diskrete Bereiche, die in der Anspruchsform von Interesse sind (Körper, Fenster, Reifen und Taschenlampen), sodass vier InkLayer-Objekte verwendet werden. Ein Benutzer kann eine beliebige Kombination von Ebenen gleichzeitig anzeigen.

Initialisieren der Formular- und Ink-Ebenen

Der Load Ereignishandler initialisiert das Ink-Objekt 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 (Text) 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 abschließend die Ink-Farbe 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 Ink-Ebenen ü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. Im Objektbrowser 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 Ink-Ebene über das Listenfeld

Wenn der Benutzer ein Element im Listenfeld auswählt, überprüft der SelectedIndexChanged-Ereignishandler zunächst, ob sich die Auswahl geändert hat und dass das InkPicture-Steuerelement derzeit keine Inkk-Sammlungen erfasst. Anschließend wird die Ink-Farbe des InkPicture-Steuerelements auf die entsprechende Farbe für die ausgewählte Farbebene festgelegt. Außerdem wird das Kontrollkästchen Ebene ausblenden aktualisiert, um den ausgeblendeten Status der ausgewählten Ink-Schicht 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 Ink-Ebene

Der CheckedChanged Ereignishandler überprüft zunächst, ob sich die Auswahl geändert hat und dass das InkPicture-Steuerelement derzeit keine Inkk erfasst. Anschließend wird der ausgeblendete Status der ausgewählten Ink-Ebene aktualisiert, und der InkEnabled 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 entweder für das jeweilige Fahrzeugteil aktiviert oder deaktiviert, je nach aktivierter Option des Kontrollkästchens Ebene ausblenden, 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 Windows vom Formular-Designer generierten Code 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 verwerfen auch die Freihandobjekte, die für das Formular erstellt werden.

Microsoft.Ink.Ink

InkPicture-Steuerelement

InkEdit-Steuerelement