namespace WindowsFormsApplication1
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
Set_MouseDown_Hook(this);
}
void Set_MouseDown_Hook(Control Container)
{
foreach (Control C in Container.Controls)
{
// В случае, если контрол содержит в себе другие контролы (например Panel), вызываем рекурсивно
if (C.Controls.Count != 0) Set_MouseDown_Hook(C);
C.MouseDown += new MouseEventHandler(MainForm_MouseDown);
C.MouseUp += new MouseEventHandler(MainForm_MouseUp);
C.MouseMove += new MouseEventHandler(MainForm_MouseMove);
}
}
bool lmbDown = false;
Point CurrentLocation;
Point OldLocation;
Point Delta;
private void MainForm_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
//Здесь я добавил проверку
if(sender as Control == this)
{
lmbDown = true;
CurrentLocation = (sender as Control).PointToScreen(new Point(e.X, e.Y));
}
}
}
private void MainForm_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left) lmbDown = false;
}
private void MainForm_MouseMove(object sender, MouseEventArgs e)
{
if (lmbDown)
{
OldLocation = CurrentLocation;
CurrentLocation = (sender as Control).PointToScreen(new Point(e.X, e.Y));
// Разница. Блин, почему для Point нет перегрузки "-" :)
Delta.X = CurrentLocation.X - OldLocation.X;
Delta.Y = CurrentLocation.Y - OldLocation.Y;
// Перемещение
this.Top += Delta.Y;
this.Left += Delta.X;
}
}
Проверка на какого типа контрол нажали мышью
Код:
if(sender as Control == this)
Как сделать, чтобы проверялось не только, что контрол это форма, но и Label? Я понимаю, что можно сделать this.label1 например, но это не подходит, надо именно чтобы проверялось что это контрол типа Label
Или в другом месте этого кода проще, что либо поменять?
Код:
if (Sender is Label)
Цитата: -=C@$Per=-
// Разница. Блин, почему для Point нет перегрузки "-" :)
Delta.X = CurrentLocation.X - OldLocation.X;
Delta.Y = CurrentLocation.Y - OldLocation.Y;
Вы просто не умеете их готовить. (с)
Обратите внимание на статические методы Point.Add и Point.Subtract.
Код:
Delta = Point.Subtract(CurrentLocation, (Size)OldLocation);