Udostępnij przez


Przykład formularza roszczeń samochodowych

Przykład Auto Claims dotyczy hipotetycznego scenariusza dla osoby oceniającej ubezpieczenia. Praca osoby oceniającej wymaga od niego wizyty u klientów w ich domu lub firmie i wprowadzenia informacji o roszczeniach w formularzu. Aby zwiększyć produktywność osoby oceniającej, jego dział IT opracowuje aplikację na tablet, która umożliwia mu szybkie i dokładne wprowadzanie informacji dotyczących zgłoszeń za pomocą dwóch kontrolek atramentu: InkEdit i kontrolka InkPicture.

W tym przykładzie dla każdego pola wprowadzania tekstu jest używana kontrolka InkEdit. Użytkownik wprowadza odpowiednie informacje o polisie ubezpieczeniowej i pojeździe w tych polach piórem. Kontrolka InkPicture służy do dodawania pisma odręcznego na obrazie samochodowym w celu wyróżnienia uszkodzonych obszarów samochodu. Przykład aplikacji Auto Claims jest dostępny dla C# i Microsoft Visual Basic .NET. W tym temacie opisano platformę .NET języka Visual Basic.

Klasa AutoClaims jest zdefiniowana jako podklasa System.Windows.Forms.Form, a zagnieżdżona klasa jest definiowana do tworzenia i zarządzania warstwami atramentu dla różnych typów uszkodzeń. W celu wykonania następujących zadań zdefiniowano cztery programy obsługi zdarzeń:

  • Inicjalizowanie warstw formularza i warstw atramentu.
  • Ponowne rysowanie kontrolki InkPicture.
  • Wybieranie warstwy tuszu za pomocą pola listy.
  • Zmiana widoczności warstwy atramentu.

Notatka

Wersje tego przykładu są dostępne w językach C# i Visual Basic .NET. Wersja omówiona w tej sekcji to Visual Basic .NET. Pojęcia są takie same między wersjami.

 

Definiowanie warstw formy i tuszu

Musisz zaimportować przestrzeń nazw Microsoft.Ink:

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

Następnie w klasie AutoClaims definiowana jest zagnieżdżona klasa InkLayer, a także deklarowana jest tablica składająca się z czterech obiektów InkLayer. (InkLayer zawiera obiekt Microsoft.Ink.Ink do przechowywania tuszu, a także wartości System.Drawing.Color i logiczne do przechowania koloru i ukrytego stanu warstwy.) Piąty obiekt Ink jest zadeklarowany do obsługi pisania odręcznego dla InkPicture, gdy wszystkie warstwy pisania odręcznego są ukryte.

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

Każda warstwa ma własny obiekt atramentu. Istnieją cztery odrębne obszary zainteresowania formą roszczenia (ciało, okna, opony i reflektory), więc są używane cztery obiekty InkLayer. Użytkownik może wyświetlać dowolną kombinację warstw jednocześnie.

Inicjowanie warstw formularza i atramentu

Handler zdarzeń Load inicjuje obiekt atramentu i cztery obiekty 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);

Następnie wybierz pierwszy wpis (Treść) w polu listy.

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

Na koniec ustaw kolor tuszu dla kontrolki InkPicture na aktualnie zaznaczony wpis pola listy.

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

Ponowne rysowanie kontrolki InkPicture

W dziedziczonym programie obsługi zdarzenia Paint kontrolki InkPicture sprawdzane są warstwy tuszu, aby ustalić, które z nich są ukryte. Jeśli warstwa nie jest ukryta, procedura zdarzenia wyświetla ją, korzystając z metody Draw właściwości Renderer. Jeśli spojrzysz w przeglądarce obiektów, zobaczysz, że właściwość Microsoft.Ink.InkPicture.Renderer jest zdefiniowana jako obiekt 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);
        }
    }          
}

Wybieranie warstwy atramentu za pomocą listy rozwijanej

Gdy użytkownik wybierze element w polu listy, SelectedIndexChanged procedura obsługi zdarzenia najpierw sprawdza, czy zaznaczenie zostało zmienione i czy kontrolka InkPicture nie zbiera obecnie tuszu. Następnie ustawia kolor pisma odręcznego kontrolki InkPicture na odpowiedni kolor dla wybranej warstwy pisma odręcznego. Ponadto aktualizuje pole wyboru Ukryj warstwę, aby odzwierciedlić status ukrywania wybranej warstwy atramentu. Na koniec odziedziczona metoda Refresh kontrolki InkPicture jest używana do wyświetlania tylko żądanych warstw w kontrolce.

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

Zmiana widoczności warstwy tuszu

Program obsługi zdarzeń CheckedChanged najpierw sprawdza, czy zaznaczenie zostało zmienione i czy kontrolka InkPicture nie rejestruje obecnie pisma odręcznego. Następnie aktualizuje status ukrycia wybranej warstwy pisma odręcznego i ustawia opcję InkEnabled kontrolki InkPicture na FALSE.

Następnie właściwość InkEnabled kontrolki InkPicture jest ustawiona na FALSE, zanim zostanie zaktualizowana jej właściwość Tinta.

Na koniec kontrolka InkPicture jest włączona lub wyłączona dla określonej części pojazdu w zależności od tego, czy zaznaczono pole wyboru "Ukryj warstwę", a metoda Refresh kontrolki InkPicture jest używana do wyświetlania wyłącznie żądanych warstw w kontrolce.

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

Zamykanie formularza

W wygenerowanym kodzie programu Windows Form Designer kontrolki InkEdit i InkPicture są dodawane do listy składników formularza podczas inicjowania formularza. Po zamknięciu formularza kontrolki InkEdit i InkPicture są usuwane, a także inne składniki formularza za pomocą metody Dispose formularza. Metoda Dispose formularza usuwa również obiekty pisma odręcznego utworzone dla formularza.

Microsoft.Ink.Ink

Kontrolka InkPicture

kontrolka InkEdit