Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет по Летней практике....docx
Скачиваний:
1
Добавлен:
23.04.2019
Размер:
339.9 Кб
Скачать

Добавление свойств.

Для того чтобы пользователь мог выбирать между Right и Below, прежде всего нам потребуется перечислимый тип с этими значениями. Вернемся в проект по созданию управляющего элемента, перейдем в редактор кода и введем следующий код:

public partial class ctlLabelTextBox : UserControl

{

public ctlLabelTextBox()

{

InitializeComponent();

}

public enum PositionEnum { Right, Below}

}

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

6

будет храниться информация о выборе, сделанном пользователем. (Принято поля именовать с префиксом m.)

public partial class ctlLabelTextBox : UserControl

{

public enum PositionEnum { Right, Below}

private PositionEnum mPosition = PositionEnum.Right;

private int mTextboxMargin= 0;

public ctlLabelTextBox()

Затем добавляем свойство Position.

public PositionEnum Position

{get

{

return mPosition;

}

set

{

mPosition = value;

MoveControls();

}}

Аналогично создается свойство TexBoxMargin за исключением того, что оно работает с целыми числами:

public int TextboxMargin

{get

{ return mTextboxMargin; }

set

{ mTextboxMargin = value;

MoveControls(); } }

Прежде чем перейти к тестированию этих двух свойств, необходимо добавить два обработчика событий. Когда управляющий элемент помещается в форму, вызывается событие Load. Это событие следует использовать для инициализации управляющего элемента и всех ресурсов, которые могут им использоваться. Мы обрабатываем это событие, для того чтобы перемещать управляющие элементы и подгонять размер всего 7

управляющего элемента под размер содержащихся в нем элементов. Мы будем обрабатывать еще одно событие — SizeChanged. Оно возникает всегда, когда изменяются размеры управляющего элемента, и необходимо обрабатывать это событие, чтобы управляющий элемент изображался надлежащим образом. Мы подписываемся на события в конструкторе управляющего элемента:

public ctlLabelTextBox()

{ InitializeComponent();

// Обработка события SizeChanged

this.SizeChanged += new System.EventHandler(this.OnSizeChanged);

// Обработка события Load

this.Load += new EventHandler(this.OnLoad); }

Затем добавляем обработчики событий:

private void OnLoad(object sender, EventArgs e)

{//Добавляет текст к надписи

lblTextBox.Text = this.Name;

//Задание высоты управляющего элемента

this.Height = txtLabelText.Height + lblTextBox.Height;

MoveControls(); }

private void OnSizeChanged(object sender, System.EventArgs e)

{ MoveControls(); }

Метод MoveControls() вызывается для изменения местоположения управляющих элементов. Следует рассмотреть этот метод, после чего протестировать работу управляющего элемента:

private void MoveControls()

{

switch (mPosition)

{

case PositionEnum.Below:

// Располагаем Textbox таким образом, чтобы его верхний

// край находился непосредственно под надписью

this.txtLabelText.Top = this.lblTextBox.Bottom;

this.txtLabelText.Left = this.lblTextBox.Left; 8

// Изменяем ширину Textbox, делая ее равной ширине

// управляющего элемента

this.txtLabelText.Width = this.Width;

this.Height = txtLabelText.Height + lblTextBox.Height;

break;

case PositionEnum.Right:

// край совпадал с верхним краем надписи

txtLabelText.Top = lblTextBox.Top;

// Если поля обладают нулевым значением, то Textbox

// располагается непосредственно рядом с надписью

if (mTextboxMargin == 0)

{

int width = this.Width - lblTextBox.Width - 3;

txtLabelText.Left = lblTextBox.Right + 3;

txtLabelText.Width = width;

}

else

{

//Если поля обладают ненулевым значением то Textbox

//располагается в месте, определенном пользователем

txtLabelText.Left = mTextboxMargin;

txtLabelText.Width = this.Right - mTextboxMargin;

}

break;

}

}Значение, хранящееся в mPosition, используется для определения того, следует ли располагать текстовое окно снизу или справа от надписи. Если пользователь выбирает вариант Below, то мы перемещаем текстовое окно таким образом, чтобы его верхняя граница совпала с нижней границей надписи. После этого мы перемещаем левый край текстового окна на уровень левого края всего управляющего элемента и устанавливаем его ширину, равной ширине управляющего элемента. Если пользователь выбирает вариант Right, то в этом случае имеются две возможности. Если TexBoxMargin равно 0, то мы начинаем с того, что определяем ширину незанятой части управляющего элемента, предназначенной для размещения текстового окна. После этого мы устанавливаем левый край текстового окна так, чтобы он касался правого края 9

текста, и задаем ему такую ширину, чтобы он занимал все имеющееся пространство. Если пользователь задаст поля, то мы вновь поместим левый край текстового окна в ту же самую позицию и заново определим его ширину. Необходимо построить даный проект с помощью команды вида Build|Build LabelTextbox. При этом создаем новую вкладку LabelTextbox Components на палитре компонентов с созданным компонентом. (Можно оставить его там, а можно перенести в уже созданную вами вкладку для компонента графика.)

Теперь протестируем управляющий элемент. Отладка пользовательских управляющих элементов существенным образом отличается от отладки приложений Windows. Средству управления требуется некоторый контейнер, в котором оно будет выводиться, и нам придется такой контейнер ему предоставить. Мы сделаем это, создав проект Windows Application.

  1. В окне Solution Explorer вызываем конктекстное меню приложения SolutionLabelTextBox и выбираем команду Add| New Project.

  1. Назовем этот проект LabelTextboxTest.

10

  1. Теперь приложение состоит их двух проектов.

11

  1. Если попытаемся данное приложение запустить, то ничего не получится, так как по умолчанию будет запускаться проект компонента, а он не является независимым. Поэтому необходимо сделать стартовым проектом LabelTextboxTest. Для этого в контекстном меню данного проекта выбираем команду Set as Sartup Project (использовать в качестве стартового проекта). На этот раз, если мы запустим решение, приложение Windows начнет выполняться и никаких ошибок не возникнет.

  1. Для того чтобы передать приложению Windows информацию о создаваемом нами управляющем элементе, необходимо включить ссылку на этот управляющий элемент. Щелкним правой кнопкой мыши на заголовке References в Solution Explorer под проектом LabelTextboxTest и выбеем пункт Add References.... Выберем вкладку с именем Projects. Раскроется список, в котором содержится запись о проекте по созданию управляющего элемента.

12

  1. Добавим к форме управляющий элемент ctlLabelTextbox, дважды щелкнув на нем мышью.

ОБРАЗЕЦ РАБОТЫ ПРИЛОЖЕНИЯ

Наша форма будет иметь вид :

Протестируем програму:

13

НАПИСАНИЯ ПРОГРАММНОГО КОДА

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace WindowsFormsApplication1

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

int n = 1;

private void hScrollBar1_Scroll(object sender, ScrollEventArgs e)

{

14

label1.Text = "Value1 = " + Convert.ToString(hScrollBar1.Value);

textBoxMy1.Value1 = hScrollBar1.Value;

}

private void hScrollBar2_Scroll(object sender, ScrollEventArgs e)

{

label2.Text = "Value2 = " + Convert.ToString(hScrollBar2.Value);

textBoxMy1.Value2 = hScrollBar2.Value;

}

private void button1_Click(object sender, EventArgs e)

{

textBoxMy1.Operators = '*';

// label1.Text = "Operators *";

textBoxMy1.Raschet();

}

private void button2_Click(object sender, EventArgs e)

{

textBoxMy1.Operators = '/';

// label2.Text = "Operators /";

textBoxMy1.Raschet();

}

private void button3_Click_1(object sender, EventArgs e)

{

textBoxMy1.Operators ='+';

// label3.Text = "Operators /";

textBoxMy1.Raschet();

}

private void button4_Click(object sender, EventArgs e)

{ 15

textBoxMy1.Operators = '-';

textBoxMy1.Raschet();

}

private void textBoxMy1_OnRaschet(object sender, EventArgs e)

{

label3.Text = "Действия было выполнено " + Convert.ToString(n++) + " Раз.";

}

}

}

ПРИЛОЖЕНИЕ

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Drawing;

using System.Data;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace WindowsFormsControlLibrary1

{

public partial class TextBoxMy : UserControl

{

public TextBoxMy ()

{

InitializeComponent();

public event EventHandler OnRaschet;

private int val1 = 20;

private int val2 = 10;

private char oper = '+';

public int Value1 16

{

get { return val1; }

set { val1 = value; }

}

public int Value2

{

get { return val2; }

set { val2 = value; }

}

public char Operators

{

get

{

if ((oper == '-') || (oper == '*') || (oper == '+') || (oper == '/'))

{

return oper;

}

else

return '+' ;

}

set { oper = value; }

}

public void Raschet()

{

if (oper == '-')

this.checkBox1.Text = Convert.ToString(val1 - val2);

if (oper == '*')

this.checkBox1.Text = Convert.ToString(val1 * val2);

if (oper == '+')

this.checkBox1.Text = Convert.ToString(val1 + val2);

if (oper == '/')

this.checkBox1.Text = Convert.ToString(val1 / val2);

if (OnRaschet != null)

OnRaschet(this, new EventArgs());

}private void checkBox1_CheckedChanged(object sender, EventArgs e)

{

}

private void TextBoxMy_Load(object sender, EventArgs e)

{

}

}

}

17