Поделиться через


Пример формы автоматических утверждений

В примере автозаявок рассматривается гипотетический сценарий для страхового оценчика. Работа оценчика требует от него или ее посещения с клиентами в их доме или в бизнесе и ввести их информацию о претензиях в форму. Чтобы повысить производительность оценчика, его ИТ-отдел разрабатывает планшетное приложение, которое позволяет ему быстро и точно вводить сведения о заявке с помощью двух элементов управления рукописным вводом: InkEdit и InkPicture .

В этом примере элемент управления InkEdit используется для каждого текстового поля ввода. Пользователь вводит соответствующие сведения о страховом полисе и транспортном средстве в эти поля с помощью ручки. Элемент управления InkPicture используется для добавления чернил на изображение автомобиля, чтобы выделить поврежденные области автомобиля. Пример автозаявок доступен для C# и Microsoft Visual Basic .NET. В этом разделе описывается Visual Basic .NET.

Класс AutoClaims определяется как подкласс System.Windows.Forms.Form , а вложенный класс определяется для создания слоев рукописного ввода для различных типов повреждений и управления ими. Для выполнения следующих задач определены четыре обработчика событий:

  • Инициализация слоев формы и рукописного ввода.
  • Перерисовка элемента управления InkPicture .
  • Выбор слоя рукописного ввода в списке.
  • Изменение видимости слоя рукописного ввода.

Примечание

Версии этого примера доступны в C# и Visual Basic .NET. В этом разделе рассматривается версия Visual Basic .NET. В разных версиях используются одинаковые понятия.

 

Определение слоев формы и рукописного ввода

Необходимо импортировать пространство имен Microsoft.Ink :

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

Затем в классе AutoClaims определяется InkLayer вложенный класс и объявляется массив из четырех InkLayer объектов. (InkLayer содержит объект Microsoft.Ink.Ink для хранения рукописного ввода, а также значения System.Drawing.Color и логическое значение для хранения цвета и скрытого состояния слоя.) Пятый объект Ink объявляется для обработки рукописного ввода для InkPicture , когда все слои рукописного ввода скрыты.

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

Каждый слой имеет собственный объект Ink . Существует четыре дискретные области интереса в форме утверждения (корпус, окна, шины и фары), поэтому используются четыре объекта InkLayer. Пользователь может просматривать любое сочетание слоев одновременно.

Инициализация слоев формы и рукописного ввода

Обработчик Load событий инициализирует объект Ink и четыре 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);

Затем выберите первую запись (Текст) в списке.

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

Наконец, задайте цвет рукописного ввода для элемента управления InkPicture для выбранной записи в списке.

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

Перерисовка элемента управления InkPicture

В наследуемом обработчике событий Paint элемента управления InkPicture проверяются слои рукописного ввода, чтобы определить, какие из них скрыты. Если слой не скрыт, процедура события отображает его с помощью метода Draw свойства Отрисовщика. Если вы посмотрите в обозревателе объектов, вы увидите, что свойство Microsoft.Ink.InkPicture.Renderer определено как объект 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);
        }
    }          
}

Выбор слоя рукописного ввода в списке

Когда пользователь выбирает элемент в списке, обработчик событий SelectedIndexChanged сначала проверяет, изменилось ли выделение и что элемент управления InkPicture в настоящее время не собирает рукописный ввод. Затем он задает цвет рукописного ввода элемента управления InkPicture соответствующим цветом для выбранного слоя рукописного ввода. Кроме того, оно обновляет поле Скрыть слой проверка, чтобы отразить скрытое состояние выбранного слоя рукописного ввода. Наконец, унаследованный метод Refresh элемента управления InkPicture используется для отображения только нужных слоев в элементе управления .

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

Изменение видимости слоя рукописного ввода

Обработчик CheckedChanged событий сначала проверяет, что выделенный фрагмент был изменен и что элемент управления InkPicture в настоящее время не собирает рукописный ввод. Затем он обновляет скрытое состояние выбранного слоя рукописного ввода, устанавливает inkEnabled элемента управления InkPicture в значение FALSE, .

Затем перед обновлением свойства InkEnabled элемента управления InkPicture устанавливается значение FALSE .

Наконец, элемент управления InkPicture либо включается, либо отключается для конкретной части транспортного средства в зависимости от того, выбрано ли поле Скрыть слой проверка, а метод Refresh элемента управления InkPicture используется для отображения только нужных слоев в элементе управления .

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

Закрытие формы

В Designer созданном коде Формы элементы управления InkEdit и InkPicture добавляются в список компонентов формы при инициализации формы. При закрытии формы элементы управления InkEdit и InkPicture удаляются, а также другие компоненты формы методом Dispose формы. Метод Dispose формы также удаляет объекты Ink , созданные для формы.

Microsoft.Ink.Ink

Элемент управления InkPicture

Элемент управления InkEdit