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

Отрисовка контрола (Button) с состояниями (Click, Hover)

21.01.2015, 22:51. Показов 2377. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Как работать с состояниями контролов ???
На своем примере я имею вот что:
1. рисую синий квадрат на каждой кнопке
2. при наведении на кнопку рисуется зеленый круг на кнопке
3. при клике на кнопке рисуется красный квадрат.

Вопрос: Как сделать так чтобы красный квадрат НЕ исчезал после клика и когда курсор вышел за рамки контрола (Button) ? Что я сделал не верно?

Код прилагаю:

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace ButtonsActive
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        Button[] btns = new Button[4];
        int X = 100;
 
        private void Form1_Load(object sender, EventArgs e)
        {
            for (int i = 0; i < btns.Length; i++) 
            {
                btns[i] = new Button();
                btns[i].Name = i.ToString();
                btns[i].Text = i.ToString();
                btns[i].FlatStyle = FlatStyle.Flat;
                btns[i].Size = new Size(100, 100);
                btns[i].Location = new Point(X, 100);
 
                btns[i].Paint += new PaintEventHandler(btns_Paint);
                btns[i].Click += new EventHandler(btns_MouseClick);
                btns[i].MouseHover += new EventHandler(btns_MouseHover);
 
             
                this.Controls.Add(btns[i]);
 
                X += 110;
            }
 
        }
 
        void btns_Paint(object sender, PaintEventArgs e)
        {
            
            Graphics g = e.Graphics;
            g.FillRectangle(Brushes.Blue, new Rectangle(new Point(50, 50), new Size(20, 20)));
        }
 
        void btns_MouseClick(object sender, EventArgs e)
        {
            Graphics g = ((Button)sender).CreateGraphics();
            g.FillRectangle(Brushes.Red, new Rectangle(new Point(0, 0), new Size(20, 20)));
            //g.Dispose();
        }
 
        void btns_MouseHover(object sender, EventArgs e)
        {
            Graphics g = ((Button)sender).CreateGraphics();
            g.FillEllipse(Brushes.Green, new Rectangle(new Point(0,0), new Size(20,20)));
            //g.Dispose();
        }
 
    
    }
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.01.2015, 22:51
Ответы с готовыми решениями:

Нужно при клике, исключить события hover, во. И еще глюки .hover. Отключение .hover в случае активации .click
Нужно при клике, исключить события hover, во. И 1. Глюки .hover: При наведении на блок, к которому он применяется(стрелочка):...

Изменить hover на click
Всем привет. Есть выпадающие меню по наведению, хочу переделать по клику $('#menu li#submenu ul').hide(); $('#menu...

Заменить hover на click
Можно ли как-то заменить hover в этом примере на клик? Желательно, как можно проще. Нужно, чтобы вместо наведения приходилось кликать,...

3
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
21.01.2015, 23:21
Лучший ответ Сообщение было отмечено alezandr как решение

Решение

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
using System;
using System.Drawing;
using System.Windows.Forms;
 
namespace WindowsFormsApplication232
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            new MyButton() {Text = "button1", Parent = this, Width = 100, Height = 40};
        }
    }
 
    class MyButton : Control
    {
        public bool Hovered { get; private set; }
        public bool Checked { get; private set; }
 
        protected override void OnMouseEnter(EventArgs e)
        {
            base.OnMouseEnter(e);
            Hovered = true;
            Invalidate();
        }
 
        protected override void OnMouseLeave(EventArgs e)
        {
            base.OnMouseLeave(e);
            Hovered = false;
            Invalidate();
        }
 
        protected override void OnClick(EventArgs e)
        {
            base.OnClick(e);
            Checked = !Checked;
            Invalidate();
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            var gr = e.Graphics;
 
            if (Hovered)
                gr.FillEllipse(Brushes.Green, ClientRectangle);
            else
                gr.FillRectangle(Checked ? Brushes.Red : Brushes.Blue, ClientRectangle);
 
            gr.DrawRectangle(Pens.Black, ClientRectangle.Left, ClientRectangle.Top, ClientSize.Width - 1,
                             ClientSize.Height - 1);
 
            using (var brush = new SolidBrush(ForeColor))
                gr.DrawString(Text, Font, brush, ClientRectangle, new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
 
            base.OnPaint(e);
        }
    }
}
1
0 / 0 / 0
Регистрация: 14.01.2015
Сообщений: 8
22.01.2015, 03:17  [ТС]
Спасибо! То, что нужно!

Добавлено через 3 часа 14 минут
Storm23 , подскажи , пожалуйста еще...
Как сделать так , что бы среди нескольких таких контролов, зарисованный красным цветом, был один??

Добавлено через 25 минут
Я предлагаю вот такой вариант. Т.е. в массиве этих контролов нахожу текущий, он становится красным, а все остальные перерисовываются. Но моя реализация ужасная. Предложите свой вариант. Еще раз спасибо!

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
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 WindowsFormsApplication4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //new MyButton() { Text = "button1", Parent = this, Width = 100, Height = 40 };
        }
 
        MyButton[] btns = new MyButton[4];
 
        class MyButton : Control
        {
            public bool Hovered { get; private set; }
            public bool Checked { get;  set; }
 
            protected override void OnMouseEnter(EventArgs e)
            {
                base.OnMouseEnter(e);
                Hovered = true;
                Invalidate();
            }
 
            protected override void OnMouseLeave(EventArgs e)
            {
                base.OnMouseLeave(e);
                Hovered = false;
                Invalidate();
            }
 
            protected override void OnClick( EventArgs e)
            {
                base.OnClick(e);
                Checked = !Checked;                
                Invalidate();
            }
 
            protected override void OnPaint(PaintEventArgs e)
            {
                var gr = e.Graphics;
 
                if (Hovered)
                    gr.FillEllipse(Brushes.Green, ClientRectangle);
                else
                    gr.FillRectangle(Checked ? Brushes.Red : Brushes.Blue, ClientRectangle);
 
                gr.DrawRectangle(Pens.Black, ClientRectangle.Left, ClientRectangle.Top, ClientSize.Width - 1,
                                 ClientSize.Height - 1);
 
                using (var brush = new SolidBrush(ForeColor))
                    gr.DrawString(Text, Font, brush, ClientRectangle, new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
 
                base.OnPaint(e);
            }
 
          
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            int x = 0;
            for (int i = 0; i < btns.Length; i++) 
            {                
                btns[i] = new MyButton();
                btns[i].Name = i.ToString();
                btns[i].Size = new Size(50, 50);
                btns[i].Location = new Point(x,0);
 
                btns[i].Click += new EventHandler(btns_Click);
 
                x += 100;
                this.Controls.Add(btns[i]);
            }
        }
 
        void btns_Click(object sender, EventArgs e)
        {     
            for (int i = 0; i < btns.Length; i++) 
            {
                
                btns[i].Checked = false;
                if (i.ToString() == ((MyButton)sender).Name) 
                {
                    continue;                    
                }
                btns[i].Invalidate();
            }
        }
    }
 
 
}
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
22.01.2015, 03:43
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
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 WindowsFormsApplication232
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //new MyButton() { Text = "button1", Parent = this, Width = 100, Height = 40 };
        }
 
        class MyButton : Control
        {
            public bool Hovered { get; private set; }
 
            bool @checked;
            public bool Checked
            {
                get { return @checked; }
                set 
                {
                    if (@checked != value)
                    {
                        @checked = value;
                        OnCheckedChanged();
                    }
                }
            }
 
            private void OnCheckedChanged()
            {
                //uncheck other buttons in my parent
                if (Checked && Parent != null)
                foreach (var ctrl in Parent.Controls)
                if (ctrl is MyButton && ctrl != this)
                    (ctrl as MyButton).Checked = false;
                //
                Invalidate();
            }
 
            protected override void OnMouseEnter(EventArgs e)
            {
                base.OnMouseEnter(e);
                Hovered = true;
                Invalidate();
            }
 
            protected override void OnMouseLeave(EventArgs e)
            {
                base.OnMouseLeave(e);
                Hovered = false;
                Invalidate();
            }
 
            protected override void OnClick(EventArgs e)
            {
                base.OnClick(e);
                Checked = !Checked;
                Invalidate();
            }
 
            protected override void OnPaint(PaintEventArgs e)
            {
                var gr = e.Graphics;
 
                if (Hovered)
                    gr.FillEllipse(Brushes.Green, ClientRectangle);
                else
                    gr.FillRectangle(Checked ? Brushes.Red : Brushes.Blue, ClientRectangle);
 
                gr.DrawRectangle(Pens.Black, ClientRectangle.Left, ClientRectangle.Top, ClientSize.Width - 1,
                                 ClientSize.Height - 1);
 
                using (var brush = new SolidBrush(ForeColor))
                    gr.DrawString(Text, Font, brush, ClientRectangle, new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
 
                base.OnPaint(e);
            }
 
 
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            int x = 5;
            for (int i = 0; i < 4; i++)
            {
                var bt = new MyButton();
                bt.Name = i.ToString();
                bt.Size = new Size(50, 50);
                bt.Location = new Point(x, 5);
 
                x += 100;
                this.Controls.Add(bt);
            }
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.01.2015, 03:43
Помогаю со студенческими работами здесь

Не работает click, hover
Приветствую всех! Очень нужна помощь, не работают события. Делаю несложный слайдер, функция animSlide-меняющая слайды, и автоматическое...

Связка событий hover и click
День добрый. Помогите решить сию задачку. Есть две формы с радио кнопками и по текстовому полю над каждой из них. Нужно чтобы при ховере на...

.hover срабатывает а .click нет
не знаю в чем именно проблема. ну нужно именно .click но функция не срабатывает а .hover работает нормально в чем проблема ...

Побороть click mobile при .hover
Добрый день! $('#id').hover(function(){...}, function(){...})); Упрямо срабатывает при клике (таче или как там) в мобильных. А...

Hover/click-звуки для сайта (важно)
Всем салют. В общем сразу к делу. Хочу реализовать воспроизведение звуков при событиях click и hover. Реализовать не такая уж проблема......


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru