Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Претаскивание формы


Автор: Lеstat 3.9.2006, 19:54
Вобщем сделал форму.
Убрал у нее все кнопки (закрыть, свернуть и тд... те которые в правом верхнем углу)
Убрал все шапку... вобще сделал из нее серый прямоугольник
Потом натащил на нее красивую картинку с нарисованными кнопками
Натащил на нарисованные кнопки обычные кнопки
Сделал эти кнопки прозрачными и границу у них убрал
Теперь хочу сделать так, чтобы эту форму можно было перетаскивать мышью
Что для этого можно сделать?
И еще иногда когда на кнопку прозрачную наводишь мышь, нажимаешь, отводишь мышь в сторону, отпускаешь и переключаешься на какое-нибудь другое окно, то на форме виден контур кнопки... хотя я его на 0 поставил! как от этого можно избавиться?

Автор: mr.DUDA 3.9.2006, 20:29
Цитата(Lеstat @  3.9.2006,  19:54 Найти цитируемый пост)
Что для этого можно сделать?

Обрабатывать MouseMove, смещать форму при нажатой левой кнопке мыши. Смещение вычислять как разность между двумя Point-ами - тем, который был при предыдущем MouseMove, и текущим.

Автор: Lеstat 3.9.2006, 21:54
Спасибо! Я с формами мало вожусь, поэтому сам сразу не догнал.
Решение довольно простое

Вобщем то что у меня получилось хочу оставить тут... может кому пригодится

Код


        private boolean mousedown = false;
        private int x;
        private int y;
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            mousedown = true;
            //вычисляем смещение места клика относительно позиции формы
            x = Form1.MousePosition.X - ((Form1)Application.OpenForms["Form1"]).Location.X; 
            y = Form1.MousePosition.Y - ((Form1)Application.OpenForms["Form1"]).Location.Y;

        }
        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            //двигаем форму при движении мыши с учетом смещения
            if (mousedown == true) { ((Form1)Application.OpenForms["Form1"]).SetDesktopLocation(Form1.MousePosition.X - x, Form1.MousePosition.Y - y); }
 
        }
        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            mousedown = false;
        }


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


Заметил побочный эффект! У меня форма без шапки и на ее фон повешена картинка...
вобщем такой эффект как у курсора бывает... двигаю форму, а за ней хвост =)
быстро пропадает, но заметен
От этого можно как-нибудь избавиться?

Автор: ivashkanet 4.9.2006, 08:33
Цитата(Lеstat @  3.9.2006,  21:54, рost842616)
   x = Form1.MousePosition.X - ((Form1)Application.OpenForms["Form1"]).Location.X;
y = Form1.MousePosition.Y - ((Form1)Application.OpenForms["Form1"]).Location.Y;

Lеstat, кривовато как-то  smile 
Ты ведь делаешь обработку в самой форме. Так и пользуйся этим  smile 
Код
this.Location.X

P.S. Я такой код уже http://forum.vingrad.ru/index.php?showtopic=98227&view=findpost&p=746458. Хотя он и 1:0,999999 с твоим smile


Автор: $tatic 4.9.2006, 10:02
ivashkanet, это он приводит разные виды получения объекта формы smile
Lеstat, от хвоста ты наверное не избавишься, это GDI+ с виндой тормозят smile
А код можно упростить за счет того, что у структуры Point есть метод Subtract (в 2.0) и переопределен оператор "-".

Автор: ivashkanet 4.9.2006, 10:07
Цитата($tatic @  4.9.2006,  10:02 Найти цитируемый пост)
ivashkanet, это он приводит разные виды получения объекта формы 

Не думаю  smile Я еще к тому, что 
Цитата(Lеstat @  3.9.2006,  21:54 Найти цитируемый пост)
((Form1)Application.OpenForms["Form1"]).Location.X

Тянет прилично ресурсов (нужно ведь найти форму, по имени  smile )

Автор: Lеstat 4.9.2006, 16:33
Цитата(ivashkanet @ 4.9.2006,  08:33)
Цитата(Lеstat @  3.9.2006,  21:54, рost842616)
   x = Form1.MousePosition.X - ((Form1)Application.OpenForms["Form1"]).Location.X;
y = Form1.MousePosition.Y - ((Form1)Application.OpenForms["Form1"]).Location.Y;

Lеstat, кривовато как-то  smile 
Ты ведь делаешь обработку в самой форме. Так и пользуйся этим  smile 
Код
this.Location.X

P.S. Я такой код уже http://forum.vingrad.ru/index.php?showtopic=98227&view=findpost&p=746458. Хотя он и 1:0,999999 с твоим smile

я почему-то не догнал сразу так попробовать... в C# недавно... 
пробовал Form1.Location... не получилось
поэтому еще долго искал как получить х и у пока не наткнулся на ((Form1)Application.OpenForms["Form1"])

кстати когда переписал через this, то хвост почти исчез... виден, но практически незаметен

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