Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
 Аватар для jlevistk
239 / 234 / 8
Регистрация: 05.05.2011
Сообщений: 1,553

Выбор picturebox.

16.05.2011, 12:45. Показов 1645. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Пытаюсь разработать игру, типо шахмат, но до завершения мне пока еще далеко.
Учась на примерах, столкнулся с проблемой. Как можно сделать так, чтобы при нажатии на PictureBox, картинка в нем, менялась на другую? Вернее я не понимаю как определить то, какая из картинок будет нажата. Про что почитать стоит? Или какое есть решение?
Думал, что будет что-то типо :
C#
1
2
3
4
5
6
pic[*, *].Click += new EventHandler(Form1_Click);  
  
        void Form1_Click(object sender, EventArgs e)
        {
            pic[*, *].image = Image.FromFile(@"C:\Kursovik\234.bmp");
        }
Но так сделать нельзя... да и * как я понял тоже нельзя применить.
Вот код программы
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication7
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            button1.Click += new EventHandler(button1_Click);
        }
 
        void button1_Click(object sender, EventArgs e)
        {
            pic_arr(null);
        }
 
        public void pic_arr(Form1 fm)
        {
            int d = 0, v = 0;
            MessageBox.Show("1234");
           PictureBox[,] pic = new PictureBox[7,7];
            for (int i = 0; i < 7; i++)
            {
                v = 0;
                for (int j = 0; j < 7; j++)
                {
                    pic[i,j] = new PictureBox();
                    pic[i, j].Location = new Point(d,v);
                    pic[i, j].Size = new Size(50,50);
                    pic[i, j].Parent = fm;
                    pic[i, j].Image = Image.FromFile(@"C:\Kursovik\233.bmp");
                    pic[i, j].Name = "Picbox_" + i.ToString() + "_" + j.ToString();
                    this.Controls.Add(pic[i,j]);
                    v = v + 50;
                }
                d = d + 50;
            }
 
        }
 
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.05.2011, 12:45
Ответы с готовыми решениями:

Выбор необходимого pictureBox
Здравствуйте! Имеется 7 pictureBoxов на форме и две функции, которые возвращают значение N1 и N2 от 1 до 7. Подскажите, пожалуйста,...

Выбор значения из PictureBox
В проекте имеется 3-и формы: основная-Form1 и Form2, Form3. На главной расположен PictureBox и кнопки которые листают картинки в нем. ...

Выбор отдельного изображения на picturebox
Собственно я написал небольшую прогу, которая позволяет рисовать 3 фигуры (круг, квадрат, треугольник) в pictureBox используя Bitmap, а так...

15
334 / 270 / 18
Регистрация: 19.01.2011
Сообщений: 597
16.05.2011, 13:57
Какая среда используется? WPF или Winforms?
0
Кодило
 Аватар для r0fL
251 / 179 / 23
Регистрация: 25.11.2009
Сообщений: 685
16.05.2011, 14:07
Winsor,
C#
1
2
3
using System.Windows.Forms;
 
namespace WindowsFormsApplication7
0
 Аватар для jlevistk
239 / 234 / 8
Регистрация: 05.05.2011
Сообщений: 1,553
16.05.2011, 15:16  [ТС]
WindowsForm
0
334 / 270 / 18
Регистрация: 19.01.2011
Сообщений: 597
16.05.2011, 15:20
Ну как один из вариантов.
Запустите проект и понажымайте мышкой на доску.
Упс... а аттача нету...
0
334 / 270 / 18
Регистрация: 19.01.2011
Сообщений: 597
16.05.2011, 15:21
Еще раз..
Вложения
Тип файла: 7z WindowsFormsApplication4.7z (27.0 Кб, 20 просмотров)
1
 Аватар для jlevistk
239 / 234 / 8
Регистрация: 05.05.2011
Сообщений: 1,553
16.05.2011, 15:28  [ТС]
Эм... спасибо! А есть ли еще какие-нибудь варианты?
0
Заблокирован
16.05.2011, 15:29
может пригодится: клик
1
334 / 270 / 18
Регистрация: 19.01.2011
Сообщений: 597
16.05.2011, 15:32
Непонял, какие именно еще варианты есть? Вернее что именно в вариантах интересует?
0
 Аватар для jlevistk
239 / 234 / 8
Регистрация: 05.05.2011
Сообщений: 1,553
16.05.2011, 16:03  [ТС]
Ну... даже не знаю=)

А например если нужно сделать, чтобы я нажимал на пикчер бокс с фигурой, и мне надо было бы переместить его в соседнюю клетку. Это как выглядеть должно?

Мне просто необходимо менять location?
хотя я в коде не вижу такого
0
334 / 270 / 18
Регистрация: 19.01.2011
Сообщений: 597
16.05.2011, 16:07
Ну. алгоритм примерно такой (все делается в одной процедуре).
i j - индексы элемента, на который кликнули
стереть board[i,j].Image , т.е. нарисовать чистый квадратик того цвета которого надо
board[i+1,j].Image = bitmap - картинка появляется правее от текущей
board[i,j+1].Image = bitmap - картинка появляется ниже от текущей
board[i+1,j+1].Image = bitmap - картинка появляется по диагонали от текущей
ну и так далее...
т.е. - стираем на старом месте, рисуем на новом месте. location у picturebox-ов остается такой-же.
0
 Аватар для jlevistk
239 / 234 / 8
Регистрация: 05.05.2011
Сообщений: 1,553
17.05.2011, 10:46  [ТС]
тоесть в
C#
1
2
3
4
5
6
7
8
9
10
11
private void PictClick(object sender, System.EventArgs e )
        {
            PictureBox clicked=sender as PictureBox;
            int[] data = clicked.Tag as int[];
            int file = data[2];
            Stream s = this.GetType().Assembly.GetManifestResourceStream("WindowsFormsApplication4.chess."+res_names[file]);
            Bitmap image=new Bitmap(s);
            image.MakeTransparent();
            board[data[0],data[1]].Image = image;
            board[data[0], data[1]].Tag = new int[] {data[0],data[1],file < res_names.Count-1 ? file + 1 : 0};
        }
нужно создать еще один обработчик событий, для того пикчербокса в который будем перемещать?
или же вернее создавать несколько событий, для каждого пикчербокса в который хотим переместить?
0
334 / 270 / 18
Регистрация: 19.01.2011
Сообщений: 597
17.05.2011, 10:51
Не понял вопрос, если честно. Причем тут события нажатия на пиктербокс к рисованию в нем фигуры? ты ничего никуда не перемешаешь, ты просто пиктебоксу в новой позиции меняешь Image для вывода на нем. А на том пикчебоксе уже есть событие нажатия. Оно присваивалось при создании.

Добавлено через 1 минуту
Тебе нужно лишь правильно разработать алгоритм обработки события нажатия. Можно придумать класс, описывающий твою клетку, вернее, ее состояния, и хранить его в поле Tag текущего пикчебокса.
1
 Аватар для jlevistk
239 / 234 / 8
Регистрация: 05.05.2011
Сообщений: 1,553
17.05.2011, 10:55  [ТС]
попробую в течении дня разобраться.. к вечеру отпишусь
0
 Аватар для jlevistk
239 / 234 / 8
Регистрация: 05.05.2011
Сообщений: 1,553
17.05.2011, 14:51  [ТС]
Не хочу показаться совсем некомпетентным, но все же задам вопросы которые у меня возникли по коду.(в самом коде комментами пометил). Что сейчас можно прочесть по этой теме?
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
using System;
using System.Collections.Generic;
using System.IO;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
namespace WindowsFormsApplication4
{
    public partial class Form1 : Form
    {
        PictureBox[,] board = new PictureBox[8, 8];
        List<string> res_names = new List<string>() { "92134-i_001.png", "92134-i_002.png", "92134-i_003.png", "92134-i_004.png" };
        public Form1()
        {
            InitializeComponent();
            int height = Convert.ToInt32(Math.Round((double)(this.Height / 8)));
            int width = Convert.ToInt32(Math.Round((double)(this.Width / 8))); ;
            for (int i = 0; i < 8; i++)
            {
                for (int j = 0; j < 8; j++)
                {
                    Color col = (i + j) % 2 == 0 ? Color.White : Color.Black;
                    board[i, j] = new PictureBox();
                    board[i, j].Height = height;
                    board[i, j].Width = width;
                    board[i, j].Top = height * i;
                    board[i, j].Left = width * j;
                    board[i, j].Tag = new int[] { i, j,0 }; // что такое Tag?
                    board[i, j].BackColor = col;
                    board[i, j].Click += new EventHandler(PictClick);
                    board[i, j].Parent = this;
                    this.Controls.Add(board[i, j]);
                }
            }  
        }
 
 
        private void PictClick(object sender, System.EventArgs e )
        {
            PictureBox clicked=sender as PictureBox; //что значит эта строчка? не понимаю =(
            int[] data = clicked.Tag as int[];
            int file = data[2];
            Stream s = this.GetType().Assembly.GetManifestResourceStream("WindowsFormsApplication4.chess."+res_names[file]);//это тоже не знаю что такое..
            Bitmap image=new Bitmap(s);
            image.MakeTransparent();
            board[data[0],data[1]].Image = image;
            board[data[0], data[1]].Tag = new int[] {data[0],data[1],file < res_names.Count-1 ? file + 1 : 0};
        }
    }
}
0
334 / 270 / 18
Регистрация: 19.01.2011
Сообщений: 597
17.05.2011, 15:38
Tag - свойство объекта PictureBox типа object. Т.е. Вы можете хранить в нем любую информацию. я например, храню в нем массив из 3-х элементов, два индекса и индекс картинки в ресурсах приложения.
PictureBox clicked=sender as PictureBox; - здесь получаем ссылку на объект, по которому кликнули мышкой. полученный указатель приводиться к типу PictureBox, потому что он как параметр события типа object.

Добавлено через 1 минуту
По этой теме можно прочесть руководство по программированию на C# и руководство по WindowsForms...

Добавлено через 1 минуту
Stream s = this.GetType().Assembly.GetManifestResou rceStream("WindowsFormsApplication4.ches s."+res_names[file]);
Загружаем из ресурсов приложения картинку. Картинки добавлены в проект и им установлено свойство Embedded resource (так кажется звучит, посмотрите в проекте).

Добавлено через 1 минуту
C#
1
2
           board[data[0],data[1]].Image = image;
            board[data[0], data[1]].Tag = new int[] {data[0],data[1],file < res_names.Count-1 ? file + 1 : 0};
Это можно например переписать как
C#
1
2
           clicked.Image = image;
                    clicked.Tag = new int[] {data[0],data[1],file < res_names.Count-1 ? file + 1 : 0};
Делал просто для наглядности.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.05.2011, 15:38
Помогаю со студенческими работами здесь

Выбор и активация выбранного pictureBox
Есть форма. На ней два pictureBox, наложенные друг на друга. И есть comboBox в котором два item(к примеру 1 и 2). При выборе 1...

Выбор картинки в OpenFileDialog для PictureBox
Доброго времени суток! Вопрос такой: на форме имеется PictureBox и кнопка при нажатии на которую должен срабатывать OpenFileDialog. После...

Выбор нескольких pictureBox мышкой и их очистка от изображения
есть 20 pictureBox-ов. подскажите, как сделать так, чтобы можно было выбрать несколько pictureBox мышкой (кликнув) и очистить их?

Прозрачный фон у картинки на элементе PictureBox непрозрачен для другого PictureBox
Здравствуйте! Проблема состоит в следующем! У меня есть картинка .png с прозрачным фоном. При создании PictureBox с этой картинкой, фон по...

Программное создание PictureBox с проверкой, нет ли на его месте другого PictureBox
Здравствуйте! Нужно чтобы при нажатии кнопки создавался PictureBox с определёнными свойствами Location: x, y и SizeMode: Autosize и в него...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru