Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 185

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 179 180 181 182 183 184 < 185 > 186 187 188 189 190 191 .. 320 >> Следующая

Как мы видим, главную роль в проверке попадания играет метод Rectangle.Contains О. Этот метод перегружен и может принимать другой прямоугольник (объект Rectangle), точку (объект Pol nt) или два значения типа int в качестве координат. Этот метод исключительно удобен в ситуации, когда нам необходимо проверить, попал ли пользователь щелчком мыши в прямоугольную область на форме или нет.
Результат работы нашей программы представлен нарис. 9-24. Если пользователь соблазнится возможностями нашей игры и сумеет в ней победить, то в качестве награды его ждет окно сообщения, представленное нарис. 9.25.
t.-i.o.hfuKi Images
Рис. 9.24. Перетаскивание графических объектов и проверка попадания
YoM winl
Рис. 9.25. Настоящая проверка мастерства Код приложения .Draggingimages можно найти в подкаталоге Chapter 9.
Еще о проверке попадания
Реализовать проверку попадания для любого типа, производного от Control, очень просто, поскольку в Control предусмотрен набор событий мыши. Однако как обеспечить проверку попадания не на элемент управления, а в другое место формы, например внутрь границ геометрической фигуры? Давайте изменим наше предыдущее приложение Images таким образом, чтобы реализовать проверку попадания без использования возможностей типа Control.
456 Глава 9 • Графика становится лучше (GDI+)
Рис. 9.26. Выделение изображений
Первая наша задача - обеспечить перехват события MouseDown для самой формы. После этого мы сможем захватывать координаты указателя мыши в момент щелчка и осуществлять проверку — попадает или нет указатель мыши в область, занимаемую одним из изображений. Если ответ положительный, то значения двух переменных изменятся: переменной 1s Imaged і eked (типа bool) будет присвоено значение true, а переменной imaged і cited (типа int) - значение, соответствующее номеру выбранного пользователем изображения. Выглядеть все это может так:
public MainForm : Systaai.Windews.Forms.Гогт
Il Две переменные
private bool IsImageClicked - ialse: private int ImageClicked;
protected void OnMouseDowr, (object sender. MouseEventArg«; e)
I
// Получэеи координаты указателя мыши в «окенг щелчка Point mousePt ¦ new Point(е.Х, e.Y);
Il Проверяем, не попадает ли указатель мыши в одну из трех областей, // занимаемых изображениями .
Какмы помним, в нашем приложении Images на форму было выведено три изображения. При этом ни одно из этих изображений не заключено в PictureBox (что упростило бы задачу). Наша задача — при щелчке пользователя разобраться, в какой именно области формы был произведен этот щелчок, и если щелчок пришелся на какое-либо из изображений, заключить это изображение в красную рамку и изменить заголовок формы (это делается при помощи свойства Form. Text). То, что должно представлено на рис.
Перетаскивание, проверка попадания в область, занимаемую изображением 457
і
Обратите внимание, что в наше приложение добавлена еще одна проверка: для щелчка мыши, который не попадает ни в одно из трех изображений. Эта проверка нужна для удаления рамки с выбранного перед этим изображения.
После того как все нужные нам значения переменных установлены, мы перерисовываем клиентскую область формы. Вот обработчикдля события Paint;
private void M3inForm_Paint(object sender. PaintEventArgs e)
{
Graphics g - e.Graphics:
// Выводим все три изображения
/,-¦' Выводим рамку (по щелчку пользователя)
ifdsImageClicked = - true) {
Pen outline = new PerKCclcr.Red, 5);
swltch(imageClicked) {
case 0:
g.DrawRectangletoutline. rectA): break:
case 1:
g.DrawRectanglefoutline. rectB):
і f (rectA. Conta і ns (mous ePt)) {
і slmageClі eked = true: imageClicked = 0:
this.Text » "You clicked image A";
}
else if(rectB.Cantains(mousePt)) {
islmageClicked = true; imageClicked = 1;
this.Text = "You clicked image B":
}
else if(rectC.Contains(mousePt))
{
islmageClicked = true: imagedicked = 2;
this.Text = "You clicked image C";
// Пользователь не попал в изображения, устанавливаем значения
// по умолчанию
else
{
islmageClicked = false: this.Text = "Images"',
)
// Перерйсовьшеи форі*:^
Invalidate):
458 Глава 9 • Графика становится лучше (GDI+)
break;
case 2:
g.DrawRectangletoutline. rectC):
break; default; break;
Проверка попадания в непрямоугольные области
В предыдущих ситуациях наша задача была относительно простой: нам необходимо было реализовать проверку попадания в прямоугольные области. Однако как быть, есть нам нужно сделать то же самое для более сложной геометрической фигуры? Например, предположим, что нам потребовалось по щелчку пользователя выделять красным контуром фигуру, представленную справа на рис. 9.27.
Рис. 9.27. Как реализовать проверку попадания для фигуры с причудливыми очертаниями?
Странная фигура, представленная на рис. 9.27, была выведена на форму при помощи метода Graphics. FiTl Path С). Этот метод принимает экземпляр объекта, о котором уже упоминалось ранее при рассмотрении пространства имен System.Drawing.Drawing2D. Объект GraphicsPath инкапсулирует набор связанных прямых и кривых линий, строк и тлі. Добавление новых элементов в объект GraphicsPath производится при помощи многочисленных методов Add, представленных в табл. 9.27.
Предыдущая << 1 .. 179 180 181 182 183 184 < 185 > 186 187 188 189 190 191 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100