Смекни!
smekni.com

Разработка элемента управления для отображения векторных карт (стр. 4 из 6)

0 1 1 0 1 2 1 0 1 2 1 0 1 2 2 0 1 2 2 0

1 0 1 0 2 0 1 0 2 2 2 0 2 2 2 0 2 2 2 0

1 1 0 0 1 1 0 0 1 2 0 0 2 2 3 0 2 2 3 0

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1

Затем в массив длинна которого равна количеству областей записываются соответствующие областям цвета. Массив записывается в поле msClr доступ к которому можно получить через свойство public Color [] GetMsClr. Алгоритм работы функции Run приведён в блок схеме Рис 3.5.1


Рис. 3.5.1 Блок-схема рекурсивного алгоритма распределения цветов.

3.6 Класс UserControl1

Как элемент управления предназначен для отображения цвета выбранного при вызове ColorDialog и хранения этого цвета с возможностью считывания этого цвета через свойство ClrSG(т.е. есть возможность последующего использования для окрашивания выделенной области в текущий цвет свойства ClrSG). А также для отображения цвета установленного из вне через это же свойство. Примечание: В данной работе применяется для отображения цвета выделенной области.

public class UserControl1: System.Windows.Forms.UserControl

{

private System.Windows.Forms.GroupBox groupBox1;

private System.Windows.Forms.Button button1;

private System.Windows.Forms.Label label1;

private int nomber; //число, отображаетсяв label1

public UserControl1()

{

}

protected override void Dispose(bool disposing)

{ …

}

}

Объявление делегата и события на основе этого делегата. Событие наступает после закрывания окна выбора цвета ColorDialog. Необходимо для отслеживания смены цвета для своевременного перекрашивания выделенной области.

public delegate void ColorSetDelegate();

public event ColorSetDelegate ColorSet;

Метод private void button1_Click(object sender, System.EventArgs e) срабатываеткогданажатакнопка button1. Создаётся экземпляр класса ColorDialog окна для выбора цвета если результат закрытия окна “OK” то цвет кнопки button1 меняется на выбранный. Свойство кнопки button1 BackColor используется и для хранения текущего цвета. Происходит наступление события ColorSet.

ColorDialog ClrDlg = new ColorDialog();

if(ClrDlg.ShowDialog()==DialogResult.OK)

{

button1.BackColor=ClrDlg.Color;

if(ColorSet!=null)

ColorSet();

}

Свойство public Color ClrSG предназначено для считывания и установки текущего цвета.

Свойство public int Nomber предназначено для считывания и установки числа. Данное число отображается в объекте label1. в программе примере используется для отображения номера выделенной области.

3.7 Класс SetDiapColor

Предназначен для создания массива объектов типа Color (т.е. цветов). В начале через метод SetQuant(int Quant) мы устанавливаем в экземпляр типа SetDiapColor какое количество областей мы хотим раскрасить. Затем сопоставляя некоторые числа каждой области(эти числа могут означать что угодно например количество проживающих на данной области). Затем мы вводим диапазоны и сопоставляем каждому диапазону цвет в который будет окрашена область если число попадёт в заданный интервал. Когда закончен ввод. Нажимаем кнопку и начинается анализ. Каждое число сопоставленное области проверяется в какой интервал оно входит и в соответствии с этим цвет записывается в массив индекс ячейки в которую произведут запись цвета равен номеру рассматриваемой на данный момент области. Так происходит со всеми областями. Массив доступен через свойство GetMsClr. Затем перебирая ячейки массива передаём их в класс CntrIm через метод SetClrPath(i,msc[i]); где это номер области а msc[i] это элемент цвет в полученном массиве цветов.

public class SetDiapColor: System.Windows.Forms.UserControl

{

private System.Windows.Forms.Button button4;

private System.Windows.Forms.GroupBox groupBox2;

private System.Windows.Forms.Button button2;

private System.Windows.Forms.Button button1;

private System.Windows.Forms.ComboBox comboBox2;

private System.Windows.Forms.Button button3;

private System.Windows.Forms.GroupBox groupBox1;

private System.Windows.Forms.TextBox textBox1;

private System.Windows.Forms.ComboBox comboBox1;

private int QuantPaths; //количество областей

private double [] msCh; //сопоставленные каждой области число

private Color [] msChClr; // сопоставленные каждой области цвет

private double [] msDiap; //массив где i-ый член хранит верхнюю

//границу диапазона а i-1 нижнюю

private Color[] msClr; // сопоставленные диапазонам цвета

private int length; //длина массива диапазонов

private Color DefCol; // цвет по умолчанию

public SetDiapColor() //конструктор поумолчанию

{…

}


Определение делегата и события на основе делегата. Событие наступает по нажатии кнопки button4 “раскрасить”

public delegate void ColorRsDelegate();

public event ColorRsDelegate ColorRs;

Метод public void SetQuant(int Quant) предназначен для создании массива чисел сопоставляемых областям количество которых передано в параметре Quant. Инициализации переменных значениями.

Метод private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) вызывается когда фокус ввода находится на элементе управления textBox1 и осуществляется нажатие кнопки. Если нажатая кнопка не цифра и не “,” которую можно вводить не более 1 раза то textBox1 блокируется для ввода

Если же нажата клавиша перевода каретки то происходит конвертация значения в тип Double и запись этого значения в массив чисел сопоставленных областям. Номер области определяется по записи выделенной в ComboBox1.

Метод private void comboBox1_SelectedIndexChanged(object sender, System.EventArgs e) вызывается когда меняется выделенный индекс элемента управления comboBox1 и высвечивает в textBox1 число приписанное к данной области.

Метод private void comboBox2_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) вызывается когда фокус ввода находится на элементе управления textBox1 и осуществляется нажатие кнопки. Если нажатая кнопка не цифра и не “,” которую можно вводить не более 1 раза то comboBox2 блокируется для ввода.

Метод private void button1_Click(object sender, System.EventArgs e) срабатывает когда происходит нажатие кнопки button1. Вызывается окно выбора цвета. И установка полученного цвета в соответствующую ячейку массива.

Метод private void button3_Click(object sender, System.EventArgs e) предназначен для добавления в массив диапазонов новый диапазон и также добавляется новый цвет для данного массива. При этом происходит сортировка для последующего определения принадлежности числа массиву.

Метод private void comboBox2_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) срабатывает когда отрисовыватеся каждая запись выпадающего списка comboBox. Тесть В начале мы выводим цвет соответствующий данному индексу а затем верхнюю границу.

{

if(e.Index!=-1)

{

if(e.Index<length)

{

e.Graphics.FillRectangle(new SolidBrush(msClr[e.Index]), new Rectangle(e.Bounds.X+1, e.Bounds.Y+1, 13, 13));

e.Graphics.DrawString(msDiap[e.Index].ToString(),new Font("Arial",10),new SolidBrush(Color.Black),e.Bounds.X+14, e.Bounds.Y);

}

else

{

e.Graphics.FillRectangle(new SolidBrush(this.DefCol), new Rectangle(e.Bounds.X+1, e.Bounds.Y+1, 13, 13));

e.Graphics.DrawString("Default",new Font("Arial",10),new SolidBrush(Color.Black),e.Bounds.X+14, e.Bounds.Y);

}


Методprivate void button2_Click(object sender, System.EventArgs e) срабатываеткогдапроисходитнажатиекнопки button2 приэтомпроисходитудалениеповыделенномув comboBox2 индексудиапазона.

Свойство public Color [] GetMsClr предназначено для получения массива цветов в которые будет производиться раскрашивание.


4. Анализ полученных результатов

При разработки элемента управления мы использовали файлы Encapsulated PostScript созданные программой CorelDraw. На Рис. 4.1 и 4.2 приведены примеры того что выводил CorelDraw и изображение созданное моим компонентом.

Рис. 4.1 изображение в CorelDraw

Рис 4.2 изображение в моём компоненте

Оценивая выведенные изображения могу отметить что изображения очень похожи и контуры областей отчётливо видны. Но заметна и некая угловатость в вычерчивании областей в моём компоненте. Это объясняется тем что в CorelDraw используются линии Безье для которые представлены в исходном фале в формате 3х последовательных точек. В моём же компоненте это заменено на вычерчивание линий. Может быть в дальнейшем если копонент пригодиться то и это будет реализовано.


5. Руководство пользователя

Описание работы будет производиться на специально созданной демонстрационной программе.

5.1 Общи вид

после запуска программа выглядит как показано на Рис. 5.1

Рис. 5.1 Общий вид

Созданный компонент находится в центре и обозначен синими прямыми углами.

5.2 Открытие файла

Рис 5.2 Открытие файла


Рис. 5.2.1 Отображение карты

5.3 Операции с изображением

5.3.1 Перемещение

Перемещение изображение осуществляется отмечание соответствующей функции обозначенную символом

наведение на карту указателя. Нажав на левую кнопку мыши перемещать изображение в нужном направлении.

5.3.2 Увеличение в точке

Увеличение изображение осуществляется отмечание соответствующей функции и установкой требуемого увеличения обозначенную символом

наведение на карту указателя и нажатие кнопки мыши.