Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Получить тип контрола на который нажали мышью


Автор: CasperSC 7.1.2010, 20:45
У меня есть код перетаскивания формы за любое место, то есть не стандартным способом, но этот код до того как я добавил в него проверку "за что схватили мышью" работал так, что можно было таскать за кнопки и т.д. что смотрелось не совсем логично для адекватно написаной программы. 

Код


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
Или в другом месте этого кода проще, что либо поменять?

Автор: jonie 7.1.2010, 21:14
sender.GetType().Equals(typeof(Label)) ?

Автор: CasperSC 8.1.2010, 03:36
Подсказали на другом форуме:
Код

if ((sender as Control == this) | (sender is Label) | (sender is GroupBox))

Вопрос решён. Если есть кому, что дополнить, дополняйте. Форум на то и форум, не одному мне потребуется решение этой проблемы.

Вот для этого:
Код

// Разница. Блин, почему для Point нет перегрузки "-" :)
Delta.X = CurrentLocation.X - OldLocation.X;
Delta.Y = CurrentLocation.Y - OldLocation.Y;


Есть вот это:
Код

Delta = Point.Subtract(CurrentLocation, (Size)OldLocation);


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)