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.

 


Споріднені теми