C#. Windows Forms. Исследование событий MouseDown, MouseUp

Исследование событий MouseDown, MouseUp. Программное формирование компонента Label на форме. Пример


Связанные темы


Поиск на других ресурсах:

Условие задачи

Разработать приложение, создающее на форме элемент управления типа Label. Пользователь кликает левой кнопкой мышки на форме, не отпуская ее, совершает движение на форме и отпускает кнопку. Таким образом, пользователь формирует условный прямоугольник на основе координат нажатия и отпускания кнопки мышки. При отпускании кнопки мышки должен создаваться элемент управления типа Label, который размещается в прямоугольной области, образованной кликом на основе углов прямоугольника.

 

Теоретические сведения

Для решения задачи необходимо:

  • в момент нажатия кнопки мыши на форме зафиксировать координаты точки, в которой произошло нажатие (x1; y1). Для этого программируется событие MouseDown;
  • в момент отпускания кнопки мыши зафиксировать координаты точки отпускания (x2; y2). Здесь программируется событие MouseUp.

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

  • перечисление типа MouseButtons. С помощью этого перечисления можно определить, какая кнопка мыши нажата: левая – Left, правая – Right, средняя – Middle и т.д.;
  • свойство Clicks – количество нажатий кнопки мыши;
  • X, Y – координаты X, Y в которых была нажата кнопка мыши;
  • другое.

 

Решение

1. Создание проекта

Создать проект по шаблону Windows Forms. Более подробно об особенностях создания проекта типа Windows Forms описывается здесь.

После создания будет отображаться главная форма приложения, имеющая имя Form1. На форме нет никаких компонентов.

 

2. Объявление внутренних переменных класса формы

Главной форме соответствует класс с именем Form1. В этом классе нужно объявить 4 переменные, которые будут соответствовать координатам прямоугольника, создаваемым пользователем.

...

public partial class Form1 : Form
{
  // Координаты прямоугольника
  int x1, y1, x2, y2;

  ...
}

...

 

3. Программирование события MouseDown формы

Событие MouseDown главной формы Form1 возникает в момент, когда пользователь нажал левую кнопку мышки. На рисунке 1 изображено это событие.

C#. Windows Forms. Событие MouseDown главной формы Form1

Рисунок 1. Событие MouseDown главной формы Form1

В обработчике события Form1_MouseDown() запоминаются координаты позиции, в момент когда была нажата кнопка мышки

// Обработчик события нажатия клавиши мышки
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
  // Запомнить координаты нажатия - использовать класс MouseEventArgs
  x1 = e.X;
  y1 = e.Y;
}

 

4. Программирование события MouseUp главной формы

Событие MouseUp может быть запрограммировано для многих элементов управления (компонент). Это касается и формы Form1. На рисунке 2 показано размещение события MouseUp в окне Properties вкладки Events.

C#. Windows Forms. Событие MouseUp формы Form1

Рисунок 2. Событие MouseUp формы Form1

Для решения нашей задачи в обработчике события MouseUp нужно создать компонент типа Label, настроить его свойства и разместить на форме. Прямоугольная область, занятая компонентом, определяется координатами углов, сформированных обработчиками событий MouseDown (координата x1, y1) и MouseUp (координата x2, y2).

Согласно вышесказанному текст обработчика Form1_MouseUp() имеет следующий вид

// Обработчик события отпускания клавиши мыши
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
  // 1. Объявить ссылку на элемент управления типа Label
  System.Windows.Forms.Label myLabel;

  // 2. Взять координаты (x2, y2)
  x2 = e.X; y2 = e.Y;

  // 3. Нормализовать координаты - привести к конкретным значениям:
  //    x1 должно быть меньше чем x2; y1 должно быть меньше чем y2.
  if (x1 > x2)
  {
    // Обменять значения x1 и x2
    int t = x2; x2 = x1; x1 = t;
  }

  if (y1 > y2)
  {
    // Обменять значения y1 и y2
    int t = y2; y2 = y1; y1 = t;
  }

  // 4. Создать элемент управления типа Label
  // 4.1. Выделить память для экземпляра
  myLabel = new Label();

  // 4.2. Задание свойств, отвечающих за размер и позицию метки
  myLabel.AutoSize = false; // размер должен быть фиксированным
  myLabel.Location = new System.Drawing.Point(x1, y1);
  myLabel.Size = new System.Drawing.Size(Math.Abs(x1 - x2), Math.Abs(y1 - y2));

  // 4.3. Настроить другие свойства
  myLabel.Name = "myLabel";
  myLabel.BorderStyle = BorderStyle.FixedSingle;
  myLabel.Text = "This is myLabel";
  myLabel.TabIndex = this.Controls.Count; // позиция табуляции

  // 4.4. Добавить новый компонент в список формы,
  //      this.Controls - коллекция компонент, размещенных на форме
  this.Controls.Add(myLabel);
}

Теперь после отпускания клавиши мышки (любой клавиши) будет создаваться компонент типа Label.

 


Связанные темы