Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Проверка попадания в область изображения




Проверить попадание курсора мыши в какой-то компонент, производный от класса Control (например, типа PictureBox) очень просто, поскольку такой тип может сам отвечать на события мыши. Но что делать в том случае, когда нужно выполнить проверку в область геометрического шаблона, отображенного на поверхности формы?

Для иллюстрации соответствующего процесса рассмотрим приложение, целью которого является выявление того, что пользователь щелкнул на одном из трех изображений. Выяснив, на каком именно изображении был выполнен щелчок, мы с помощью изменения свойства Text формы выделяем это изображение рамкой шириной 5 пикселей. Первым шагом должно быть определение в классе формы новых переменных, представляющих объекты Rectangle, для которых будет выполняться регистрация события MouseDown. При наступлении такого события нужно программно выяснить, находятся ли поступающие координаты (х, у) в рамках границ объектов Rectangle, используемых для отображения соответствующих прямоугольных областей. Выяснив, что пользователь щелкнул на изображении, мы должны установить закрытую логическую переменную (isImageClicked) равной true (истина) и указать, какое изображение было выбрано, используя для этого другую переменную и соответствующее значение из пользовательского перечня ClickedImage, определенного следующим образом.

 

Enum ClickedImage

{

ImageA, ImageB, ImageC

}

 

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

 

Public partial class Form1: Form

{

Enum ClickedImage

{

ImageA, ImageB, ImageC

}

private Rectangle[] imageRects = new Rectangle[3];

private bool isImageClicked = false;

ClickedImage imageClicked = ClickedImage.ImageA;

Public Form1()

{

InitializeComponent();

//установка прямоугольников

imageRects[0] = new Rectangle(30, 30, 80, 80);

imageRects[1] = new Rectangle(30, 135, 80, 80);

imageRects[2] = new Rectangle(30, 240, 80, 80);

}

Private void Form1_MouseDown(object sender,MouseEventArgs e)

{

//получение координат (х, у) щелчка

Point mousePt = new Point(e.X, e.Y);

//проверка попадания указателя в любой из прямоугольников

if (imageRects[0].Contains(mousePt))

{

isImageClicked = true;

imageClicked = ClickedImage.ImageA;

this.Text = "Вы щелкнули на изображении А";

}

else if (imageRects[1].Contains(mousePt))

{

isImageClicked = true;

imageClicked = ClickedImage.ImageB;

this.Text = "Вы щелкнули на изображении B";

}

else if (imageRects[2].Contains(mousePt))

{

isImageClicked = true;

imageClicked = ClickedImage.ImageC;

this.Text = "Вы щелкнули на изображении C";

}

Else //попадения не обнаружено, использовать умолчания

{

isImageClicked = false;

this.Text = "Проверка попадения в зону изображения";

}

Invalidate();

}

}

 

Обратите внимание на то, что при последней проверке переменная isImageClicked устанавливается равной false (ложь), поскольку пользователь не выполнил щелчка ни одном из трех изображений. Это важно, если нужно удалить рамку у ранее выделенного изображения. После проверки всех элементов клиентская область обновляется. При этом нужно подключить пространство имен System.Drawing.Drawing2D. Обработчик события Paint выглядит следующим образом:

 

Private void Form1_Paint(object sender, PaintEventArgs e)

{

Graphics g = e.Graphics;

Rectangle rect = new Rectangle(10, 10, 50, 50);

LinearGradientBrush gb1 = new LinearGradientBrush(rect, Color.Yellow, Color.Green, LinearGradientMode.BackwardDiagonal);

//визуализация изображений

g.FillRectangle(gb1, imageRects[0]);

LinearGradientBrush gb2 = new LinearGradientBrush(rect, Color.White, Color.Black, LinearGradientMode.ForwardDiagonal);

g.FillRectangle(gb2, imageRects[1]);

LinearGradientBrush gb3 = new LinearGradientBrush(rect, Color.Blue, Color.White, LinearGradientMode.Vertical);

g.FillRectangle(gb3, imageRects[2]);

//прорисовка контура (при щелчке в соответствующем месте)

if (isImageClicked == true)

{

Pen outline = new Pen(Color.Tomato, 5);

Switch (imageClicked)

{

case ClickedImage.ImageA:

g.DrawRectangle(outline, imageRects[0]);

break;

case ClickedImage.ImageB:

g.DrawRectangle(outline, imageRects[1]);

break;

case ClickedImage.ImageC:

g.DrawRectangle(outline, imageRects[2]);

break;

default:

break;

}

}

}

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

 

Рис. 2.4 – Проверка попадания в прямоугольник

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...