Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить тип контрола на который нажали мышью 
:(
    Опции темы
CasperSC
Дата 7.1.2010, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: нет
Всего: 1



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

Код


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
Или в другом месте этого кода проще, что либо поменять?
PM MAIL   Вверх
jonie
Дата 7.1.2010, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



sender.GetType().Equals(typeof(Label)) ?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
CasperSC
Дата 8.1.2010, 03:36 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: нет
Всего: 1



Подсказали на другом форуме:
Код

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);



Это сообщение отредактировал(а) CasperSC - 8.1.2010, 03:46
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0628 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.