Delen via


Voorbeeld van formulier voor automatische claims

In het voorbeeld autoclaims wordt een hypothetisch scenario voor een verzekeringsaanoordelaar opgelost. Het werk van de beoordelaar vereist dat hij of zij bij klanten thuis of in het bedrijf komt en hun claimgegevens in een formulier invoert. Om de productiviteit van de beoordelaar te verhogen, ontwikkelt zijn IT-afdeling een tablettoepassing waarmee hij of zij snel en nauwkeurig claimgegevens kan invoeren via twee inktbesturingselementen: InkEdit en InkPicture besturingselementen.

In dit voorbeeld wordt voor elk tekstinvoerveld een besturingselement InkEdit gebruikt. Een gebruiker voert de relevante informatie over een verzekeringspolis en voertuig in deze velden met een pen in. De InkPicture controle wordt gebruikt om inkt over een autoafbeelding toe te voegen om beschadigde gebieden van de auto te markeren. Het voorbeeld autoclaims is beschikbaar voor C# en Microsoft Visual Basic .NET. In dit onderwerp wordt de Visual Basic .NET beschreven.

De AutoClaims-klasse wordt gedefinieerd als een subklasse van System.Windows.Forms.Form, en er is een geneste klasse gedefinieerd voor het maken en beheren van lagen inkt voor verschillende schade. Er worden vier gebeurtenis-handlers gedefinieerd om de volgende taken uit te voeren:

  • Het initialiseren van de formulier- en inktlagen.
  • De InkPicture control opnieuw tekenen.
  • Een inktlaag selecteren via de keuzelijst.
  • De zichtbaarheid van een inktlaag wijzigen.

Notitie

Versies van dit voorbeeld zijn beschikbaar in C# en Visual Basic .NET. De versie die in deze sectie wordt besproken, is Visual Basic .NET. De concepten zijn hetzelfde tussen versies.

 

De formulier- en inktlagen definiëren

U moet de Microsoft.Ink--naamruimte importeren:

Imports Microsoft.Ink
// The Ink namespace, which contains the Tablet PC Platform API
using Microsoft.Ink;

Vervolgens wordt in de Klasse AutoClaims een geneste InkLayer klasse gedefinieerd en wordt een matrix van vier InkLayer objecten gedeclareerd. (InkLayer bevat een Microsoft.Ink.Ink-object voor het opslaan van inkt en System.Drawing.Color en booleaanse waarden voor het opslaan van de kleur en verborgen status van de laag.) Een vijfde inktobject wordt gedeclareerd voor het verwerken van inkt voor de InkPicture wanneer alle inktlagen zijn verborgen.

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

Elke laag heeft zijn eigen Ink-object. Er zijn vier discrete interessegebieden in het claimformulier (body, ramen, banden en koplampen), dus er worden vier InkLayer-objecten gebruikt. Een gebruiker kan elke combinatie van lagen tegelijk bekijken.

De formulier- en inktlagen initialiseren

De gebeurtenishandler Load initialiseert het inktobject , evenals de vier objecten InkLayer.

' 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);

Selecteer vervolgens het eerste item (hoofdtekst) in de keuzelijst.

' By default, select the first ink layer
lstAnnotationLayer.SelectedIndex = 0
// By default, select the first ink layer
lstAnnotationLayer.SelectedIndex = 0;

Stel ten slotte de inktkleur in voor de besturing InkPicture op het momenteel geselecteerde keuzelijstitem.

inkPictVehicle.DefaultDrawingAttributes.Color =
      inkLayers(lstAnnotationLayer.SelectedIndex).ActiveColor
inkPictVehicle.DefaultDrawingAttributes.Color = inkLayers[lstAnnotationLayer.SelectedIndex].ActiveColor;

Het besturingselement InkPicture opnieuw tekenen

In de InkPicture Control geërfde Paint event-handler worden de inktlagen gecontroleerd om te bepalen welke verborgen zijn. Als een laag niet verborgen is, wordt deze in de gebeurtenisprocedure weergegeven met behulp van de Renderer-eigenschap met de Draw-methode. Als u in de objectbrowser kijkt, ziet u dat de eigenschap Microsoft.Ink.InkPicture.Renderer is gedefinieerd als een Microsoft.Ink.Renderer--object:

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);
        }
    }          
}

Een inktlaag selecteren via de keuzelijst

Wanneer de gebruiker een item in de keuzelijst selecteert, controleert de SelectedIndexChanged gebeurtenishandler eerst of de selectie is gewijzigd en of het besturingselement InkPicture momenteel geen inkt verzamelt. Vervolgens wordt de inktkleur van het besturingselement InkPicture ingesteld op de juiste kleur voor de geselecteerde inktlaag. Ook wordt het selectievakje Laag verbergen bijgewerkt om de verborgen status van de geselecteerde inktlaag weer te geven. Ten slotte wordt de overgenomen methode van het InkPicture-besturingselement Refresh gebruikt om alleen de gewenste lagen binnen het besturingselement weer te geven.

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 visibility 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.");
        }
    }
}

De zichtbaarheid van een inktlaag wijzigen

De CheckedChanged gebeurtenishandler controleert eerst of de selectie is gewijzigd en of het besturingselement InkPicture momenteel geen inkt verzamelt. Vervolgens wordt de verborgen status van de geselecteerde inktlaag bijgewerkt, wordt de InkPicture-besturingselement InkEnabled ingesteld op ONWAAR, .

Vervolgens wordt de InkEnabled-eigenschap van de InkPicture-control op FALSE ingesteld voordat de Inkt-eigenschap wordt bijgewerkt.

Ten slotte wordt het InkPicture--besturingselement ingeschakeld of uitgeschakeld voor het desbetreffende voertuigonderdeel op basis van of het selectievakje Laag verbergen is ingeschakeld en wordt de methode Vernieuwen van het InkPicture-besturingselement gebruikt om alleen de gewenste lagen binnen het besturingselement weer te geven.

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.");
        }
    }
}

Het formulier sluiten

In de gegenereerde code van Windows Form Designer worden de besturingselementen InkEdit en InkPicture toegevoegd aan de lijst met onderdelen van het formulier wanneer het formulier wordt geïnitialiseerd. Wanneer het formulier wordt gesloten, worden de besturingselementen InkEdit en InkPicture verwijderd, evenals de andere onderdelen van het formulier, door de methode verwijderen van het formulier. Met de Dispose-methode van het formulier worden ook de Ink-objecten verwijderd die voor het formulier zijn gemaakt.

Microsoft.Ink.Ink

InkPicture Control

besturingselement InkEdit