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

Как определить какой объект находится под курсором мыши?

22.10.2009, 11:01. Показов 18595. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня такая проблемка: в событии MouseUp необходимо получить ссылку на объект, который в данный момент находится под курсором... Есть какие-либо стандартные средства? Или придется перебирать все объекты, принадлежащие форме, и по координатам и параметрам сравнивать, попадает ли курсор на них?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.10.2009, 11:01
Ответы с готовыми решениями:

Находится ли под курсором Rectangle?
Здравствуйте. Есть форма (Form1), есть массив квадратов (Rectangle), при запуске формы, на ней рисуются квадраты (которые берутся из...

Изменить цвет формы в цвет пикселя под курсором по клику мыши
Есть код. Но форма выкрашивается только в серый цвет и такой и остается, несмотря на изменение цвета пикселя под курсором. Подскажите куда...

Определить, что находится под курсором
Доброго времени суток!!! Как узнать находится ли в момент клика мыши, под курсором рамка заголовка?

12
3 / 3 / 1
Регистрация: 12.10.2009
Сообщений: 13
22.10.2009, 11:16
А событие MouseUp к какому элементу привязано?
0
 Аватар для solar_wind
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
22.10.2009, 11:18
Цитата Сообщение от svv Посмотреть сообщение
У меня такая проблемка: в событии MouseUp необходимо получить ссылку на объект, который в данный момент находится под курсором... Есть какие-либо стандартные средства? Или придется перебирать все объекты, принадлежащие форме, и по координатам и параметрам сравнивать, попадает ли курсор на них?
Ну можно отслеживать событие OnMouseMove в каждом объекте, оно посылается обычно тому объекту, над которым находится курсор.
0
3 / 3 / 1
Регистрация: 12.10.2009
Сообщений: 13
22.10.2009, 11:24
Или можно создать для нескольких элементов один обработчик события MouseUp.
Тогда можно узнать на каком из них событие было запущено примерно так:

C#
1
2
3
4
private void MyEventHandler_MouseUp(object sender, arguments e)
{
    MessageBox.Show((sender as Button).Name);
}
0
0 / 0 / 0
Регистрация: 22.10.2009
Сообщений: 26
22.10.2009, 18:55  [ТС]
Объект привязан к PictureBox, но дело в том, что MouseUp возвращает как sender объект, на котором сработал MouseDown...
Так вот, мне надо получить именно тот объект, над которым у меня произошло событие MouseUp.
...мышь перемещается с зажатой левой кнопкой мыши...

Добавлено через 29 минут
Цитата Сообщение от vitaly1981 Посмотреть сообщение
Ну можно отслеживать событие OnMouseMove в каждом объекте, оно посылается обычно тому объекту, над которым находится курсор.
MouseMove работает (насколько я знаю) только при отпущенных кнопках мыши, поэтому у меня задача отловить объект, не являющийся sender-ом данного события... (на котором сработал MouseUp)
Как я уже писал в начале топика, можно перебрать все объекты, и на основе их расположения на форме и размеров, делать вывод, на нем ли располагается курсор в данный момент времени... Но это с моей точки зрения довольно муторно...
Так, собственно, я хотел узнать: Может быть, есть более простые в реализации способы...
0
Благотворец
 Аватар для arvitaly
142 / 122 / 13
Регистрация: 29.04.2009
Сообщений: 537
23.10.2009, 00:45
А что Вы туда перетаскиваете, может быть это решается просто DragDrop'ом?
0
0 / 0 / 0
Регистрация: 22.10.2009
Сообщений: 26
23.10.2009, 01:04  [ТС]
Цитата Сообщение от arvitaly Посмотреть сообщение
А что Вы туда перетаскиваете, может быть это решается просто DragDrop'ом?
Перетаскиваю курсор с картинки на картинку (с зажатой левой кнопкой), чтобы их связать...
В пределах одной формы...
0
Благотворец
 Аватар для arvitaly
142 / 122 / 13
Регистрация: 29.04.2009
Сообщений: 537
23.10.2009, 01:28
Ну вот как вариант, на форме 3 PictureBox:
PictureBox1
PictureBox2
PictureBox3
для 1 и 3 обработчики событий одинаковые

Ну это уже в зависимости что у тебя там на форме
C#
1
2
3
4
5
6
            this.pictureBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseDown);
            this.pictureBox1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseUp);
            this.pictureBox3.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseDown);
            this.pictureBox3.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseUp);
            this.pictureBox1.MouseEnter += new System.EventHandler(this.pictureBox_MouseEnter);
            this.pictureBox3.MouseEnter += new System.EventHandler(this.pictureBox_MouseEnter);
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
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 WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        Boolean imageCapture = false;
        Boolean imageLeave = false;
        PictureBox _sender;
        private void pictureBox_MouseDown(object sender, MouseEventArgs e)
        {
            _sender = (sender as PictureBox);
            imageCapture = true;
        }
        private void pictureBox2_MouseEnter(object sender, EventArgs e)
        {
            if (imageLeave)
            {
                imageLeave = false;
 
                ////////////////К примеру помещаем во второй картинку из первого PictureBox
                pictureBox2.Image = _sender.Image;
            }
        }
        private void pictureBox_MouseUp(object sender, MouseEventArgs e)
        {
            if (imageCapture) imageLeave = true;
            imageCapture = false;
        }
        private void Form1_MouseEnter(object sender, EventArgs e)
        {
            imageLeave = false;
        }
 
        private void pictureBox_MouseEnter(object sender, EventArgs e)
        {
            imageLeave = false;
        }
    }
}
0
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
23.10.2009, 05:32
Code
1
Form.GetChildAtPoint()
0
0 / 0 / 0
Регистрация: 22.10.2009
Сообщений: 26
23.10.2009, 19:15  [ТС]
arvitaly, объекты у меня создаются динамически, и нет возможности под каждый создавать собственный обработчик, собственно, имен у изображений тоже нет, только ссылки в качестве потомка на форме (приходит как sender в событиях обработки мыши)

Цитата Сообщение от Green Посмотреть сообщение
Код:
Form.GetChildAtPoint()
А можешь поподробнее рассказать?
Я делаю так:
Code
1
2
3
4
5
void pb_MouseUp(object sender, MouseEventArgs e)
{
    PictureBox pb = Form1.[U]GetChildAtPoint[/U](new Point(e.X,e.Y));
    pb.Location = new Point(pb.Location.X + 10, (pb.Location.Y);
}
Выдает ошибку:
Ошибка 1 Для нестатического поля, метода или свойства "System.Windows.Forms.Control.GetChildAt Point(System.Drawing.Point)" требуется ссылка на объект

У меня вопрос: Какой объект ему нужен, если не Form1?..
0
0 / 0 / 0
Регистрация: 22.10.2009
Сообщений: 26
23.10.2009, 19:56  [ТС]
Всем большое спасибо!
Нашел примерно такое решение:

Code
1
2
3
4
5
void pb_MouseUp(object sender, MouseEventArgs e)
{
    var pb0 = (GetChildAtPoint(new Point(e.X,e.Y)));
    if (pb0 != null) pb0.Location = new Point(pb0.Location.X + 10, pb0.Location.Y);
}
Может, кому пригодится
0
0 / 0 / 0
Регистрация: 10.07.2013
Сообщений: 10
02.08.2013, 18:14
если я правильно понял Вопрос,в любом event-е можно написать

PictuareBox pb = new PictuareBox();
pb = (PictuareBox)e.OriginalSource;

и pb будет ссылкой на тот обект который генерировал event
0
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
08.08.2013, 14:49
Цитата Сообщение от Levon1993 Посмотреть сообщение
если я правильно понял Вопрос,в любом event-е можно написать

C#
1
2
PictuareBox pb = new PictuareBox();
pb = (PictuareBox)e.OriginalSource;
и pb будет ссылкой на тот обект который генерировал event
Непонятно для чего вами поднята решенная тема четырехлетней давности.
Непонятно почему вы предлагаете решение на WPF в ветке Windows Forms.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.08.2013, 14:49
Помогаю со студенческими работами здесь

Как получить текст под курсором мыши.
Доброго времени суток. В общем, задача: получить текст под курсором мыши. Среда разработки: Visual Studio 6.0 (так же есть 2005) ...

TChart. Как взять значение точки на оси Х под курсором мыши
Здравствуйте. Не могу узнать значение при наведении курсора на BottomAxis, где расположены текстовые значения точек на графике. Искал на...

Объект поворачивается вслед за курсором мыши
Должно получиться что-то типа "лицо, следящее за мышью". Бочку сделал, нашел в нете похожее, но дико запутанное, ничерта не...

Захват текста под курсором мыши
Здравствуйте. Возникла такая проблема: надо в текстовом редакторе (например TMemo) получить слово на которое указывает курсор мыши, затем...

Как определить цвет под курсором
как определить?


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru