Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
2 / 2 / 0
Регистрация: 04.02.2016
Сообщений: 51

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

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

Студворк — интернет-сервис помощи студентам
Здравствуйте,
подскажите, пожалуйста, как узнать на какой pictureBox был сделан клик? pictureBox создаются динамически в двумерном массиве. Есть метод
C#
1
pic1[i, j].Click += new EventHandler(pictureBox_Click);
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.03.2016, 12:21
Ответы с готовыми решениями:

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

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

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

9
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
27.03.2016, 12:33
lebtan,
sender, приведенный к PictureBox, даст ссылку на PictureBox, запустивший обработчик:
C#
1
2
3
4
private void pictureBox_Click(object sender, EventArgs e)
{
    (sender as PictureBox).Image = // вот
}
0
2 / 2 / 0
Регистрация: 04.02.2016
Сообщений: 51
27.03.2016, 13:24  [ТС]
Прошу прощения, не совсем понятно как это сделать. Нужно проверить, что в массиве компонентов был нажат 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
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
27.03.2016, 14:45
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
2 / 2 / 0
Регистрация: 04.02.2016
Сообщений: 51
27.03.2016, 17:06  [ТС]
Скажите, пожалуйста, что у меня неверно:
Кликните здесь для просмотра всего текста

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
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
27.03.2016, 17:42
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
2 / 2 / 0
Регистрация: 04.02.2016
Сообщений: 51
27.03.2016, 19:21  [ТС]
Что-то у меня не получается, похоже не догоняю...
Вложения
Тип файла: zip WindowsFormsApplication1.zip (66.0 Кб, 8 просмотров)
0
549 / 480 / 315
Регистрация: 24.09.2013
Сообщений: 3,345
Записей в блоге: 1
27.03.2016, 19:26
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
2 / 2 / 0
Регистрация: 04.02.2016
Сообщений: 51
27.03.2016, 19:49  [ТС]
Если картинок больше, то "поисковых" картинок больше. Происходит искусственный поиск. Тогда в таком случае проще расположить несколько статических pictureBox и загрузить в них сразу картинки, а далее проверять.
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
27.03.2016, 19:53
lebtan,
В проекте из архива не подписан обработчик к событию клика по pictureBox2. Подписать нужно тот же обработчик, что и для pictureBox1, т.е. pictureBox1_Click.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.03.2016, 19:53
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru