Опубликован: 11.09.2006 | Уровень: специалист | Доступ: платный
Лекция 1:

Введение в windows-формы

Лекция 1: 12345678910 || Лекция 2 >

Форматирование элементов управления

Расположение элементов на форме во многом определяет удобство работы с готовым приложением. Пункт главного меню Format содержит опции выравнивания, изменения размера и блокировки элементов управления (рис. 1.42):

Пункт главного меню Format

Рис. 1.42. Пункт главного меню Format

При выделении нескольких элементов управления около одного из них появляются темные точки маркера (рис. 1.42). Свойства выбранных элементов будут изменяться относительно этого, главного элемента управления. Для последовательного выделения нескольких элементов удерживаем клавишу Shift, главным элементом будет последний выделенный элемент. Значение пунктов меню Format приводятся в таблице 1.4.

Таблица 1.4.
Пункт меню Format Описание
Align Выравнивание выбранных элементов управления
Make Same Size Установка равного размера
Horizontal Spacing Пробел между элементами по горизонтали
Vertical Spacing Пробел между элементами по вертикали
Center in Form Расположение элементов управления относительно формы
Order Вертикальный порядок элементов управления
Lock Controls Блокировка элементов

При создании дизайна формы всегда следует использовать возможности студии для расположения элементов. При создании приложения SocOpros, например, было использовано расположение элементов управления относительно центра формы (Center in Form).

Приложение "калькулятор"

Создайте новый проект (Windows Application) и назовите его Calculator. Устанавливаем следующие свойства формы:

Form1, форма, свойство Значение
Name Calc
FormBorderStyle Fixed3D
Icon ICOПуть E:\Program Files\Microsoft Visual Studio .NET2003\Common7\Graphics\icons\Computer\KEYS01.ICO
MaximizeBox False
Size 280;280
Text Калькулятор 1.0

Запускаем приложение. Возникает ошибка — "D:\Code\Glava1\Calculator\Form1.cs(75): The type or namespace name 'Form1' could not be found (are you missing a using directive or an assembly reference?)"

Мы изменили свойство Name, а в коде метода Main, сгенерированном Мастером, осталось старое имя формы. Исправляем на новое:

[STAThread]
static void Main() 
	{
		Application.Run(new Calc());
	}

Теперь все работает. Вернемся в режим дизайна и расположим на форме кнопки калькулятора и TextBox, который будет играть роль дисплея (рис. 1.43):

Расположение элементов управления в режиме дизайна

Рис. 1.43. Расположение элементов управления в режиме дизайна

Для кнопок устанавливаем следующие свойства:

Элемент Name Text
button1 btn1 1
button2 btn2 2
button3 btn3 3
button4 btn4 4
button5 btn5 5
button6 btn6 6
button7 btn7 7
button8 btn8 8
button9 btn9 9
button10 btn10 0
button11 btnChangesign +/–
button12 btnpoint ,
button13 btn_plus +
button14 btn_minus
button15 btn_umnojenie *
button16 btn_delenie /
button17 btn_sbros C
button18 btn_ravno =

Установим свойство Size одной кнопки 40;40, а затем, выделив все остальные кнопки, сделаем их одинакового размера — пункт меню Format/Make Same Size/Both. Затем высоту кнопок btn_sbros и btn_ravno сделаем сдвоенной, как показано на рис. рис. 1.43.

Для текстового поля устанавливаем следующие свойства:

textBox1, свойство Значение
Name txtOutput
Font/Size 12
Size 250; 26
Location 10;24
TextAlign Right

Дизайн нашего приложения готов. Теперь можно приступать к коду. Состоять он будет из двух классов — public class Calc : System.Windows.Forms.Form —основного, в котором будет реализовываться вся обработка нажатия клавиш, и class mehanizmcalkulyatora, в котором будет находиться вся логика его работы (рис. 1.44):

Для просмотра структуры кода удобно сворачивать классы, щелкая на знаке (+)

Рис. 1.44. Для просмотра структуры кода удобно сворачивать классы, щелкая на знаке (+)

Далее привожу листинг класса mehanizmcalkulyatora с комментариями:

class mehanizmcalkulyatora
	{
	/// <summary>
	///Создаем перечисление Deystvie для определения одного из четырех действий калькулятора
	/// </summary>
		public enum Deystvie:int
		{
			NeopredelDeystvie = 0,
			Slojenie = 1,
			Vichitanie = 2,
			Umnojenie = 3,
			Delenie = 4
		}

	/// <summary>
	/// Объявляем и инициализируем переменную, 
	/// которая будет использоваться для смены знака при нажатии клавиши (+/–)
	/// </summary>

		private static double peremennayaMinus = -1;

		/// <summary>
		/// Объявляем переменные для работы калькулятора:
		/// resultatVichisleniy — переменная для хранения
		///  промежуточного результата в механизме калькулятора;
		///  resultatOutput — переменная, значение которой будет сниматься с экрана и  выводиться на него;
		///  tekusheeDeystvieCalculatora — хранение одного из действий калькулятора;
		///  pervoeChislo — переменная, в которую будет записываться число на экране
		///   до нажатия на одну из четырех кнопок с действием;
		///  vtoroeChislo — второе число на экране;
		///  dobavlenierazryada — при добавлении следующего  разряда эта переменная примет значение true;
		///  ChislosTochkoy — при добавлении десятичного разряда (знака точки) эта переменная примет значение true
		/// </summary>
	
		private static double resultatVichisleniy;
		private static string resultatOutput;
		private static Deystvie tekusheeDeystvieCalculatora;
		private static double pervoeChislo;
		private static double vtoroeChislo;
		private static bool dobavlenierazryada;
		private static bool ChislosTochkoy;
 
		/// <summary>
		/// В конструкторе класса mehanizmcalkulyatora инициализируем переменные 
		/// ChislosTochkoy и dobavlenierazryada — при запуске калькулятора на экране 
		/// нет ни разрядности, ни десятичной части
		/// </summary>

		public mehanizmcalkulyatora ()
		{
			ChislosTochkoy = false;
			dobavlenierazryada = false;
		}

			
		/// <summary>
		/// В этом методе переменная resultatOutput изменяется — при вводе числа ее значение перезаписывается
		/// </summary>
		

		public static string chislonaEkrane (string najatayaKlavisha)
		{
			resultatOutput = resultatOutput + najatayaKlavisha;
			return (resultatOutput);
		}
		/// <summary>
		/// Метод, в котором определяется peremenDeystviya, — одно значение перечисления ///Deystvie,
		///в зависимости от выбора  клавиши +, –, *  или /
		/// </summary>
	
		public static void DeystvieCalculatora (Deystvie peremenDeystviya)
		{
			try
			{
				if (resultatOutput != "" && !dobavlenierazryada)
				{
					pervoeChislo = System.Convert.ToDouble (resultatOutput);
					tekusheeDeystvieCalculatora = peremenDeystviya;
					resultatOutput = "";
					ChislosTochkoy = false;
				}			
			}
		
			catch (Exception ex)
			{
				MessageBox.Show(ex.ToString());
			}
			finally
			{
			
			}
		}



	/// <summary>
	/// При нажатии  кнопки +/– число на экране — tekusheeChislo умножается на –1,
	///  а затем результат снова присваивается переменной resultatOutput
	/// </summary>
	

		public static string ZnakChisla ()
		{
			double tekusheeChislo;

			if (resultatOutput != "")
			{
				tekusheeChislo = System.Convert.ToDouble (resultatOutput);
				resultatOutput = System.Convert.ToString(tekusheeChislo * peremennayaMinus);
			}
		
			return (resultatOutput);
		}

		/// <summary>
		/// При нажатии кнопки ( , ) переменная resultatOutput приобретает дробную часть
		/// </summary>
	

		public static string ZnakTochki ()
		{
			if (!ChislosTochkoy && !dobavlenierazryada)
			{
				if (resultatOutput != "")
					resultatOutput = resultatOutput + ",";
				else
					resultatOutput = "0,";

				ChislosTochkoy = true;
			}

			return (resultatOutput);
		}

	/// <summary>
	/// При нажатии кнопки ZnakRavno обрабатываются значения 
	/// переменнных pervoeChislo и vtoroeChislo, результат присваивается переменной 				///resultatVichisleniy, 
	/// которая  затем преобразуется в resultatOutput
	/// </summary>


		public static string ZnakRavno ()
		{
			bool proverkaOshibok = false;

			if (resultatOutput != "")
			{
				vtoroeChislo = System.Convert.ToDouble (resultatOutput);
				dobavlenierazryada = true;

				switch (tekusheeDeystvieCalculatora)
				{
					case Deystvie.NeopredelDeystvie:
						proverkaOshibok = false;
						break;

					case Deystvie.Slojenie:
						resultatVichisleniy = pervoeChislo + vtoroeChislo;
						proverkaOshibok = true;
						break;

					case Deystvie.Vichitanie:
						resultatVichisleniy = pervoeChislo – vtoroeChislo;
						proverkaOshibok = true;
						break;

					case Deystvie.Umnojenie:
						resultatVichisleniy = pervoeChislo * vtoroeChislo;
						proverkaOshibok = true;
						break;

					case Deystvie.Delenie:
						resultatVichisleniy = pervoeChislo / vtoroeChislo;
						proverkaOshibok = true;
						break;

					default:
						proverkaOshibok = false;
						break;
				}

				if (proverkaOshibok)
					resultatOutput = System.Convert.ToString (resultatVichisleniy);
			}
			
			return (resultatOutput);
		}

	/// <summary>
	/// При нажатии кнопки  С (сброс) значения переменных обнуляются
	/// </summary>

		public static void Sbros ()
		{
			resultatVichisleniy = 0;
			pervoeChislo = 0;
			vtoroeChislo = 0;
			resultatOutput = "";
			tekusheeDeystvieCalculatora = Deystvie.NeopredelDeystvie;
			ChislosTochkoy = false;
			dobavlenierazryada = false;			
		}
	}
Листинг 1.8.

Механизм калькулятора готов. Для создания обработчиков кнопок в режиме дизайна дважды щелкаем по каждой кнопке, для быстрого возврата к режиму дизайна используем сочетания клавиш Shift+F7. Теперь в классе public class Calc : System.Windows.Forms.Form добавляем код для работы интерфейса приложения3Листинг приводится без области Windows Form Designer generated code :

public class Calc : System.Windows.Forms.Form
	{
		private System.Windows.Forms.TextBox txtOutput;
		private System.Windows.Forms.Button btn_sbros;
		private System.Windows.Forms.Button btnChangesign;
		private System.Windows.Forms.Button btnpoint;
		private System.Windows.Forms.Button btn_ravno;
		private System.Windows.Forms.Button btn_delenie;
		private System.Windows.Forms.Button btn_umnojenie;
		private System.Windows.Forms.Button btn_plus;
		private System.Windows.Forms.Button btn_minus;
		private System.Windows.Forms.Button btn0;
		private System.Windows.Forms.Button btn9;
		private System.Windows.Forms.Button btn8;
		private System.Windows.Forms.Button btn7;
		private System.Windows.Forms.Button btn6;
		private System.Windows.Forms.Button btn5;
		private System.Windows.Forms.Button btn4;
		private System.Windows.Forms.Button btn3;
		private System.Windows.Forms.Button btn2;
		private System.Windows.Forms.Button btn1;
		private System.ComponentModel.Container components = null;
		/// <summary>
		/// Объявляем и инициализируем переменные, которые будут
		///  возникать на экране при нажатии соответствующих кнопок
		/// </summary>
		private const string odin = "1";
		private const string dva = "2";
		private const string tri = "3";
		private const string chetire = "4";
		private const string pyat = "5";
		private const string shest = "6";
		private const string sem = "7";
		private const string vosem = "8";
		private const string devyat = "9";
		private const string nul = "0";

		public Calc()
		{
			InitializeComponent();
			// При запуске приложения на экране будет нуль
			txtOutput.Text = "0";
		
		}

		
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if (components != null) 
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}

		Windows Form Designer generated code

		
		[STAThread]
		static void Main() 
		{
			Application.Run(new Calc());
		}
		/// <summary>
/// Обработчики для кнопок  обращаются к методу chislonaEkrane класса    ///mehanizmcalkulyatora
		/// и передают ему одну из постоянных (odin, dva, tri  и т.д.). Результат, 
///возвращаемый методом,
		/// присваивается  свойству Text текстового поля txtOutput
		/// </summary>

			private void btn1_Click(object sender, System.EventArgs e)
			{
				txtOutput.Text = mehanizmcalkulyatora.chislonaEkrane (odin);
			}

			private void btn2_Click(object sender, System.EventArgs e)
			{
				txtOutput.Text = mehanizmcalkulyatora.chislonaEkrane (dva);
			}

			private void btn3_Click(object sender, System.EventArgs e)
			{
				txtOutput.Text = mehanizmcalkulyatora.chislonaEkrane (tri);
			}

			private void btn4_Click(object sender, System.EventArgs e)
			{
				txtOutput.Text = mehanizmcalkulyatora.chislonaEkrane (chetire);
			}

			private void btn5_Click(object sender, System.EventArgs e)
			{
				txtOutput.Text = mehanizmcalkulyatora.chislonaEkrane (pyat);
			}

			private void btn6_Click(object sender, System.EventArgs e)
			{
				txtOutput.Text = mehanizmcalkulyatora.chislonaEkrane (shest);
			}

			private void btn7_Click(object sender, System.EventArgs e)
			{
				txtOutput.Text = mehanizmcalkulyatora.chislonaEkrane (sem);
			}

			private void btn8_Click(object sender, System.EventArgs e)
			{
				txtOutput.Text = mehanizmcalkulyatora.chislonaEkrane (vosem);
			}

			private void btn9_Click(object sender, System.EventArgs e)
			{
				txtOutput.Text = mehanizmcalkulyatora.chislonaEkrane (devyat);
			}

			private void btn10_Click(object sender, System.EventArgs e)
			{
				txtOutput.Text = mehanizmcalkulyatora.chislonaEkrane (nul);
			}

			private void btnChangesign_Click(object sender, System.EventArgs e)
			{
				txtOutput.Text = mehanizmcalkulyatora.ZnakChisla();
			}

			private void btnpoint_Click(object sender, System.EventArgs e)
			{
				txtOutput.Text = mehanizmcalkulyatora.ZnakTochki();
			}
			/// <summary>
			/// Обработчики кнопок действия калькулятора передают 
			/// методу DeystvieCalculatora класса mehanizmcalkulyatora 
///переменную перечисления Deystvie
			/// </summary>
		
			private void btn_delenie_Click(object sender, System.EventArgs e)
			{
				mehanizmcalkulyatora.DeystvieCalculatora (mehanizmcalkulyatora.Deystvie.Delenie);
			}

			private void btn_umnojenie_Click(object sender, System.EventArgs e)
			{
				mehanizmcalkulyatora.DeystvieCalculatora (mehanizmcalkulyatora.Deystvie.Umnojenie);
			}

			private void btn_minus_Click(object sender, System.EventArgs e)
			{
				mehanizmcalkulyatora.DeystvieCalculatora (mehanizmcalkulyatora.Deystvie.Vichitanie);
			}

			private void btn_plus_Click(object sender, System.EventArgs e)
			{
				mehanizmcalkulyatora.DeystvieCalculatora (mehanizmcalkulyatora.Deystvie.Slojenie);
			}

			private void btn_ravno_Click(object sender, System.EventArgs e)
			{
				txtOutput.Text = mehanizmcalkulyatora.ZnakRavno();
				mehanizmcalkulyatora.Sbros();
			}

			private void btn_sbros_Click(object sender, System.EventArgs e)
			{
				mehanizmcalkulyatora.Sbros();
				txtOutput.Text = "0";
			}
	}
Листинг 1.9.

Приложение готово (рис. 1.45).

Приложение Calculator

Рис. 1.45. Приложение Calculator

На диске, прилагаемом к книге, вы найдете приложение Calculator (Code\Glava1\ Calculator).

Перемещение по коду, окна Types и Members

При просмотре даже не очень большого листинга, такого как рассмотренный выше, пользоваться полосой прокрутки не слишком удобно. Среда Visual Studio .NET предоставляет окна Types и Members для просмотра типа объектов и их содержимого. При выборе данного объекта в окне Types мы перемещаемся в коде к началу этого объекта (рис. 1.46) , а в окне Members приводятся члены этого объекта (рис. 1.47):

Окно Types. Перечисление Deystvie

Рис. 1.46. Окно Types. Перечисление Deystvie
Окно Members. Перечисление Deystvie

Рис. 1.47. Окно Members. Перечисление Deystvie

Если объект состоит из большого количества членов, удобнее выбирать в окне Members нужный член и перемещаться к его коду в листинге. Окна Types и Members, наряду с окном Class View, используются также для анализа листинга.

Лекция 1: 12345678910 || Лекция 2 >
Елена Дьяконова
Елена Дьяконова

При нажатии на Сумма в примере ArbitraryMethod из Лекция 7, VS 2013 выдается ошибка: 

Необработанное исключение типа "System.InvalidOperationException" в System.Windows.Forms.dll

Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "lblResult" не из того потока, в котором он был создан.

Затем:

Необработанное исключение типа "System.InvalidOperationException" в mscorlib.dll

Дополнительные сведения: Для каждой асинхронной операции метод EndInvoke может вызываться только один раз.

Александр Сороколет
Александр Сороколет

Свойство WindowState формы blank Maximized. Не открывается почемуто на всё окно, а вот если последующую форму бланк открыть уже на макс открывается :-/

Иван Циферблат
Иван Циферблат
Россия, Таганрог, 36, 2000