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

Спрятать кнопку на форме при нажатии кнопки на клавиатуре

22.05.2018, 16:12. Показов 2312. Ответов 28
Метки нет (Все метки)

Всем привет, есть задание создать калькулятор, и при нажатии кнопки "Ентер" должна исчезнуть одна из кнопок калькулятора исчезает кнопка любая(т.е. рандомно или еще как-то)
Подскажите как это оформить в коде
Вот я создал примитивный калькулятор :
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
public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = Convert.ToString(umn(Convert.ToDouble(textBox1.Text), Convert.ToDouble(textBox2.Text)));
 
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
 
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
 
        }
 
        private void button4_Click(object sender, EventArgs e)
        {
 
        }
        public static double sum(double a, double b)
        {
            return a + b;
        }
        public static double min(double a, double b)
        {
            return a - b;
        }
        public static double umn(double a, double b)
        {
            return a * b;
        }
        public static double del(double a, double b)
        {
            return a / b;
        }
Куда тут нужно написать условие с нажатием "Ентер"
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.05.2018, 16:12
Ответы с готовыми решениями:

Нужно создать кнопку при нажатии кнопки на форме
public partial class MainWindow : Window { public MainWindow() { ...

По нажатию кнопки на клавиатуре нажимать кнопку на форме
Доброго времени суток! Не давно начал изучать с++. Возник такой вопрос: как по нажатию кнопки на...

Как создать две новые кнопки на форме при нажатии на текущую кнопку
Господа программисты помогите новичку который пытается освоить программирование Windows forms! ...

Спрятать поле при нажатии на кнопку в таблице
Извините за быдло код, а консоли выводи нужный тег <td>, но на собыдие не реагирует <?php ...

28
314 / 226 / 79
Регистрация: 17.08.2014
Сообщений: 927
22.05.2018, 19:58 2
Для клавиатуры есть событие KeyDown
Для этого создайте обработчик события
C#
1
2
3
4
5
6
7
  private void Form_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.Enter)
            {
               /// ...... 
            }
        }
и привяжите его как к событию формы так и к событию кнопок.
в скобочках напишите свою логику по скрытию кнопок.
0
553 / 530 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
22.05.2018, 20:19 3
Цитата Сообщение от Andreyip Посмотреть сообщение
Для клавиатуры есть событие KeyDown
Для этого создайте обработчик события
Не сработает... Для того, чтобы событие произошло, нужно, чтобы форма была в фокусе. А при наличии на форме какого-либо контрола, типа кнопки или текстбокса, фокус всегда будет на этом контроле, а не на форме... Возможно, есть способ как этот факт обойти, но я о таком не знаю. Соответсвенно, задачу можно решить используя WinApi.
0
314 / 226 / 79
Регистрация: 17.08.2014
Сообщений: 927
22.05.2018, 20:25 4
Shogun31337,
судя по коду у него на форме кнопки и label
на label фокус можно сказать что не попадет.
но если даже попадет то можно это событие обработать и перевести фокус на форму.
А про фокус кнопок и формы я же написал
Цитата Сообщение от Andreyip Посмотреть сообщение
и привяжите его как к событию формы так и к событию кнопок.
это позволит использовать одно событие как на форму так и на кнопки. Winapi тут не нужен.
0
553 / 530 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
22.05.2018, 20:43 5
Цитата Сообщение от Andreyip Посмотреть сообщение
но если даже попадет то можно это событие обработать и перевести фокус на форму.
Ну так, если обрабатывать события на всех контролах, на которые может попасть фокус, то тогда и переводить фокус на форму не нужно... просто выполнить нужный код в этом обработчике и все.
0
314 / 226 / 79
Регистрация: 17.08.2014
Сообщений: 927
22.05.2018, 20:51 6
Shogun31337,
насколько помню на label нет обработчика события клавиатуры, поэтому только костыль как только фокус попадает на label то фокус переводить на форму.
0
553 / 530 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
22.05.2018, 21:03 7
Цитата Сообщение от Andreyip Посмотреть сообщение
насколько помню на label нет обработчика события клавиатуры
Почему нет? Есть. Только не очень понятно в каких случаях им можно воспользоваться...

Цитата Сообщение от Andreyip Посмотреть сообщение
как только фокус попадает на label то фокус переводить на форму.
Так какой смысл гонять туда-сюда фокус, раз уж Вы собираетесь отлавливать нажатие клавиши на всех контролах? Не проще ли сразу выполнять код в обработчике? Либо я просто не очень понимаю суть Ваших мыслей...
0
314 / 226 / 79
Регистрация: 17.08.2014
Сообщений: 927
22.05.2018, 21:12 8
Shogun31337, И в правду есть, только не виден в дизайнере и не показывается в intellisense
Тогда еще проще вешаем одно событие на все контролы и наслаждаемся жизнью))
0
553 / 530 / 225
Регистрация: 02.11.2016
Сообщений: 1,538
22.05.2018, 21:14 9
Цитата Сообщение от Andreyip Посмотреть сообщение
Тогда еще проще вешаем одно событие на все контролы и наслаждаемся жизнью))
Ну да! Я об этом и говорю!
0
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
23.05.2018, 07:47  [ТС] 10
WinAppi не подойдет как сказали в моей"богодельне" его учить не будем, о чем скорблю. А по поводу того как повесить событие на все контролы объяснить могли бы поподробней?

Добавлено через 12 минут
Shogun31337, был бы благодарен если бы донесли до меня эту мысль

Добавлено через 16 секунд
Shogun31337, был бы благодарен если бы донесли до меня эту мысль
0
314 / 226 / 79
Регистрация: 17.08.2014
Сообщений: 927
23.05.2018, 07:53 11
Esso11,
как то так
C#
1
2
3
4
5
6
7
public Form1()
        {
            InitializeComponent();
Form1.KeyDown+=Form_KeyDown;
label1.KeyDown+=Form_KeyDown;
button1.KeyDown+=Form_KeyDown;
        }
Для остальных компонентов так же.
Так же не забывайте отписываться от событий перед тем как уничтожить вложенный объект иначе будут утечки памяти.
отписка делается так:
пример для кнопки button1
C#
1
button1.KeyDown-=Form_KeyDown;
так же данные подписки можно сделать в дизайнере формы.
0
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
23.05.2018, 07:55  [ТС] 12
Andreyip, спасибо, а есть книга именно по виндовс форм? а то я ищу уже давно что то такое
0
630 / 518 / 321
Регистрация: 20.05.2015
Сообщений: 1,448
23.05.2018, 08:48 13
Цитата Сообщение от Shogun31337 Посмотреть сообщение
Для того, чтобы событие произошло, нужно, чтобы форма была в фокусе.
Цитата Сообщение от Andreyip Посмотреть сообщение
Тогда еще проще вешаем одно событие на все контролы и наслаждаемся жизнью))
Зачем если у форм есть свойство KeyPreview.
0
314 / 226 / 79
Регистрация: 17.08.2014
Сообщений: 927
23.05.2018, 10:33 14
Aferuga,
это не всегда сработает

Элемент управления в форме может быть запрограммирован для отмены получаемых нажатий клавиш. Поскольку элемент управления никогда не отправляет нажатия клавиш в форму, форма никогда не увидит их независимо от значения KeyPreview.
0
180 / 143 / 94
Регистрация: 30.07.2013
Сообщений: 575
23.05.2018, 11:51 15
Aferuga,

тоже хотел предложить KeyPreview, но решил сначала проверить.
Если просто Enter - событие не вызывается.
А если CTRL + ENTER, тогда сработает

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.KeyPreview = true;
        }
 
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            switch (e.KeyData)
            {
                case (Keys.Enter | Keys.Control):
                    {
                        MessageBox.Show("CTRL + ENTER pressed");
                        break;
                    }
                
            }                
        }
    }
0
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
23.05.2018, 12:30  [ТС] 16
Думал пойму как все собрать в кучу но не смог. Если есть возможность и желание помогите с кодом
Задание:
Написать приложение, обладающее следующей функциональностью:
 После нажатия клавиши <Enter> через каждую секунду (или иной промежуток времени) «прячется» одна из кнопок «Калькулятора», выбранная случайным образом;
 После нажатия клавиши <Esc> данный процесс останавливается.
Спасибо
0
Unnamed
160 / 158 / 81
Регистрация: 09.06.2011
Сообщений: 848
23.05.2018, 12:37 17
Esso11, запиcываете все кнопки в массив, включаете рандом и отключаете рандомно.
C#
1
2
3
4
5
6
7
8
9
//Пример обхода всех TextBox-ов
foreach (Control control in Controls)
{
    TextBox tb = control as TextBox;
    if (tb != null)
    {
        tb.Text = "Text";
    }
}
0
180 / 143 / 94
Регистрация: 30.07.2013
Сообщений: 575
23.05.2018, 13:23 18
Esso11,

интересная задачка

Спрятать кнопку на форме при нажатии кнопки  на клавиатуре


Кликните здесь для просмотра всего текста
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
public partial class Form1 : Form
    {
        bool IsRunning;        
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void btnDummyEnter_Click(object sender, System.EventArgs e)
        {
            if (IsRunning) return;
            IsRunning = true;
            Thread background = new Thread(Background);
            background.Start();
        }
 
        private void btnDummyEsc_Click(object sender, System.EventArgs e)
        {
            IsRunning = false;
        }
 
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            IsRunning = false;
        }
 
        private void Background()
        {
            Random rnd = new Random();
            int random;
            int index;
            while (IsRunning)
            {
                index = 0;
                random = rnd.Next(0, tableLayoutPanel1.Controls.Count);
                foreach(Control control in tableLayoutPanel1.Controls)
                {
                    if (index++ == random) ControlVisible(control, false);
                    else ControlVisible(control, true);
                }
                Thread.Sleep(1000);
            }
            foreach (Control control in tableLayoutPanel1.Controls)
            {
                ControlVisible(control, true);
            }
        }
 
        public delegate void CVDelegate (Control control, bool visible);
 
        public void ControlVisible(Control control, bool visible)
        {
            try
            {
                if (control.InvokeRequired)
                {
                    CVDelegate cVDelegate = new CVDelegate(ControlVisible);
                    control.Invoke(cVDelegate, new object[] { control, visible });
                }
                else
                {
                    control.Visible = visible;
                }
            }
            catch { }
        }
 
    }
0
5 / 5 / 0
Регистрация: 20.08.2017
Сообщений: 685
23.05.2018, 15:15  [ТС] 19
meridbt, tableLayoutPanel1 - это что за объект на форме?
0
Unnamed
160 / 158 / 81
Регистрация: 09.06.2011
Сообщений: 848
23.05.2018, 15:18 20
Esso11, научитесь гуглить, и пользоваться MSDN tableLayouPanel
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.05.2018, 15:18

Нужно при нажатии на кнопку спрятать слой
вобщем нада при нажатии на кнопку спрятать слой....но чёт ни как не могу, вот как делаю я:...

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

Запуск при нажатии кнопки на клавиатуре
Как при нажатии, например &quot;Shift+ALT&quot; выполнить эту команду?...

При нажатии на кнопку на клавиатуре курсор перемещается вверх
Здравствуйте. Пытаюсь решить следующую задачку на андроид студио. выделяю строку в таблицы и...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru