У меня есть код перетаскивания формы за любое место, то есть не стандартным способом, но этот код до того как я добавил в него проверку "за что схватили мышью" работал так, что можно было таскать за кнопки и т.д. что смотрелось не совсем логично для адекватно написаной программы.
| Код |
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 Или в другом месте этого кода проще, что либо поменять? |