private bool isImageClicked = false;
ClickedImage imageClicked = ClickedImage.ImageA;
public MainForm {
…
// Установка прямоугольников.
imageRects[0] = new Rectangle(10, 10, 90, 90);
imageRects[1] = new Rectangle(10, 110, 90, 90);
imageRects[2] = new Rectangle (10, 210, 90, 90);
}
private void MainForm_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 = Clickedlmage.ImageB;
this.Text = "Вы щелкнули на изображении В";
} else if (imageRects[2].Contains(mousePt)) {
isImageClicked = true;
imageClicked = ClickedImage.ImageC;
this.Text = "Вы щелкнули на изображении C";
} else { // Попадания не обнаружено, использовать умолчания.
isImageClicked = false;
this.Text = "Проверка попаданий в зону изображения";
}
// Обновление области клиента.
Invalidate;
}
}
Обратите внимание на то, что при последней проверке член-переменная isImagеCliсked устанавливается равной false (ложь), поскольку пользователь не выполнил щелчка ни одном из трех изображений. Это важно, если вы хотите удалить контур у ранее выделенного изображения. После проверки всех элементов область клиента обновляется. Вот как выглядит модифицированный обработчик Paint.
private void MainForm_Paint(object sender, PaintEventArgs e) {
Graphics g = e.Graphics;
// Визуализация изображений.
…
// Прорисовка контура (при щелчке в соответствующем месте)
if (isImageClicked == true) {
Pen outline = new Pen(Color.Tomato, 5);
switch (imageClicked) {
case ClickedImage.ImageA:
g.DrawRectangle(outline, imageRects[0]);
break;
case Clickedlmage.ImageB:
g.DrawRectangle(outline, imageRects[1]);
break;
case ClickedImage.ImageC:
g.DrawRectangle(outline, imageRects[2]);
break;
default:
break;
}
}
}
В данный момент вы уже можете запустить свое приложение и убедиться в том, что контур появляется вокруг каждого изображения, на котором был выполнен щелчок (и что никакого контура не появляется, когда вы щелкаете за пределами этих изображений).
Проверка попадания в область, отличную от прямоугольной
Теперь давайте выясним, как выполнить проверку попадания в область, форма которой отличается от прямоугольника? Предположим, что вы обновили свое приложение так, что теперь в нем отображается геометрический шаблон неправильной формы, и при щелчке на этом шаблоне его тоже требуется выделить с помощью контура (рис. 20.21).
Рис. 20.21. Проверка попадания в многоугольники
Этот геометрический образ был создан на форме с помощью метода FillPath типа Graphics. Указанный метод получает на вход экземпляр объекта GraphicsPath, инкапсулирующий последовательность соединенных линий, кривых и строк. Добавление новых элементов в экземпляр GraphicsPath осуществляется с помощью последовательности связанных методов Add, как описывается в табл. 20.9.
Таблица 20.9. Связанные методы Add класса GraphicsPath