Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
lebtan
0 / 0 / 0
Регистрация: 04.02.2016
Сообщений: 33
1

Как узнать, на какой PictureBox был сделан клик?

27.03.2016, 12:21. Просмотров 972. Ответов 9
Метки нет (Все метки)

Здравствуйте,
подскажите, пожалуйста, как узнать на какой pictureBox был сделан клик? pictureBox создаются динамически в двумерном массиве. Есть метод
C#
1
pic1[i, j].Click += new EventHandler(pictureBox_Click);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2016, 12:21
Ответы с готовыми решениями:

Узнать на каком picturebox был сделан клик
пишу игру puzzle,в нее загружается картинка и разбивается на 16 кусков,каждый...

Определить на какой PictureBox был сделан клик правой кнопкой мыши
Друзья, как в этом безобразии определить на какой PictureBox был сделан клик...

Как определить на какой элемент был клик?
Создал свой элемент управления UserView состоящий из нескольких листбоксов и...

Определить, по какому из PictureBox был произведён клик мышкой
Добрый день. Так получилось, что гугл ничего подсказать не может. Вот...

Узнать, по какому контролу был клик мышкой
На форме несколько компонентов. Как узнать, по которому был сделан очередной...

9
Даценд
Модератор
Эксперт .NET
4205 / 3969 / 2627
Регистрация: 20.04.2015
Сообщений: 7,207
27.03.2016, 12:33 2
lebtan,
sender, приведенный к PictureBox, даст ссылку на PictureBox, запустивший обработчик:
C#
1
2
3
4
private void pictureBox_Click(object sender, EventArgs e)
{
    (sender as PictureBox).Image = // вот
}
0
lebtan
0 / 0 / 0
Регистрация: 04.02.2016
Сообщений: 33
27.03.2016, 13:24  [ТС] 3
Прошу прощения, не совсем понятно как это сделать. Нужно проверить, что в массиве компонентов был нажат pictureBox и его картинка равна искомой.

Добавлено через 5 минут
Что означает это строка:
C#
1
if ((sender as PictureBox).Image==Properties.Resources._10) {}
_10 - это что?

Добавлено через 19 минут
C#
1
2
3
4
5
6
7
8
if ((sender as PictureBox).Image==Properties.Resources._10 ||
                            (sender as PictureBox).Image == Properties.Resources._2 ||
                            (sender as PictureBox).Image == Properties.Resources._6 ||
                            (sender as PictureBox).Image == Properties.Resources._7)
                           
                        {
                            label1.Text = "11";
                        }
Если выбранный элемент двумерного массива имеет загруженную картинку с названиями 10, 2, 6, 7, то...

Но условие не срабатывает...

Добавлено через 14 минут
Даценд,
прошу ответьте, пожалуйста, на мой вопрос. Ничего не получается... Еще раз обрисую задачу: формируется двумерный массив pictureBox с загруженными случайным образом картинками. Если пользователь выбирает картинку и это изображение то, что нужно, то выполняются какие-то действия.
0
Даценд
Модератор
Эксперт .NET
4205 / 3969 / 2627
Регистрация: 20.04.2015
Сообщений: 7,207
27.03.2016, 14:45 4
lebtan,
может такой пример поможет:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Image[] images;
private void Form1_Load(object sender, EventArgs e)
{
    images = new Image[2];
    images[0] = new Bitmap(Properties.Resources._1);
    images[1] = new Bitmap(Properties.Resources._2);
    pictureBox1.Image = images[0];
    pictureBox2.Image = images[1];
}
 
private void pictureBox1_Click(object sender, EventArgs e)
{
    if ((sender as PictureBox).Image == images[1])
    {
        MessageBox.Show("Yes");
    }
}
1
lebtan
0 / 0 / 0
Регистрация: 04.02.2016
Сообщений: 33
27.03.2016, 17:06  [ТС] 5
Скажите, пожалуйста, что у меня неверно:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace Mech_Way
{
    public partial class Form1 : Form
    {
        GroupBox gr = new GroupBox();
        Label lb = new Label();
        Button bt = new Button();
        Button bt1 = new Button();
        Button bt2 = new Button();
        Button bt3 = new Button();
 
        int k1 = 0,k2=0,k3=0;
        PictureBox[,] pic1 = new PictureBox[3, 4];
        private string[] names = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12" };
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            //GroupBox gr = new GroupBox();
            gr.Location = new Point(285, 121);
            gr.Size = new System.Drawing.Size(370, 260);
            gr.Font = new System.Drawing.Font("Helvetica", 12, FontStyle.Italic);
            gr.Text = "Задание 1";
            gr.BackColor = Color.Cornsilk;
            Controls.Add(gr);
 
            //Label lb = new Label();
            lb.Location = new Point(80, 60);
            lb.AutoSize = true;
            lb.TextAlign = ContentAlignment.MiddleCenter;
            lb.Font = new System.Drawing.Font("Helvetica", 12, FontStyle.Regular);
            lb.Text = "Тестирование по теме" + "\n" + "Механическое движение";
            gr.Controls.Add(lb);
 
            //Button bt = new Button();
            bt.Location = new Point(130, 210);
            bt.Size = new System.Drawing.Size(117, 40);
            bt.Font = new System.Drawing.Font("Helvetica", 14, FontStyle.Italic);
            bt.Text = "OK";
            bt.MouseClick += bt_MouseClick;
            gr.Controls.Add(bt);
 
            pictureBox1.Image = Properties.Resources._7;
            
        }
 
        void bt_MouseClick(object sender, MouseEventArgs e)
        {
                Random w_rnd = new Random(13);
 
                int i = 0, j = 0;
                int kk = 1;
                string sd = "";
                for (; i < 3; i++)
                {
                    for (j = 0; j < 4; j++)
                    {
                        PictureBox pic2 = new PictureBox();
                        
 
                        pic2.Location = new Point(300 + (j * 100), 80 + (i * 50));
                        pic2.BorderStyle = BorderStyle.Fixed3D;
                        var randomName = names[w_rnd.Next(names.Length)];
                        pic2.Image = Properties.Resources.ResourceManager.GetObject(randomName) as Bitmap;
 
                        //pic2.Image = Properties.Resources._10;//загрузка конкретного рисунка
                        /* string m = Convert.ToString(kk) + ".png";
                         System.IO.Stream imgStream = this.GetType().Assembly.GetManifestResourceStream(kk);
                         pic2.Image = Image.FromStream(imgStream);*/
 
                        pic2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
                        pic1[i, j] = pic2;
                        pic1[i, j].Click += new EventHandler(pictureBox_Click);
                        Controls.Add(pic1[i, j]);
                        this.Refresh();
                        kk = kk + 1;
                    }
 
                }
               }
 
        void pictureBox_Click(object sender, EventArgs e)
        {
            int i,j;
 
          
                        if ((sender as PictureBox).Image== pic1[0,0].Image ||
                            (sender as PictureBox).Image ==  pic1[0,0].Image  ||
                            (sender as PictureBox).Image ==  pic1[0,0].Image  ||
                            (sender as PictureBox).Image ==  pic1[0,0].Image )
                           
                        {
                            label1.Text = "11";
                        }
                  
                }
            
 
        }
}

Здесь идет обращение к двумерному массиву. Теперь нужно для каждого pictureBox это прописать (в цикле)?

Добавлено через 5 минут
Например, были случайно загружены картинки животных, птиц. При выборе категории "Птицы" и выборе одной картинки, она должна исчезнуть. Подскажите, как это сделать.

Добавлено через 1 час 23 минуты
Почему не срабатывает условие проверки при формировании динамического двумерного массива из pictureBox:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//если категория Животные
                           if (pic1[i, j].Image == Properties.Resources._10 ||
                            pic1[i, j].Image == Properties.Resources._2 ||
                            pic1[i, j].Image == Properties.Resources._6 ||
                            pic1[i, j].Image == Properties.Resources._7)
                        {
                            kk=1;
 
                        }
                       
                        else
                            //если категория Птицы
                            if (pic1[i, j].Image == Properties.Resources._11 ||
                            pic1[i, j].Image == Properties.Resources._3 ||
                            pic1[i, j].Image == Properties.Resources._8 ||
                            pic1[i, j].Image == Properties.Resources._9)
                            {
                                kk = 2;
                            }
0
Даценд
Модератор
Эксперт .NET
4205 / 3969 / 2627
Регистрация: 20.04.2015
Сообщений: 7,207
27.03.2016, 17:42 6
lebtan,
Еще раз о том же.
Не могу точно сказать, почему, когда и как именно меняются ссылки, но факт в том, что ссылка на pic1[i, j].Image и ссылка на Properties.Resources._10 разные, даже несмотря на то, что было присваивание pic1[i, j].Image = Properties.Resources._10.
Поэтому вопрос не в том, почему так, а в том, как это исправить. Я чуть выше предложил использовать в качестве промежуточного звена массив объектов класса Image.
Объясню на примере 2-х PictureBox и 2-х картинок из ресурсов.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Image[] images=new Image[2]; //массив изображений
Image selectedImage; //изображение для проверки
private void Form1_Load(object sender, EventArgs e)
{
    images[0] = new Bitmap(Properties.Resources._1); //заполняем массив images
    images[1] = new Bitmap(Properties.Resources._2); //после чего обращаться к ресурсам не обязательно
    pictureBox1.Image = images[0]; //в первый PictureBox помещаем ссылку на images[0]
    pictureBox2.Image = images[1]; //во второй PictureBox помещаем ссылку на images[1]
    selectedImage = images[1]; //берем изображение для проверки из того же массива
}
 
private void pictureBox1_Click(object sender, EventArgs e)
{
    if ((sender as PictureBox).Image == selectedImage) //если щелкнули по PictureBox для которого установлен тот же Image, что и для selectedImage
    {
        MessageBox.Show("Ye! Bingo! Bravo!"); //ура!
    }
}
1
lebtan
0 / 0 / 0
Регистрация: 04.02.2016
Сообщений: 33
27.03.2016, 19:21  [ТС] 7
Что-то у меня не получается, похоже не догоняю...
0
Вложения
Тип файла: zip WindowsFormsApplication1.zip (66.0 Кб, 3 просмотров)
zna926
345 / 316 / 258
Регистрация: 24.09.2013
Сообщений: 1,946
Записей в блоге: 1
27.03.2016, 19:26 8
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Forms Code
{
         Form1
         {
            InitializeComponent();
            pictureBox1.Click += new EventHandler(pictClicked);
            pictureBox2.Click += new EventHandler(pictClicked);
            ............"..............................".....................
            pictureBoxn.Click += new EventHandler(pictClicked);
          }
 
        private void pictClicked(object sender, EventArgs e)
        {
            MessageBox.Show((sender as PictureBox).Name);    
        }
    
}
1
lebtan
0 / 0 / 0
Регистрация: 04.02.2016
Сообщений: 33
27.03.2016, 19:49  [ТС] 9
Если картинок больше, то "поисковых" картинок больше. Происходит искусственный поиск. Тогда в таком случае проще расположить несколько статических pictureBox и загрузить в них сразу картинки, а далее проверять.
0
Даценд
Модератор
Эксперт .NET
4205 / 3969 / 2627
Регистрация: 20.04.2015
Сообщений: 7,207
27.03.2016, 19:53 10
lebtan,
В проекте из архива не подписан обработчик к событию клика по pictureBox2. Подписать нужно тот же обработчик, что и для pictureBox1, т.е. pictureBox1_Click.
1
27.03.2016, 19:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2016, 19:53

Как обратиться к элементу массива, если он был сделан Сплитом?
Есть строка, например: &quot;Ешь ананасы, рябчиков жуй, День твой последний...

CefSharp. Как "отловить" на каком элементе сделан клик?
Добрый день! Есть вопрос. На форме делаю браузер, но использую не...

Как узнать над каким обеъктом формы сделан MouseDown
Доброго времени суток! Как можно определить на каком именно элементе формы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru