С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
22 / 22 / 8
Регистрация: 17.11.2012
Сообщений: 124

Назначить кнопке фоновый рисунок в зависимости от значения массива

18.11.2012, 01:36. Показов 1265. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем упрощенно суть проблемы такова:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void button1_MouseDown(object sender, MouseEventArgs e)  
        {                                          
            if (e.Button == MouseButtons.Right) 
           
                    if (MD[v, b] == 20) 
                    { 
                        button1.BackgroundImage = ShahMat.Properties.Resources.PBC; 
                    } 
 
                    if (MD[v, b] == 30)
                    {
                        button1.BackgroundImage = ShahMat.Properties.Resources.PCC;
                    }
            }
        }
Это мое "тупое" решение задачи. Но оно работает.

Необходимо ее реализовать что-то вроде:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void Check()
    {
       if (MD[v, b] == 20)                                                   
                    {                                                                  
                        y = ShahMat.Properties.Resources.PBC; 
                    }                                                                                         
                    if (MD[v, b] == 30)
                    {
                        y = ShahMat.Properties.Resources.PCC;
                    }
    }
 
private void button1_MouseDown(object sender, MouseEventArgs e)        
        {                                                                                          
            if (e.Button == MouseButtons.Right)                                       
            {
                   Check();
                   button1.BackgroundImage = y;
            }
        }
Здесь обработчик события, при нажатии на кнопку button1 правой кнопкой мыши, вначале вызывает метод "Check()".
Метод "Check()" в свою очередь сравнивает значение соответствующей ячейки в массиве "MD" и передает через переменную "y" строку "ShahMat.Properties.Resources.PBC" или строку "ShahMat.Properties.Resources.PCC". После чего обработчик события изменяет задний фон кнопки на переданный.
PBC и PCC это имена графических файлов с расширением png, лежащие в папке Resources проекта.

Уверен что суть проблемы мое плохое знание самого языка C#, поэтому и обращаюсь на форум. Естественно перед этим я немало "экспериментировал", но чет "оживить" второй способ не получилось(.

Добавлено через 11 часов 30 минут
Что-то 60 просмотров, а ответа нет. Да я в принципе без претензий, реализовал же по первому способу, работает. Вот только прога раза в три больше строк имеет.
Я тут пишу игрулю шахматы. И в ней игровое поле состоит из 64 кнопок, выполняющих роль клеток.
В данный момент большая часть фигур уже прописаны (знают куда и как могут ходить). Но строк в коде больше 6 000.
Если бы можно было реализовать по второму способу это бы существенно сократило код.
Учитывая, что написана (без учета ИИ - его еще нет, а он я предполагаю тоже не мало потянет) процентов так на 70, то код довльно громоздкий для игры скромного формата.
Кого заинтересует могу скинуть исходник на мыло в том виде в каком сейчас есть (запускается, корректно работает, по мере написания проверяю функциональность, код с подробными комментариями).
Прогу решил написать, чтобы поупражнятся в логике и составлении алгоритмов.

Мне вот просто интересно, я глупость спросил и второй способ вообще не возможен, или же возможен, но никто из просмотревших не сталкивался с такой задачей и поэтому не знает каким образом реализовать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.11.2012, 01:36
Ответы с готовыми решениями:

Каждой кнопке из массива назначить определённое действие
Как в массиве из 10 Buttons по нажатию на каждый Button выполнять разные действия. Ребята пожалуйста помогите, вся работа стоит. Буду...

Как на фоновый рисунок наложить второй рисунок
Как на рисунок (фон) наложить текст с таблицей? Сама таблица есть не в текстовом формате (в Word), а в виде скриншота, т.е. картинка.

По клику по кнопке отображать / скрывать таблицу, в зависимости от значения кнопки.
atanov, а можно, может быть глупый вопрос, но все-таки: есть кнопка <button class="button button--show"...

12
 Аватар для DimanRu
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
18.11.2012, 19:40
А так?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private Image Check()
{
   if (MD[v, b] == 20)
   {
      return ShahMat.Properties.Resources.PBC;
   }
   if (MD[v, b] == 30)
   {
      return ShahMat.Properties.Resources.PCC;
   }
}
 
private void button1_MouseDown(object sender, MouseEventArgs e)
{
   if (e.Button == MouseButtons.Right)
   {
      button1.BackgroundImage = Check();
   }
}
1
22 / 22 / 8
Регистрация: 17.11.2012
Сообщений: 124
18.11.2012, 20:16  [ТС]
Создал отдельный проект для эксперимента, по максимуму упростил:
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
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 TestExp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        int x;
        private Image Check()
        {
            if (x == 20)
            {
                return Form1.Properties.Resources.PBC;
            }
            if (x == 30)
            {
                return Form1.Properties.Resources.PCC;
            }
        }
 
        private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                button1.BackgroundImage = Check();
            }
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            x = 20;
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            x = 30;
        }
    }
}
На форме три кнопки. Вместо ячейки массива переменная x. Кнопками button2, button3 задаются значения переменной x = 20, x = 30 соответственно. При нажатии правой кнопкой мыши на button1 должен изменится фоновый рисунок.

Но компилироваться отказывается. Выдает следующее:
error CS0117: 'TestExp.Form1' does not contain a definition for 'Properties'

Отдельное спасибо за участие, но пока чтот не реализуется.
0
 Аватар для DimanRu
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
18.11.2012, 20:28
C#
1
2
3
4
5
6
Form1.Properties.Resources.PBC; 
//Должно быть так:
Имя_Проекта.Properties.Resources.PBC;
 
//Например
WindowsFormsApplication1.Properties.Resources.PBC;
0
22 / 22 / 8
Регистрация: 17.11.2012
Сообщений: 124
18.11.2012, 21:23  [ТС]
Каюсь, вы правы.
Но теперь подчеркивает Check, и выдает следующее: error CS0161: 'TestExp.Form1.Check()': not all code paths return a value
..не все части кода возвращают значение.
Я что то опять не так делаю?
0
 Аватар для DimanRu
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
18.11.2012, 21:45
Это из-за if, если у вас других значений не бывает, кроме зафиксированных в if-ах, просто подставьте:
C#
1
2
3
4
if (x == 20)
   return Form1.Properties.Resources.PBC;
else
   return Form1.Properties.Resources.PCC;
0
22 / 22 / 8
Регистрация: 17.11.2012
Сообщений: 124
18.11.2012, 23:21  [ТС]
Да. Так действительно заработало. Благодарю за пощь. Принимает больше значений, но я думаю выкручусь. Если получится потом выложу чуть усложненный вариант, но все равно я думаю код значительно сократится.

Добавлено через 32 минуты
Вот вариант для большего количества значений переменной.
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
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 TestExp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        int x;
        
        private Image Check()
        {
            if (x == 20)
            {
                return TestExp.Properties.Resources.KBB;
            }
            else
            {
                if (x == 30)
                {
                    return TestExp.Properties.Resources.KCB;
                }
                else
                {
                    if (x == 40)
                    {
                        return TestExp.Properties.Resources.FBB;
                    }
                    else
                    {
                        return TestExp.Properties.Resources.FBC;
                    }
                }
            }
        }
 
        private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                button1.BackgroundImage = Check();
            }
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            x = 20;
        }
        private void button3_Click(object sender, EventArgs e)
        {
            x = 30;
        }
        private void button4_Click(object sender, EventArgs e)
        {
            x = 40;
        }
        private void button5_Click(object sender, EventArgs e)
        {
            x = 50;
        }
    }
}
Проблема решена! Вы гений.

Добавлено через 48 минут
Я похоже сразу не понял... Достаточно одного else. Так будет правильнее и изящнее:
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
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 TestExp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        int x;
        
        private Image Check()
        {
            if (x == 20)
            {
                return TestExp.Properties.Resources.KBB;
            }
            if (x == 30)
            {
                return TestExp.Properties.Resources.KCB;
            }               
            if (x == 40)
            {
                return TestExp.Properties.Resources.FBB;
            }
            else
            {
                return TestExp.Properties.Resources.FBC;
            }           
        }
 
        private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                button1.BackgroundImage = Check();
            }
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            x = 20;
        }
        private void button3_Click(object sender, EventArgs e)
        {
            x = 30;
        }
        private void button4_Click(object sender, EventArgs e)
        {
            x = 40;
        }
        private void button5_Click(object sender, EventArgs e)
        {
            x = 50;
        }
    }
}
Это на 100% решает проблему.
0
 Аватар для DimanRu
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
19.11.2012, 09:11
Лучше через switch сделать, тогда будет еще изящнее!
0
22 / 22 / 8
Регистрация: 17.11.2012
Сообщений: 124
19.11.2012, 10:15  [ТС]
Точно. А возможность принятия нежелательных значений исключить путем их "отсеивания" в вызывающем методе.
0
 Аватар для DimanRu
721 / 712 / 168
Регистрация: 15.06.2011
Сообщений: 1,704
19.11.2012, 10:46
Цитата Сообщение от GradX Посмотреть сообщение
А возможность принятия нежелательных значений исключить путем их "отсеивания" в вызывающем методе.
Круто завернул, молодец! "Он мог бы прямо на митингах деньги зарабатывать, - мутно мечтал пес, - первоклассный деляга"
0
22 / 22 / 8
Регистрация: 17.11.2012
Сообщений: 124
19.11.2012, 11:46  [ТС]
Имел ввиду вот это:
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
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 TestExp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        int x;
        
        private Image Check()
        {
            switch (x)
            {
                case 20:
                    return TestExp.Properties.Resources.FBB;
                case 30:
                    return TestExp.Properties.Resources.FBC;
                case 40:
                    return TestExp.Properties.Resources.KCB;
                default:
                    return TestExp.Properties.Resources.KBB;
            }
            
        }
 
        private void Recursor()
        {
            if(x == 20 || x == 30 || x == 40 || x == 50)
            button1.BackgroundImage = Check();
        }
        private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                Recursor();
            }
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            x = 20;
        }
        private void button3_Click(object sender, EventArgs e)
        {
            x = 30;
        }
        private void button4_Click(object sender, EventArgs e)
        {
            x = 40;
        }
        private void button5_Click(object sender, EventArgs e)
        {
            x = 50;
        }
 
        private void button6_Click(object sender, EventArgs e)
        {
            x = 60;
        }
    }
}
В моей проге это себя оправдывает.
Здесь метод Recursor() обеспечивает корректную работу программы.

Добавлено через 10 минут
Хотя можно было проще:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 private Image Check()
        {
            switch (x)
            {
                case 20:
                    return TestExp.Properties.Resources.FBB;
                case 30:
                    return TestExp.Properties.Resources.FBC;
                case 40:
                    return TestExp.Properties.Resources.KCB;
                default:
                    return TestExp.Properties.Resources.KBB;
            }
            
        }
        private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                if (x == 20 || x == 30 || x == 40 || x == 50)
                    button1.BackgroundImage = Check();
            }
        }
0
20.11.2012, 11:36

Не по теме:

Да я понял что ты имел ввиду)) Удачи в познании:senor:.

0
1057 / 864 / 195
Регистрация: 31.03.2010
Сообщений: 2,521
21.11.2012, 13:35
Открою тебе глаза: есть еще такая штука как привязка данных. Создаете List изображений, на него создаете простой BindingSource. для "волшебной" кнопки вместо имаджа указываете объект BindingSource.
На все кнопки для изменения изображения делаете один ОБЩИЙ метод, который просто меняет значение (объект BindingSource).Current - и изображение меняется само собой без лишних телодвижений.
Описание BindingSource
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.11.2012, 13:35
Помогаю со студенческими работами здесь

Присвоение ячейке значения, в зависимости от того, в какой области будет находиться рисунок
Добрый день. В VBA стал разбираться недавно, пожалуйста помогите. При помощи данного кода: Sub ВыводКоординатАвтофигур() Dim...

Фоновый рисунок
<table width="410" height="310" border="0" align="center" cellpadding="1" cellspacing="1" background="../images/pol.jpg"> Как...

Фоновый рисунок
Купили в Америке HP Mini 210-1199DX Windows7 Starter ,поменяли на русскую начальную версию,но теперь не можем поставить фоновый...

Фоновый рисунок QT
Здравствуйте, Подскажите пожалуйста, как сделать фон в программу? Руководствуясь примерами написал Аналоговые часы, при попытке...

Фоновый рисунок
<head> <link rel="stylesheet" type="text/css" href="1.css"> <title>Меню</title> </head> <body> <header> <nav...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru