Condividi tramite


Esempio di modulo attestazioni automatici

L'esempio di attestazioni auto risolve uno scenario ipotetico per un ispettore assicurativo. Il lavoro dell'assessore richiede a lui o a lei di visitare con i clienti a casa o business e di immettere le loro informazioni di richiesta in un modulo. Per aumentare la produttività dell'assessore, il suo reparto IT sviluppa un'applicazione tablet che lo consente di immettere rapidamente e accuratamente le informazioni sulle attestazioni tramite due controlli penna: InkEdit e InkPicture .

In questo esempio viene usato un controllo InkEdit per ogni campo di input di testo. Un utente immette le informazioni pertinenti su un criterio assicurativo e un veicolo in questi campi con una penna. Il controllo InkPicture viene usato per aggiungere input penna su un'immagine dell'automobile per evidenziare aree danneggiate dell'automobile. L'esempio attestazioni automatica è disponibile per C# e Microsoft Visual Basic .NET. Questo argomento descrive Visual Basic .NET.

La classe AutoClaims è definita come sottoclasse di System.Windows.Forms.Form e una classe annidata è definita per la creazione e la gestione di livelli di input penna per diversi tipi di danni. Quattro gestori eventi sono definiti per eseguire le attività seguenti:

  • Inizializzazione del modulo e dei livelli penna.
  • Ridisegno del controllo InkPicture .
  • Selezione di un livello penna nella casella di riepilogo.
  • Modifica della visibilità di un livello input penna.

Nota

Le versioni di questo esempio sono disponibili in C# e Visual Basic .NET. La versione descritta in questa sezione è Visual Basic .NET. I concetti sono gli stessi tra le versioni.

 

Definizione del modulo e dei livelli input penna

È necessario importare lo spazio dei nomi Microsoft.Ink :

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

Successivamente, nella classe AutoClaims viene definita una classe annidata InkLayer e viene dichiarata una matrice di quattro InkLayer oggetti. InkLayer contiene un oggetto Microsoft.Ink.Ink per l'archiviazione di input penna e i valori System.Drawing.Color e Boolean per archiviare il colore e lo stato nascosto del livello. Un quinto oggetto Ink viene dichiarato per gestire l'input penna per InkPicture quando tutti i livelli dell'input penna sono nascosti.

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

Ogni livello ha un proprio oggetto Ink . Ci sono quattro aree discrete di interesse per il modulo di attestazione (corpo, finestre, pneumatici e luci), quindi vengono usati quattro oggetti InkLayer. Un utente può visualizzare una combinazione di livelli contemporaneamente.

Inizializzazione dei livelli form e input penna

Il Load gestore eventi inizializza l'oggetto Input penna e i quattro InkLayer oggetti .

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

Selezionare quindi la prima voce (Corpo) nella casella di riepilogo.

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

Impostare infine il colore dell'input penna per il controllo InkPicture sulla voce della casella di riepilogo attualmente selezionata.

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

Ridisegno del controllo InkPicture

Nel gestore eventi DikPicture Control ereditato, i livelli penna vengono controllati per determinare quali sono nascosti. Se un livello non è nascosto, la routine evento la visualizza usando il metodo Draw della proprietà Renderer. Se si guarda nel Browser oggetti, si noterà che la proprietà Microsoft.Ink.InkPicture.Renderer è definita come oggetto Microsoft.Ink.Renderer :

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

Selezione di un livello input penna tramite la casella di riepilogo

Quando l'utente seleziona un elemento nella casella di riepilogo, il gestore eventi SelectedIndexChanged controlla prima che la selezione sia stata modificata e che il controllo InkPicture non stia attualmente raccogliendo input penna. Imposta quindi il colore penna del controllo InkPicture sul colore appropriato per il livello penna selezionato. Aggiorna inoltre la casella di controllo Nascondi livello per riflettere lo stato nascosto del livello input penna selezionato. Infine, il metodo Refresh ereditato del controllo InkPicture viene usato per visualizzare solo i livelli desiderati all'interno del controllo.

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

Modifica della visibilità di un livello input penna

Il CheckedChanged gestore eventi controlla prima che la selezione sia stata modificata e che il controllo InkPicture non stia attualmente raccogliendo input penna. Aggiorna quindi lo stato nascosto del livello input penna selezionato, imposta il controllo InkPicture inkEnabled su FALSE, .

Successivamente, la proprietà InkPicture del controllo InkEnabled è impostata su FALSE prima di aggiornare la proprietà InkPicture.

Infine, il controllo InkPicture è abilitato o disabilitato per la particolare parte del veicolo in base al fatto che la casella di controllo Nascondi livello sia selezionata e il metodo Refresh del controllo InkPicture viene usato per visualizzare solo i livelli desiderati all'interno del controllo.

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

Chiusura del modulo

Nel codice generato da Windows Form Designer i controlli InkEdit e InkPicture vengono aggiunti all'elenco dei componenti del modulo quando viene inizializzato il modulo. Quando il modulo viene chiuso, i controlli InkEdit e InkPicture vengono eliminati, nonché gli altri componenti del modulo, dal metodo Dispose del modulo. Il metodo Dispose del modulo elimina anche gli oggetti Input penna creati per il modulo.

Microsoft.ink.ink

Controllo InkPicture

Controllo InkEdit