Пример формы страхового возмещения за автомобиль
Пример автомобильных страховых заявлений описывает гипотетический сценарий для страхового оценщика. Работа оценщика требует, чтобы он или она посещали клиентов в их домах или офисах и вводили данные о их заявках в форму. Чтобы повысить производительность оценщика, его ИТ-отдел разрабатывает планшетное приложение, которое позволяет ему или ей быстро и точно вводить сведения о заявках, используя два элемента управления рукописным вводом: элемент 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 и Boolean значения для хранения цвета и скрытого состояния слоя.) Пятый объект 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;
У каждого слоя есть свой собственный объект Чернила. Существует четыре дискретные области интереса к бланку заявления (кузов, окна, шины и фары), поэтому используются четыре объекта 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);
Затем выберите первую запись (Body) в списке.
' 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 Control проверяются слои рукописного ввода, чтобы определить, которые из них скрыты. Если слой не скрыт, обработчик события отображает его, используя метод Draw свойства Renderer. При просмотре в браузере объектов вы увидите, что свойство 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);
}
}
}
Выбор слоя чернил в списке
Когда пользователь выбирает элемент в списке, обработчик событий SelectIndexChanged сначала проверяет, изменен ли выбор и что элемент управления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 в настоящее время не собирает рукописный ввод. Затем он обновляет скрытое состояние выбранного слоя рукописного ввода, задает для элемента управления InkPicture inkEnabled значение FALSE.
Затем свойству InkEnabled элемента управления InkPicture присваивается значение FALSE перед обновлением его свойства Ink.
Наконец, элемент управления 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.");
}
}
}
Закрытие формы
В созданном коде конструктора формы Windows элементы управления InkEdit и InkPicture добавляются в список компонентов формы при инициализации формы. Когда форма закрывается, элементы управления InkEdit и InkPicture, а также другие компоненты формы удаляются с помощью метода формы Dispose. Метод Dispose формы также удаляет объекты Ink, которые были созданы для формы.
Связанные разделы