Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2016, 13:44   #1
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию Перетягивание компонентов по окну

Здравствуйте. Пишу на C#, Windows Forms, Visual Studio 2013.
Сегодня столкнулся с необходимостью перетягивать компоненты в пределах Tab Control, внутри которого лежат другие компоненты.
То есть, задача следующая: в табе лежит сетка 10x10 из компонентов PictureBox; все эти компоненты нужно как то возить по табу с помощью "нажал-потянул-отпустил". После переноса какого либо PictureBox этот самый компонент должен оказаться поверх всех остальных компонентов.

Моя проблема в непосредственном перетягивании компонентов: я не знаю, как отлавливать изменение позиции курсора на табе, когда у меня под курсором должен быть PictureBox.

Как я "блокирую" компонент для переноса:
Код:
private void box_MoveLock(object sender,MouseEventArgs e) // событие для всех 100 компонентов
{
	if (e.Button!=MouseButtons.Left) // перетягивание с помощью ЛКМ
		return;
	else {}
	lock_X=e.X; // что бы визуально перетаскивался компонент, а не его угол
	lock_Y=e.Y;
	moving_box=(sender as PictureBox); // глобальная переменная PictureBox
	moving=true; // "разрешение на перемещение"
}
Как я "разблокирую" компонент, который гипотетически уже был перемещён:
Код:
private void box_MoveUnlock(object sender,MouseEventArgs e) // ещё одно событие на все 100 компонентов
{
	moving=false;
	lock_X=q2_moving_box.Location.X; // последнюю позицию необходимо запомнить для дальнейших операций
	lock_Y=q2_moving_box.Location.Y;
	moving_box=null;
	// здесь те самые "дальнейшие операции"
}
Между первой и второй функциями событий, которые я написал здесь, не хватает функции непосредственно перемещения. Я так подозреваю, что это событие "MouseMove", но: на каком компоненте ? И вообще, я даже не представляю, как можно получить координаты курсора в "родительском контейнере", когда под курсором "дочерний компонент" - событие MouseMove работает именно в дочернем компоненте, соответственно - позицию курсора "насквозь" дочернего компонента я увидеть не могу.

Как это делается ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 13.08.2016, 15:14   #2
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Проблему перемещения решил: можно обходиться и без позиции курсора "насквозь":
Код:
// код события MouseMove для всех 100 перетягиваемых компонентов
if (moving)
	moving_box.Location=new Point(
		moving_box.Location.X+e.X-lock_X,
		moving_box.Location.Y+e.Y-lock_Y);
else {}
Осталась вторая проблема: во время и после перемещения перетягиваемый компонент должен находиться поверх всех остальных компонентов. Это условие выполняется только для последнего созданного компонента. TabIndex у PictureBox я не обнаружил. Как решать эту проблему ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 13.08.2016, 15:35   #3
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Проблему "z-порядка" тоже нашёл, как решать:
Код:
// вызов функции в событии MouseDown для всех 100 компонентов
moving_box.BringToFront();
Всем спасибо за помощь.
P.S. Это "добрый сарказм".
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 13.09.2016, 06:16   #4
capone641693
 
Регистрация: 15.08.2011
Сообщений: 5
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
Проблему "z-порядка" тоже нашёл, как решать:
Код:
// вызов функции в событии MouseDown для всех 100 компонентов
moving_box.BringToFront();
Всем спасибо за помощь.
P.S. Это "добрый сарказм".

bool canMove;
Point p;
private void b_MouseDown(object sender, MouseEventArgs e)
{
canMove = true;
p = e.Location;
}
private void b_MouseMove(object sender, MouseEventArgs e)
{
((Control)sender).Top += e.Y - p.Y;
((Control)sender).Left += e.X - p.X;
if (canMove)
{

}

}
private void b_MouseUp(object sender, MouseEventArgs e)
{
canMove = false;
}
capone641693 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Слои и перетягивание vermond JavaScript, Ajax 2 02.08.2015 15:45
Визуальное отображение и перетягивание .scu C# (си шарп) 1 07.07.2012 13:56
Перетягивание формы вручную _PROGRAMM_ Общие вопросы Delphi 4 26.10.2011 20:13
Delphi. Перетягивание изображения ugagaga Помощь студентам 3 12.12.2009 02:40
Подскажите, как сделать что бы перетягивание форм происходило одновременно! •ScReam•™ Помощь студентам 1 19.06.2009 00:45