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

Обработка событий мыши у кастомного компонента

15.02.2023, 10:51. Показов 491. Ответов 8

Студворк — интернет-сервис помощи студентам
Пытался написать собственный элемент для WinForms да вот только получилась какая-то лажа (Только начал интересоваться в этой теме) сам элемент получился я могу добавить его на форму вот только обработка событий с него не происходит, а если точно то пока что работает только _Load, а связанные с мышью нет (хотел реализовать перемещение этого элемента по форме) сначала нашел класс для перемещения он прекрасно работал с стандартными элементами, с моим нет позже написал код на обработке трех условий мыши также результатов не дало (с стандартными все также работает).
Прошу помощи для меня такого чайника)))
Что именно скинуть конкретно не уверен поэтому прикрепил все полностью.

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
    using CustomControl;
    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;
    using static System.Windows.Forms.VisualStyles.VisualStyleElement;
    
    namespace Block_schematics
    {
        public partial class FormMain : Form
        {
    
            public FormMain()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                CustomControl.StartControl startControl = new CustomControl.StartControl();
                // Сначала использовал класс, но позже подумал что стоит попробовать что-то самому напсиать
                startControl.MouseUp += startControl_MouseUp;
                startControl.MouseMove += startControl_MouseMove;
                startControl.MouseDown += startControl_MouseDown;
                startControl.Anchor = AnchorStyles.None;
                MoveCtrl.EnableMove(startControl);
                panel1.Controls.Add(startControl);
    
            }
    
            private bool check = false;
            private Point cursor;
            private Point ob_ctrl;
    
            private void startControl_MouseUp(object sender, MouseEventArgs e)
            {
                check = false;
            }
    
            private void startControl_MouseMove(object sender, MouseEventArgs e)
            {
                if (check)
                {
                    (sender as UserControl).Location = new Point
                        (ob_ctrl.X + (Cursor.Position.X - cursor.X),
                        ob_ctrl.Y + (Cursor.Position.Y - cursor.Y));
                }
            }
    
            private void startControl_MouseDown(object sender, MouseEventArgs e)
            {
                check = true;
                cursor = Cursor.Position;
                ob_ctrl = (sender as UserControl).Location;
            }
    
    
            private void startControl1_Click(object sender, EventArgs e)
            {
                Console.WriteLine("Не как не реагирует на клик");
            }
        }
    }
Код элемента

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
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace CustomControl
    {
        public partial class StartControl: UserControl
        {
            public StartControl()
            {
                InitializeComponent();
            }
    
            private void label1_Resize(object sender, EventArgs e)
            {
                if (label1.Height > 0)
                {
                    var ky = label1.Height / 2;
                    label1.Font = new Font("Microsoft Sans Serif", ky);
                    Console.WriteLine($"{this.Height}, {this.Width}");
                }
            }
        }
    }
Код дизайна контрола

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
    namespace CustomControl
    {
        partial class StartControl
        {
            /// <summary>
            /// Обязательная переменная конструктора.
            /// </summary>
            private System.ComponentModel.IContainer components = null;
    
            /// <summary>
            /// Освободить все используемые ресурсы.
            /// </summary>
            /// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
    
            #region Код, автоматически созданный конструктором компонентов
    
            /// <summary>
            /// Требуемый метод для поддержки конструктора — не изменяйте 
            /// содержимое этого метода с помощью редактора кода.
            /// </summary>
            private void InitializeComponent()
            {
                System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(StartControl));
                this.pictureBox1 = new System.Windows.Forms.PictureBox();
                this.label1 = new System.Windows.Forms.Label();
                ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
                this.SuspendLayout();
                // 
                // pictureBox1
                // 
                this.pictureBox1.BackColor = System.Drawing.Color.Transparent;
                this.pictureBox1.Cursor = System.Windows.Forms.Cursors.Default;
                this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Fill;
                this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
                this.pictureBox1.Location = new System.Drawing.Point(0, 0);
                this.pictureBox1.MinimumSize = new System.Drawing.Size(125, 60);
                this.pictureBox1.Name = "pictureBox1";
                this.pictureBox1.Size = new System.Drawing.Size(127, 62);
                this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
                this.pictureBox1.TabIndex = 0;
                this.pictureBox1.TabStop = false;
                // 
                // label1
                // 
                this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
                | System.Windows.Forms.AnchorStyles.Left) 
                | System.Windows.Forms.AnchorStyles.Right)));
                this.label1.Location = new System.Drawing.Point(40, 24);
                this.label1.Name = "label1";
                this.label1.Size = new System.Drawing.Size(46, 15);
                this.label1.TabIndex = 1;
                this.label1.Text = "Начало";
                this.label1.Resize += new System.EventHandler(this.label1_Resize);
                // 
                // StartControl
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.BackColor = System.Drawing.Color.Transparent;
                this.Controls.Add(this.label1);
                this.Controls.Add(this.pictureBox1);
                this.Cursor = System.Windows.Forms.Cursors.Hand;
                this.Name = "StartControl";
                this.Size = new System.Drawing.Size(127, 62);
                ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
                this.ResumeLayout(false);
    
            }
    
            #endregion
    
            private System.Windows.Forms.PictureBox pictureBox1;
            private System.Windows.Forms.Label label1;
        }
    }
Постараюсь быстро отвечать на ваши вопросы по моему детищу (идею которую уже ненавижу)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.02.2023, 10:51
Ответы с готовыми решениями:

Обработка нескольких событий одного компонента в общем методе
Приветствую, форумчан! Помогите решить проблему: Есть ListBox, в нем по событию DrawItem отрисовываются картинки. Мне нужно,...

обработка событий мыши
если на форме находится Picturebox необходимо если левой кнопкой мыши на него щелкнуть и не отпуская перемещать затем отпустить Picturebox...

Обработка событий компонента в cmd
Подскажите пожалуйста как сделать обработчик событий компонента в cmd приложении. Например у меня есть IdTCPClient у которого есть...

8
fly
 Аватар для I can
4955 / 4644 / 844
Регистрация: 13.04.2015
Сообщений: 9,840
15.02.2023, 12:00
Лучший ответ Сообщение было отмечено VshivayaGnida как решение

Решение

Цитата Сообщение от VshivayaGnida Посмотреть сообщение
только обработка событий с него не происходит
Скорее всего событие вообще не возникает. У вас PictureBox занимает весь контрол, и все события кликов происходят для него, или для находящегося тут Label-а.

На скрине уменьшенные элементы, попробуйте таскать не за них, а за сам контрол.
Вложения
Тип файла: rar WindowsFormsApp23.rar (4.4 Кб, 2 просмотров)
1
fly
 Аватар для I can
4955 / 4644 / 844
Регистрация: 13.04.2015
Сообщений: 9,840
15.02.2023, 12:04
VshivayaGnida, фу, блин.
0
0 / 0 / 0
Регистрация: 16.02.2022
Сообщений: 8
15.02.2023, 12:23  [ТС]
Спасибо. И не надо ругаться)

Добавлено через 2 минуты
А еще может быть подскажите как мне тогда реализовать такой контрол. Чтобы и текст загружать и картинку
0
fly
 Аватар для I can
4955 / 4644 / 844
Регистрация: 13.04.2015
Сообщений: 9,840
15.02.2023, 12:35
Цитата Сообщение от VshivayaGnida Посмотреть сообщение
И не надо ругаться
Я на твой ник

Добавлено через 3 минуты
Цитата Сообщение от VshivayaGnida Посмотреть сообщение
Чтобы и текст загружать и картинку
Текст не весь контрол занимает, можно оставить, а PictureBox вообще не нужен. Картинку можно загрузить на контрол сразу без него.
1
0 / 0 / 0
Регистрация: 16.02.2022
Сообщений: 8
15.02.2023, 12:55  [ТС]
Цитата Сообщение от I can Посмотреть сообщение
Картинку можно загрузить на контрол сразу без него.
Он же будет как фон, и получится что она за мостится при больших размерах.
Или я что-то упускаю?

Добавлено через 7 минут
Ааа все сам заметил сразу следующие свойство Layout для фона
0
fly
 Аватар для I can
4955 / 4644 / 844
Регистрация: 13.04.2015
Сообщений: 9,840
15.02.2023, 12:58
Держи решение
Вложения
Тип файла: rar WindowsFormsApp2 3.rar (203.9 Кб, 4 просмотров)
1
0 / 0 / 0
Регистрация: 16.02.2022
Сообщений: 8
15.02.2023, 13:01  [ТС]
А есть в winforms игнорирования объекта чтобы при наведении на label я все таки нажимал на Control?

Добавлено через 2 минуты
Спасибо большое
0
fly
 Аватар для I can
4955 / 4644 / 844
Регистрация: 13.04.2015
Сообщений: 9,840
15.02.2023, 13:07
Цитата Сообщение от VshivayaGnida Посмотреть сообщение
при наведении на label я все таки нажимал на Control
Там в решении всё есть можно таскать и за Label
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.02.2023, 13:07
Помогаю со студенческими работами здесь

Правильная обработка событий компонента DataGrid
В общем есть такая проблема. Есть в окне DataGrid. Источником его данных служит DataTable(table - имя переменной). На событие LoadingRow...

Обработка событий мыши
Добрый день. Столкнулся с проблемой: при выполнении следующего кода: BtnUp.addEventListener(MouseEvent.CLICK, UpCLICK); function...

Обработка событий мыши
Всем доброго времени суток. У меня возник вопрос относительно обработки событий мыши. Подскажите пожалуйста в какую сторону мне...

Обработка событий мыши
Добрый день :) Перекопал весь инет, не могу найти как обрабатывать события мыши. У меня есть окно windows form, мне нужно узнавать если...

Обработка событий от мыши С++
Форумчане, сильно прошу, просто умоляю подкинуть какой то информации по обработке событий на чистом С++ без всяческих библиотек и тому...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru