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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как таскать форму за любое место, и контрол на ней 
V
    Опции темы
Ch0bits
Дата 17.5.2007, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

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



Как таскать форму за любое место и контрол на ней? 
Идея в том, чтобы поймать нажатие левой кнопки мыши и пока нажата, перемещать форму синхронно мыши в десктопных координатах.
Я переопределил WndProc и пробовал ловить WM_NCHITTEST, но он не ловится на контролах. Пробовал WM_LBUTTONDOWN, но он не появляется вообще. Додумался вести логи всех поступающих сообщений, при нажатии на левую кнопку мыши поступают только WM_PARENTNOTIFY и WM_MOUSEACTIVATE.
Что делать?  smile 
PM WWW   Вверх
XavierElf
Дата 18.5.2007, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

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



Тоже сейчас мучаюсь с этим. Реализовал таким образом:
Код

public partial class MyForm : Form
{
    bool    mbState;
    Point    SLFLocation;
    Point    mOldLocation;
    Point    mDelta;
    Rectangle mDragRect;
    
    public MyForm()
    {
        mbState = false;
        mDragRect = new Rectangle(Location, new Size(370, 350));
        InitializeComponent();
        this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
    }

    void MyFormMouseDown(object sender, MouseEventArgs e)
    {
        mOldLocation = e.Location;
        mbState = true;
    }

    void MyFormMouseUp(object sender, MouseEventArgs e)
    {
        mbState = false;
    }

    void MyFormMouseMove(object sender, MouseEventArgs e)
    {
        if (mbState == true)
        {
            mDelta.X = e.X - mOldLocation.X;
            mDelta.Y = e.Y - mOldLocation.Y;
            SLFLocation.X = this.Left + mDelta.X;
            SLFLocation.Y = this.Top + mDelta.Y;
            this.SetDesktopLocation(SLFLocation.X, SLFLocation.Y);
            foreach(Control thisctrl in this.Controls)
            {
                thisctrl.Update();
            }
            this.Update();
        }
    }


Однако осталась проблема, что при перемещении у формы появляется "шлейф", который не сразу пропадает...
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
Ch0bits
Дата 18.5.2007, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

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



Спасибо, я уже решил проблему.
Код

    public partial class DialogForm : Form
    {
        public DialogForm()
        {
            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(C_MouseDown);
                C.MouseUp += new MouseEventHandler(C_MouseUp);
                C.MouseMove += new MouseEventHandler(C_MouseMove);
            }
        }

        bool lmbDown = false;
        Point CurrentLocation;
        Point OldLocation;
        Point Delta;

        void C_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;
            }
        }

        void C_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left) lmbDown = false;
        }

        void C_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                lmbDown = true;
                CurrentLocation = (sender as Control).PointToScreen(new Point(e.X, e.Y));
            }
        }
    }

Теперь синхронно таскать форму за все контролы и контейнеры.  smile 
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




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


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

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