Как создать круг щелчком мыши winforms
Перейти к содержимому

Как создать круг щелчком мыши winforms

  • автор:

Как создать круг щелчком мыши winforms

Одним из преимуществ разработки в Visual Studio приложений Windows Forms является наличие графического редактора, который позволяет в графическом виде представить создаваемую форму и в принципе упрощает работу с графическими компонентами.

Для открытия формы в режиме графического дизайнера нажмем на в структуре проекта на файл Form1.cs либо левой кнопкой мыши двойным кликом, либо правой кнопкой мыши и в появившемся контекстном меню выберем View Designer (также можно использовать комбинацию клавиш Shift+F7)

первое приложение Windows Forms на C#

После этого в Visual Studio откроется выбранная форма в графическом виде.

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

При выборе формы в окне дизайнера внизу справа под структурой проекта мы сможем найти окно Properties (Свойства). Так как у меня в данный момент выбрана форма как элемент управления, то в этом поле отображаются свойства, связанные с формой.

Теперь найдем в этом окне свойство формы Text и изменим его значение на любое другое:

окно свойств и Windows forms в Visual Studio

Таким образом мы поменяли заголовок формы. И подобным образом мы можем поменять другие свойства формы, которые доступны в окне свойств.

Но Visual Studio имеет еще одну связанную функциональность. Она обладает панелью графических инструментов. И мы можем, вместо создания элементов управления в коде C#, просто переносить их на форму с панели инструментов с помощь мыши. Так, перенесем на форму какой-нибудь элемент управления, например, кнопку. Для этого найдем в левой части Visual Studio вкладку Toolbox (Панель инструментов) . Нажмем на эту вкладку, и у нас откроется панель с элементами, откуда мы можем с помощью мыши перенести на форму любой элемент:

панель инструментов Toolbox и Windows forms в Visual Studio

Найдем среди элементов кнопку и, захватив ее указателем мыши, перенесем на форму:

Button from Toolbox и Windows forms в Visual Studio

Причем при выборе кнопки она открывается в окне свойств и, как и для всей формы, для кнопки в окне свойств мы можем изменить значения различных свойств.

Кроме того, если после переноса кнопки на форму мы откроем файл Form1.

namespace HelloApp < partial class Form1 < /// /// Required designer variable. /// private System.ComponentModel.IContainer components = null; /// /// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) < if (disposing && (components != null)) < components.Dispose(); >base.Dispose(disposing); > #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() < this.button1 = new System.Windows.Forms.Button(); this.SuspendLayout(); // // button1 // this.button1.Location = new System.Drawing.Point(312, 187); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(94, 29); this.button1.TabIndex = 0; this.button1.Text = "button1"; this.button1.UseVisualStyleBackColor = true; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(800, 450); this.Controls.Add(this.button1); this.Name = "Form1"; this.Text = "METANIT.COM"; this.ResumeLayout(false); >#endregion private Button button1; > >

Мы видим, что в класс Form1 была добавлена переменная button1 типа Button и для этой переменной, как и для объекта формы, задан ряд свойств. И если в окне свойств мы поменяем значения этих свойств, то в этом файле также изменяться их значения. Как в случае с текстом формы:

this.Text = "METANIT.COM";

Это визуальная часть. Теперь приступим к самому программированию. Добавим простейший код на языке C#, который бы выводил сообщение по нажатию кнопки. Для этого перейдем в файл кода Form1.cs , который связан с этой формой. По умолчанию после создания проекта он имеет код типа следующего:

namespace HelloApp < public partial class Form1 : Form < public Form1() < InitializeComponent(); >> >

Изменим этот код следующим образом:

namespace HelloApp < public partial class Form1 : Form < public Form1() < InitializeComponent(); button1.Click += button1_Click; >private void button1_Click(object? sender, EventArgs e) < MessageBox.Show("Привет"); >> >

Кнопка обладает событием Click , которое генерируется при нажатии. В данном случае в конструкторе формы мы подвязываем к кнопке button1 в качестве обработчика события нажатия метод button1_Click , в котором с помощью метода MessageBox.Show выводит сообщение. Текст сообщения передается в метод в качестве параметра.

Стоит отметить, что графический дизайнер позволяет автоматически сгенерировать обработчик нажатия кнопки. Для этого надо в окне дизайнера нажать на кнопку на форме двойным щелчком мыши.

Теперь запустим проект и мы увидим форму с кнопкой, на которую мы можем нажать и получить сообщение:

Практическое руководство. Распознавание одиночных и двойных щелчков

Как правило, одиночное событие щелчок инициирует действие пользовательского интерфейса, а событие двойной щелчок расширяет его. Например, одним щелчком мыши обычно выбирается элемент, а двойным щелчком мыши этот элемент изменяется. Однако события щелчков Windows Forms непросто приспособить к сценарию, в котором щелчок и двойной щелчок выполняют несовместимые действия, поскольку действие, привязанное к событию Click или MouseClick, выполняется перед действием, привязанным к событию DoubleClick или MouseDoubleClick. В этом разделе показаны два способа решения этой проблемы. Одним из решений является обработка события двойного щелчка и откат действий при обработке события щелчка. В редких случаях может потребоваться имитировать поведение при одинарном и двойном щелчке при обработке событий MouseDown и с помощью свойств DoubleClickTime и DoubleClickSize класса SystemInformation. Производится измерение времени между щелчками мышью и, если второе нажатие происходит до того, как DoubleClickTime достигнет значения и кнопка мыши была нажата, когда курсор находился в прямоугольнике, заданном DoubleClickSize, то выполняется действие двойного щелчка; в противном случае выполняется действие щелчка.

Выполнение отката щелчка кнопкой мыши

  • Убедитесь, что элемент управления, с которым вы работаете, имеет стандартное поведение при двойном щелчке мышью. В противном случае задействуйте элемент управления с помощью метода SetStyle. Обработайте событие двойного щелчка и откат к одиночному щелчку кнопкой мыши, а также действие двойного щелчка. В следующем примере кода показано, как создать пользовательскую кнопку с включенным двойным щелчком мыши, а также как откатить к одиночному щелчку в коде обработки событий двойного щелчка.
using System; using System.ComponentModel; using System.Drawing; using System.Text; using System.Windows.Forms; namespace MouseRollBackSingleClick < public class Form1 : Form < private DoubleClickButton button1; private FormBorderStyle initialStyle; public Form1() < initialStyle = this.FormBorderStyle; this.ClientSize = new System.Drawing.Size(292, 266); button1 = new DoubleClickButton(); button1.Location = new Point (40,40); button1.Click += new EventHandler(button1_Click); button1.AutoSize = true; this.AllowDrop = true; button1.Text = "Click or Double Click"; button1.DoubleClick += new EventHandler(button1_DoubleClick); this.Controls.Add(button1); >// Handle the double click event. void button1_DoubleClick(object sender, EventArgs e) < // Change the border style back to the initial style. this.FormBorderStyle = initialStyle; MessageBox.Show("Rolled back single click change."); >// Handle the click event. void button1_Click(object sender, EventArgs e) < this.FormBorderStyle = FormBorderStyle.FixedToolWindow; >[STAThread] static void Main() < Application.EnableVisualStyles(); Application.Run(new Form1()); >> public class DoubleClickButton : Button < public DoubleClickButton() : base() < // Set the style so a double click event occurs. SetStyle(ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, true); >> > 
Imports System.ComponentModel Imports System.Drawing Imports System.Text Imports System.Windows.Forms Public Class Form1 Inherits Form Private WithEvents button1 As DoubleClickButton Private initialStyle As FormBorderStyle Public Sub New() Me.SuspendLayout() initialStyle = Me.FormBorderStyle Me.ClientSize = New System.Drawing.Size(292, 266) button1 = New DoubleClickButton() button1.Location = New Point(40, 40) button1.AutoSize = True button1.Text = "Click or Double Click" Me.Controls.Add(button1) Me.Name = "Form1" Me.ResumeLayout(False) Me.PerformLayout() End Sub ' Handle the double click event. Private Sub button1_DoubleClick(ByVal sender As Object, ByVal e As EventArgs) _ Handles button1.DoubleClick ' Change the border style back to the initial style. Me.FormBorderStyle = initialStyle MessageBox.Show("Rolled back single click change.") End Sub ' Handle the click event. Private Sub button1_Click(ByVal sender As Object, ByVal e As EventArgs) _ Handles button1.Click Me.FormBorderStyle = FormBorderStyle.FixedToolWindow End Sub _ Shared Sub Main() Application.EnableVisualStyles() Application.Run(New Form1()) End Sub End Class Public Class DoubleClickButton Inherits Button Public Sub New() ' Set the style so a double click event occurs. SetStyle(ControlStyles.StandardClick Or ControlStyles.StandardDoubleClick, True) End Sub End Class 

Различение щелчков в событии MouseDown

  • Обработайте событие MouseDown и определите расположение и временной интервал между щелчками с помощью соответствующего свойства SystemInformation и компонента Timer. Выполните необходимые действия в зависимости от того, имеет ли место щелчок или двойной щелчок кнопкой мыши. В следующем примере кода показано, как это сделать.
#using #using #using using namespace System; using namespace System::Drawing; using namespace System::Windows::Forms; namespace SingleVersusDoubleClick < public ref class Form1 : public Form < private: Rectangle hitTestRectangle; private: Rectangle doubleClickRectangle; private: TextBox^ outputBox; private: Timer^ doubleClickTimer; private: ProgressBar^ doubleClickBar; private: Label^ hitTestLabel; private: Label^ timerLabel; private: bool isFirstClick; private: bool isDoubleClick; private: int milliseconds; public: Form1() < hitTestRectangle = Rectangle(); hitTestRectangle.Location = Point(30, 20); hitTestRectangle.Size = System::Drawing::Size(100, 40); doubleClickRectangle = Rectangle(); outputBox = gcnew TextBox(); outputBox->Location = Point(30, 120); outputBox->Size = System::Drawing::Size(200, 100); outputBox->AutoSize = false; outputBox->Multiline = true; doubleClickTimer = gcnew Timer(); doubleClickTimer->Interval = 100; doubleClickTimer->Tick += gcnew EventHandler(this, &Form1::doubleClickTimer_Tick); doubleClickBar = gcnew ProgressBar(); doubleClickBar->Location = Point(30, 85); doubleClickBar->Minimum = 0; doubleClickBar->Maximum = SystemInformation::DoubleClickTime; hitTestLabel = gcnew Label(); hitTestLabel->Location = Point(30, 5); hitTestLabel->Size = System::Drawing::Size(100, 15); hitTestLabel->Text = "Hit test rectangle:"; timerLabel = gcnew Label(); timerLabel->Location = Point(30, 70); timerLabel->Size = System::Drawing::Size(100, 15); timerLabel->Text = "Double click timer:"; isFirstClick = true; this->Paint += gcnew PaintEventHandler(this, &Form1::Form1_Paint); this->MouseDown += gcnew MouseEventHandler(this, &Form1::Form1_MouseDown); this->Controls-> AddRange(gcnew array < doubleClickBar, outputBox, hitTestLabel, timerLabel >); > // Detect a valid single click or double click. private: void Form1_MouseDown(Object^ sender, MouseEventArgs^ e) < // Verify that the mouse click is in the main hit // test rectangle. if (!hitTestRectangle.Contains(e->Location)) < return; >// This is the first mouse click. if (isFirstClick) < isFirstClick = false; // Determine the location and size of the double click // rectangle area to draw around the cursor point. doubleClickRectangle = Rectangle( e->X - (SystemInformation::DoubleClickSize.Width / 2), e->Y - (SystemInformation::DoubleClickSize.Height / 2), SystemInformation::DoubleClickSize.Width, SystemInformation::DoubleClickSize.Height); Invalidate(); // Start the double click timer. doubleClickTimer->Start(); > // This is the second mouse click. else < // Verify that the mouse click is within the double click // rectangle and is within the system-defined double // click period. if (doubleClickRectangle.Contains(e->Location) && milliseconds < SystemInformation::DoubleClickTime) < isDoubleClick = true; >> > private: void doubleClickTimer_Tick(Object^ sender, EventArgs^ e) < milliseconds += 100; doubleClickBar->Increment(100); // The timer has reached the double click time limit. if (milliseconds >= SystemInformation::DoubleClickTime) < doubleClickTimer->Stop(); if (isDoubleClick) < outputBox->AppendText("Perform double click action"); outputBox->AppendText(Environment::NewLine); > else < outputBox->AppendText("Perform single click action"); outputBox->AppendText(Environment::NewLine); > // Allow the MouseDown event handler to process clicks again. isFirstClick = true; isDoubleClick = false; milliseconds = 0; doubleClickBar->Value = 0; > > // Paint the hit test and double click rectangles. private: void Form1_Paint(Object^ sender, PaintEventArgs^ e) < // Draw the border of the main hit test rectangle. e->Graphics->DrawRectangle(Pens::Black, hitTestRectangle); // Fill in the double click rectangle. e->Graphics->FillRectangle(Brushes::Blue, doubleClickRectangle); > >; > [STAThread] int main()
using System; using System.Drawing; using System.Windows.Forms; namespace SingleVersusDoubleClick < class Form1 : Form < private Rectangle hitTestRectangle = new Rectangle(); private Rectangle doubleClickRectangle = new Rectangle(); private TextBox textBox1 = new TextBox(); private Timer doubleClickTimer = new Timer(); private ProgressBar doubleClickBar = new ProgressBar(); private Label label1 = new Label(); private Label label2 = new Label(); private bool isFirstClick = true; private bool isDoubleClick = false; private int milliseconds = 0; [STAThread] public static void Main() < Application.EnableVisualStyles(); Application.Run(new Form1()); >public Form1() < label1.Location = new Point(30, 5); label1.Size = new Size(100, 15); label1.Text = "Hit test rectangle:"; label2.Location = new Point(30, 70); label2.Size = new Size(100, 15); label2.Text = "Double click timer:"; hitTestRectangle.Location = new Point(30, 20); hitTestRectangle.Size = new Size(100, 40); doubleClickTimer.Interval = 100; doubleClickTimer.Tick += new EventHandler(doubleClickTimer_Tick); doubleClickBar.Location = new Point(30, 85); doubleClickBar.Minimum = 0; doubleClickBar.Maximum = SystemInformation.DoubleClickTime; textBox1.Location = new Point(30, 120); textBox1.Size = new Size(200, 100); textBox1.AutoSize = false; textBox1.Multiline = true; this.Paint += new PaintEventHandler(Form1_Paint); this.MouseDown += new MouseEventHandler(Form1_MouseDown); this.Controls.AddRange(new Control[] < doubleClickBar, textBox1, label1, label2 >); > // Detect a valid single click or double click. void Form1_MouseDown(object sender, MouseEventArgs e) < // Verify that the mouse click is in the main hit // test rectangle. if (!hitTestRectangle.Contains(e.Location)) < return; >// This is the first mouse click. if (isFirstClick) < isFirstClick = false; // Determine the location and size of the double click // rectangle area to draw around the cursor point. doubleClickRectangle = new Rectangle( e.X - (SystemInformation.DoubleClickSize.Width / 2), e.Y - (SystemInformation.DoubleClickSize.Height / 2), SystemInformation.DoubleClickSize.Width, SystemInformation.DoubleClickSize.Height); Invalidate(); // Start the double click timer. doubleClickTimer.Start(); >// This is the second mouse click. else < // Verify that the mouse click is within the double click // rectangle and is within the system-defined double // click period. if (doubleClickRectangle.Contains(e.Location) && milliseconds < SystemInformation.DoubleClickTime) < isDoubleClick = true; >> > void doubleClickTimer_Tick(object sender, EventArgs e) < milliseconds += 100; doubleClickBar.Increment(100); // The timer has reached the double click time limit. if (milliseconds >= SystemInformation.DoubleClickTime) < doubleClickTimer.Stop(); if (isDoubleClick) < textBox1.AppendText("Perform double click action"); textBox1.AppendText(Environment.NewLine); >else < textBox1.AppendText("Perform single click action"); textBox1.AppendText(Environment.NewLine); >// Allow the MouseDown event handler to process clicks again. isFirstClick = true; isDoubleClick = false; milliseconds = 0; doubleClickBar.Value = 0; > > // Paint the hit test and double click rectangles. void Form1_Paint(object sender, PaintEventArgs e) < // Draw the border of the main hit test rectangle. e.Graphics.DrawRectangle(Pens.Black, hitTestRectangle); // Fill in the double click rectangle. e.Graphics.FillRectangle(Brushes.Blue, doubleClickRectangle); >> > 
Imports System.Drawing Imports System.Windows.Forms Namespace SingleVersusDoubleClick Class Form1 Inherits Form Private hitTestRectangle As New Rectangle() Private doubleClickRectangle As New Rectangle() Private textBox1 As New TextBox() Private WithEvents doubleClickTimer As New Timer() Private doubleClickBar As New ProgressBar() Private label1 As New Label() Private label2 As New Label() Private isFirstClick As Boolean = True Private isDoubleClick As Boolean = False Private milliseconds As Integer = 0 _ Public Shared Sub Main() Application.EnableVisualStyles() Application.Run(New Form1()) End Sub Public Sub New() label1.Location = New Point(30, 5) label1.Size = New Size(100, 15) label1.Text = "Hit test rectangle:" label2.Location = New Point(30, 70) label2.Size = New Size(100, 15) label2.Text = "Double click timer:" hitTestRectangle.Location = New Point(30, 20) hitTestRectangle.Size = New Size(100, 40) doubleClickTimer.Interval = 100 doubleClickBar.Location = New Point(30, 85) doubleClickBar.Minimum = 0 doubleClickBar.Maximum = SystemInformation.DoubleClickTime textBox1.Location = New Point(30, 120) textBox1.Size = New Size(200, 100) textBox1.AutoSize = False textBox1.Multiline = True Me.Controls.Add(doubleClickBar) Me.Controls.Add(textBox1) Me.Controls.Add(label1) Me.Controls.Add(label2) End Sub ' Detect a valid single click or double click. Sub Form1_MouseDown(ByVal sender As Object, _ ByVal e As MouseEventArgs) Handles Me.MouseDown ' Verify that the mouse click is in the main hit ' test rectangle. If Not hitTestRectangle.Contains(e.Location) Then Return End If ' This is the first mouse click. If isFirstClick = True Then isFirstClick = False ' Determine the location and size of the double click ' rectangle to draw around the cursor point. doubleClickRectangle = New Rectangle( _ e.X - (SystemInformation.DoubleClickSize.Width / 2), _ e.Y - (SystemInformation.DoubleClickSize.Height / 2), _ SystemInformation.DoubleClickSize.Width, _ SystemInformation.DoubleClickSize.Height) Invalidate() ' Start the double click timer. doubleClickTimer.Start() ' This is the second mouse click. Else ' Verify that the mouse click is within the double click ' rectangle and is within the system-defined double ' click period. If doubleClickRectangle.Contains(e.Location) And _ milliseconds < SystemInformation.DoubleClickTime Then isDoubleClick = True End If End If End Sub Sub doubleClickTimer_Tick(ByVal sender As Object, _ ByVal e As EventArgs) Handles doubleClickTimer.Tick milliseconds += 100 doubleClickBar.Increment(100) ' The timer has reached the double click time limit. If milliseconds >= SystemInformation.DoubleClickTime Then doubleClickTimer.Stop() If isDoubleClick Then textBox1.AppendText("Perform double click action") textBox1.AppendText(Environment.NewLine) Else textBox1.AppendText("Perform single click action") textBox1.AppendText(Environment.NewLine) End If ' Allow the MouseDown event handler to process clicks again. isFirstClick = True isDoubleClick = False milliseconds = 0 doubleClickBar.Value = 0 End If End Sub ' Paint the hit test and double click rectangles. Sub Form1_Paint(ByVal sender As Object, _ ByVal e As PaintEventArgs) Handles Me.Paint ' Draw the border of the main hit test rectangle. e.Graphics.DrawRectangle(Pens.Black, hitTestRectangle) ' Fill in the double click rectangle. e.Graphics.FillRectangle(Brushes.Blue, doubleClickRectangle) End Sub End Class End Namespace 

Компиляция кода

Для этих примеров требуются:

  • ссылки на сборки System, System.Drawing и System.Windows.Forms.

См. также

Событие MouseWheel формы, Windows Form

Мне нужно, чтобы при прокрутке колесика мыши изменялась прозрачность формы. Но я не очень понимаю, как в коде прописать это событие. Получается прописать его для какого-нибудь объекта, например picturebox, а вот для самой формы непонятно как!

Отслеживать
задан 5 дек 2020 в 18:30
11 1 1 бронзовый знак

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Вот долго думала, а как только задала вопрос — сразу же нашла решение. 🙂

public Form1() < InitializeComponent(); this.MouseWheel += Form1_MouseWheel; >private void Form1_MouseWheel(object sender, MouseEventArgs e) < //код >

Отслеживать
ответ дан 5 дек 2020 в 18:45
11 1 1 бронзовый знак

    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.4.30.8420

Использование событий мыши (Windows Forms .NET)

В большинстве программ Windows Forms для обработки ввода с помощью мыши используются события мыши. В этой статье содержится обзор событий мыши, включая сведения об использовании и предоставляемые данные для каждого события. Дополнительные сведения о событиях в целом см. в разделе Общие сведения о событиях (Windows Forms .NET).

Документация по рабочему столу для .NET 7 и .NET 6 находится в стадии разработки.

События мыши

Основной способ реагирования на ввод с помощью мыши заключается в обработке событий мыши. В следующей таблице показаны события мыши и описание их возникновения.

Событие мыши Description
Click Это событие возникает при отпускании кнопки мыши, как правило, перед событием MouseUp. Обработчик этого события принимает аргумент типа EventArgs. Обрабатывать это событие следует в случае, если нужно только определить, когда происходит щелчок.
MouseClick Это событие возникает, когда пользователь щелкает элемент управления. Обработчик этого события принимает аргумент типа MouseEventArgs. Обрабатывать это событие следует в случае, когда необходимо получить сведения о мыши при щелчке.
DoubleClick Это событие происходит при двойном щелчке элемента управления. Обработчик этого события принимает аргумент типа EventArgs. Обрабатывать это событие следует в случае, если нужно только определить, когда происходит двойной щелчок.
MouseDoubleClick Это событие возникает, когда пользователь дважды щелкает мышью. Обработчик этого события принимает аргумент типа MouseEventArgs. Обрабатывать это событие следует в случае, когда необходимо получить сведения о мыши при двойном щелчке.
MouseDown Это событие происходит при нажатии пользователем кнопки мыши, когда указатель мыши находится на элементе управления. Обработчик этого события принимает аргумент типа MouseEventArgs.
MouseEnter Это событие возникает, когда указатель мыши перемещается на границу или клиентскую область элемента управления в зависимости от типа элемента управления. Обработчик этого события принимает аргумент типа EventArgs.
MouseHover Это событие возникает при остановке и помещении указателя мыши на элемент управления. Обработчик этого события принимает аргумент типа EventArgs.
MouseLeave Это событие возникает, когда указатель мыши покидает границу или клиентскую область элемента управления в зависимости от типа элемента управления. Обработчик этого события принимает аргумент типа EventArgs.
MouseMove Это событие возникает при перемещении указателя мыши на элемент управления. Обработчик этого события принимает аргумент типа MouseEventArgs.
MouseUp Это событие возникает, когда указатель мыши находится на элементе управления и пользователь отпускает кнопку мыши. Обработчик этого события принимает аргумент типа MouseEventArgs.
MouseWheel Это событие возникает, когда пользователь вращает колесико мыши, когда фокус находится на элементе управления. Обработчик этого события принимает аргумент типа MouseEventArgs. Для определения того, насколько прокручено колесико мыши, можно использовать свойство Delta элемента MouseEventArgs.

Сведения о мыши

Объект MouseEventArgs отправляется обработчикам событий мыши, связанных с нажатием кнопки мыши и отслеживанием ее движений. Объект MouseEventArgs предоставляет сведения о текущем состоянии мыши, включая положение указателя мыши в клиентских координатах, какие кнопки мыши нажаты и произошла ли прокрутка колесика мыши. Некоторые события мыши, например те, которые возникают, когда указатель мыши пересек границы элемента управления, отправляют обработчику событий объект EventArgs без подробных сведений.

Если нужно знать текущее состояние кнопок мыши или положение ее указателя, но при этом избежать обработки события мыши, можно также использовать свойства MouseButtons и MousePosition класса Control. Свойство MouseButtons возвращает сведения о том, какие кнопки мыши в настоящее время нажаты. Свойство MousePosition возвращает экранные координаты указателя мыши, которые эквивалентны значению, возвращаемому методом Position.

Преобразование между экранными и клиентскими координатами

Так как некоторые сведения о положении мыши представлены в клиентских координатах, а другие — в экранных, может потребоваться преобразовать точку из одной системы координат в другую. Это легко сделать с помощью методов PointToClient и PointToScreen, доступных в классе Control.

Стандартное поведение события щелчка

Если требуется обрабатывать события щелчка мыши в определенном порядке, необходимо знать порядок, в котором вызываются события щелчка в элементах управления Windows Forms. Когда любая поддерживаемая кнопка мыши нажимается и отпускается, все элементы управления Windows Forms, кроме отмеченных в списке ниже, вызывают события щелчка в одном и том же порядке. Ниже приведен порядок событий, вызываемых одинарным щелчком мыши.

  1. СобытиеMouseDown .
  2. СобытиеClick .
  3. СобытиеMouseClick .
  4. СобытиеMouseUp .

Ниже приведен порядок событий, вызываемых двойным щелчком мыши.

  1. СобытиеMouseDown .
  2. СобытиеClick .
  3. СобытиеMouseClick .
  4. СобытиеMouseUp .
  5. СобытиеMouseDown .
  6. СобытиеDoubleClick . Может изменяться в зависимости от того, установлено ли для бита стиля StandardDoubleClick элемента управления значение true . Подробнее о настройке бита ControlStyles см. в разделе, посвященном методу SetStyle.
  7. СобытиеMouseDoubleClick .
  8. СобытиеMouseUp .

Особые элементы управления

Поведение перечисленных ниже элементов управления при щелчке мыши не соответствует стандартному.

Примечание. Если пользователь щелкает поле редактирования, кнопку или элемент в списке, то для элемента управления ComboBox возникают описанные ниже события.

  • Щелчок левой кнопкой мыши: Click, MouseClick
  • Щелкните правой кнопкой мыши: события щелчка не возникают
  • Двойной щелчок левой кнопкой мыши: Click, MouseClick; Click, MouseClick
  • Дважды щелкните правой кнопкой мыши: события щелчка не возникают

Примечание. Если пользователь щелкает любое место внутри этих элементов управления, то возникают описанные ниже события.

  • Щелчок левой кнопкой мыши: Click, MouseClick
  • Щелкните правой кнопкой мыши: события щелчка не возникают
  • Двойной щелчок левой кнопкой мыши: Click, MouseClick, DoubleClick, MouseDoubleClick
  • Дважды щелкните правой кнопкой мыши: события щелчка не возникают

Примечание. Указанные ниже события возникают только в том случае, если пользователь щелкает элементы в ListView. Если пользователь щелкает мышью в любом другом месте элемента управления, то события не вызываются. В дополнение к событиям, описанным ниже, существуют события BeforeLabelEdit и AfterLabelEdit, которые могут представлять интерес, если нужно выполнять проверку с помощью элемента управления ListView.

  • Щелчок левой кнопкой мыши: Click, MouseClick
  • Щелчок правой кнопкой мыши: Click, MouseClick
  • Двойной щелчок левой кнопкой мыши: Click, MouseClick; DoubleClick, MouseDoubleClick
  • Двойной щелчок правой кнопкой мыши: Click, MouseClick; DoubleClick, MouseDoubleClick

Примечание. Указанные ниже события возникают только в том случае, если пользователь щелкает сами элементы или справа от них в элементе управления TreeView. Если пользователь щелкает мышью в любом другом месте элемента управления, то события не вызываются. В дополнение к событиям, описанным ниже, существуют события BeforeCheck, BeforeSelect, BeforeLabelEdit, AfterSelect, AfterCheck и AfterLabelEdit, которые могут представлять интерес, если нужно выполнять проверку с помощью элемента управления TreeView.

  • Щелчок левой кнопкой мыши: Click, MouseClick
  • Щелчок правой кнопкой мыши: Click, MouseClick
  • Двойной щелчок левой кнопкой мыши: Click, MouseClick; DoubleClick, MouseDoubleClick
  • Двойной щелчок правой кнопкой мыши: Click, MouseClick; DoubleClick, MouseDoubleClick

Поведение отрисовки для переключателей

Переключатели, такие как элементы управления, производные от класса ButtonBase, имеют описанное ниже нестандартное поведение отрисовки в сочетании с событиями щелчка.

  1. Пользователь нажимает кнопку мыши.
  2. Элемент управления отрисовывается в состоянии «нажато».
  3. Возникает событие MouseDown.
  4. Пользователь отпускает кнопку мыши.
  5. Элемент управления отрисовывается в состоянии «отпущено».
  6. Возникает событие Click.
  7. Возникает событие MouseClick.
  8. Возникает событие MouseUp.

Примечание. Если пользователь перемещает указатель за границы переключателя при нажатой кнопке мыши (например, перемещает указатель мыши за границы элемента управления Button, когда он нажат), переключатель будет отрисовываться в состоянии «отпущено» и происходит только событие MouseUp. События Click и MouseClick в этой ситуации не наступают.

См. также

  • Общие сведения об использовании мыши (Windows Forms .NET)
  • Управление указателями мыши (Windows Forms .NET)
  • Как имитировать события мыши (Windows Forms .NET)
  • System.Windows.Forms.Control

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *