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


Автор: larinva 7.9.2010, 08:48
Всем привет! подскажите как в этом коде реализовать перетаскивание картинки по форме с Label и тому подобными контролами все понятно а вот с картинкой у меня затруднение 
Form2
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        Form1 f;
        private void button1_Click(object sender, EventArgs e)
        {
            f.X = 100;
            f.Y = 100;
            f.image = Image.FromFile(@"D:\roze.bmp");
            f.s = "Фигня456456456456456456456465";
            f.Invalidate();
        }
        
        public Form2(Form1 form1)
        {
            InitializeComponent();
            this.f = form1;
        }
    }
}


Form1
Код

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public int X { get; set; }
        public int Y { get; set; }
        public string s { get; set; }
        public Image image { get; set; }

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 frm = new Form2(this);
            frm.Show();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            if (image!=null && !string.IsNullOrWhiteSpace(s))
            {
                e.Graphics.DrawImage(image, X, Y);
            e.Graphics.DrawString(s, SystemFonts.DefaultFont, SystemBrushes.WindowText, new Point(X, Y));
            }
        }
    }
}

Суть кода из Form2 на Form1 добавляется картинка и ее нужно двигать по форме. Помогите очень нужно smile 

Автор: larinva 7.9.2010, 10:32
кто нибудь отзовитесь

Автор: CYBERDREAM 7.9.2010, 11:15
что то не пойму каким образом перетаскиванеи происходит

Автор: larinva 7.9.2010, 11:18
как раз и нужно добавить в этот проект перетаскивание

Автор: CYBERDREAM 7.9.2010, 11:33
а зачем переопределен онпаинт? может засадить картинку в PictureBox лучше?

Суть описана тут http://blog.ninethsense.com/move-a-control-with-mose-on-form/

Автор: larinva 7.9.2010, 11:57
онпайнт переопределен для того чтобы добавлять картику из form2 на form1. Я знаю как перемещать кнопки листбоксы и тому подобные контролы, проблема у меня именно в перемещении картинки которую добавляю с form1 на form2

Автор: CYBERDREAM 7.9.2010, 12:31
для этого переопределять думаю не обязательно. А в чем конкретно проблема?

Автор: gambit 7.9.2010, 12:35
larinva,
1. загнать картинку в свой класс, которому передавать координаты клика мыши, а он будет определять попал ли клик именно по картинке.
2. Держать в Form1 2 переменных типа Point (левый верхний и нижний правый угол картинки), и смотреть попадает ли мышь в данный диапазон.

Я бы пошел по первому пути, ибо он расширяем (например в дальнейшем надо будет поворачивать картинку, тогда надо будет добавить один метод в свой класс, а не городить непонятные действия в коде формы).

Если надо, то через пол часика накидаю пример

Автор: larinva 7.9.2010, 12:52
Отлично gambit пример нужен  smile 

Автор: Fortnox 7.9.2010, 13:53
Время было, набросал пример.

Наш PictureBox:
Код

    public class MPictureBox: PictureBox
    {
        private int m_oldX;
        private int m_oldY;

        public int OldX
        {
            get { return m_oldX; }
        }

        public int OldY
        {
            get { return m_oldY; }
        }

        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);
            if (e.Button == MouseButtons.Left)
            {
                m_oldX = e.X;
                m_oldY = e.Y;
            }
        }

        protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);

            if (e.Button == MouseButtons.Left)
            {
                this.Left += (e.X - m_oldX);
                this.Top += (e.Y - m_oldY);
            }
        }
    }


И небольшой пример.

Автор: larinva 7.9.2010, 14:01
если не сложно gambit скинте тоже примерчик smile 

Автор: CYBERDREAM 7.9.2010, 14:20
в итоге используется то же самое что и по ссылке было. 
Fortnox, по ходу вариант этот не подойдет) от PictureBox отказался автор)

Автор: larinva 7.9.2010, 14:22
да ты прав  CYBERDREAM через PictureBox не подходит

Автор: CYBERDREAM 7.9.2010, 14:23
larinva, колись, в чем проблема то, что именно не получается? Ты так и не ответил на мой вопроис smile 

Автор: larinva 7.9.2010, 14:40
CYBERDREAM прикрепил проект. Нужно реализовать перетаскивание роз по форме в этом у меня и заключается проблема 

Автор: gambit 7.9.2010, 14:44
по нажатию на кнопку на второй форме, добавляется 5 картинок на первую. Все можно двигать.

В целом можно все это оптимизировать, доделать, что бы при клике по мышке, левый верхний угол картинки не прыгал под мышь.
Так же не реализована подпись под картинкой, но это тебе пример как легко данный подход расширять. Что бы добавить подпись под картинкой, надо в классе картинки завести переменную стринг, этот стринг принимать через конструктор и выводить в методе Draw.

Автор: gambit 7.9.2010, 14:49
larinva, совет: никогда не оставляй имена контролов по умолчанию. В том проекте который я прикрепил, я этим тоже грешу, но грешу в меру, и это все равно пример, который посмотрится и удалиться. А у тебя проект, который тебе расширять и сопровождать - сейчас в нем 2 формы и один класс, а уже нихрена не понятно что и куда.

Автор: CYBERDREAM 7.9.2010, 15:02
в итоге суть то таже) по ходу автор не мог понять как отследить нажатие на изображение

Автор: larinva 7.9.2010, 15:04
Сп-бо за совет gambit я стараюсь давать контролам понятные имена этот проект тестовый я в нем отрабатываю, что нужно и потом переношу в настоящий делаю это для того чтобы в нормальном проекте не нахерачить т.к  еще мало опыта в программировании. И отдельное сп-бо за примеры и помощь с меня + smile

Добавлено @ 15:06
подскажите CYBERDREAM как это сделать
Цитата

в итоге суть то таже) по ходу автор не мог понять как отследить нажатие на изображение 


Автор: Fortnox 7.9.2010, 15:07
CYBERDREAM, уже понял). Значит пойдем другим путем.

larinva, дело в том, хоть вы и создаете элементы управления, и размещаете их. После, судя по коду, вы попросту рисуете картинку и текст поверх элемента.
Логичнее было бы, как вариант, размещать картинку и текст внутри элемента управления и, либо рисовать их, либо поместить элементы, тот же PictureBox (для картинки) и Label (для текста).

Немного подправил ваш проект, чтобы показать наглядно, что я имел ввиду.

Автор: CYBERDREAM 7.9.2010, 15:09
так ведь уже сделано, у класса MyPicture определен методо IsMe  вот он и проверяет кликнул ты в нем или нет.

Код

 private void MainForm_MouseDown(object sender, MouseEventArgs e)
        {
            foreach (var item in pictures)
            {
                if (item.isMe(e.Location)) //вот здесь проверяется попал или нет (так сказать ранен или мимо)
                {
                    idDrag = item;
                    isDrag = true;
                    return;//лучше его добавить, по большей части смысла нет в продолжении поиска (разве что если картинки разного размера, то тогда выбирать с меньшим)
                }
            }
        }


Добавлено через 2 минуты и 50 секунд
larinva, значит проблема у тебя была именно в этом, определить куда кликнул. Про это я тебя и спрашивал)

Автор: larinva 7.9.2010, 21:29
Знаю, что можно добавлять через контролы как в примере у Fortnox, но не катит потому, что подпись к картинкам обрезается размерами котрола я потому и сделал так а своем примере!!!!

Автор: CYBERDREAM 7.9.2010, 23:02
ну я думаю можно было и так реализовать, было бы желание) ну да ладно. Главное работает

"Мы не ищем легких путей, нам лень"  smile 

Автор: larinva 8.9.2010, 08:54
Сп-бо всем кто откликнулся, Примеров много буду разбираться. Думаю что тему можно закрывать  smile 

Автор: larinva 8.9.2010, 22:35
Все понятно, но при добавлении картинок на panel они перестают двигаться че за хрень с моими кривыми руками. Пришлось продолжить тему, если еще не устали от моей глупости подскажите 

Автор: CYBERDREAM 8.9.2010, 22:57
Доброй ночи) 
Думаю ты таки не уяснил суть событий. В исходниках gambit'a форма подписана на события MainForm_MouseMove, MainForm_MouseUp, ...  и прочая ересь.
Теперь же у тебя картинки на панели, так что нужно их подписать на эти же события, а форму можно отписать. 
(В PropertyWindow в закладке события)

Добавлено через 1 минуту и 7 секунд
либо вручную в дизайнере) это позапористее smile 

Автор: larinva 8.9.2010, 23:04
И тебе доброй ночи CYBERDREAMщас попробую smile Чет мне все это как-то с трудом дается вроде не глупый. ))) Теперь бы еще понять что ты написал CYBERDREAM
Цитата

так что нужно их подписать на эти же события, а форму можно отписать. 
(В PropertyWindow в закладке события)

Автор: CYBERDREAM 8.9.2010, 23:18
см. Аттач. для формы убираешь ненужные подписки на события, а на панели устанавливай

Автор: larinva 8.9.2010, 23:31
делал так с примером от gambit никуя не работает (((((

Автор: CYBERDREAM 9.9.2010, 06:53
Вариант с панелью

Автор: larinva 9.9.2010, 08:37
За возню со мной + тебе CYBERDREAM, Может кто подскажет что нужно читать чтобы не задавать такие вопросы?
Или на начальном этапе у всех так?

Автор: larinva 9.9.2010, 10:14
А что делать с мерцанием CYBERDREAM? если не сложно

Автор: CYBERDREAM 9.9.2010, 12:23
На начальном этапе я бы почитал книжку. Я читал Троелсена. Хотя и нудновато местами. Остально все прийдет) 
А на счет мерцания пока не скажу, надо обмозговать)) чуть позже освобожусь
 smile

Добавлено через 22 секунды
а где плюсик))))))))

Автор: larinva 9.9.2010, 12:38
За + CYBERDREAM  извиняюсь исправился )))

Автор: CYBERDREAM 9.9.2010, 18:07
Боюсь придется создать свой контрол)
В аттаче таковой, отличие от твоего то, что прорисовка происходит в onpaintBackground ну и коллекцию изображений я тоже внес в контрол.

Добавлено через 2 минуты и 18 секунд
кстати без двойной буферизации никак, так что
http://msdn.microsoft.com/ru-ru/library/system.windows.forms.control.setstyle.aspx было использовано

Автор: larinva 9.9.2010, 22:04
а по другому избавиться от мерцания и как?

Автор: CYBERDREAM 9.9.2010, 22:06
а чем не устраивает с контролом своим? По другому никак, ведь перекрыть метод OnPainBackGround никак. 
Сделай контрол и не парься)

Добавлено через 53 секунды
GDI всегда ведь тормознутый был и будет) переходи на WPF

Автор: larinva 9.9.2010, 22:15
а что WPF действительно хорош?

Автор: CYBERDREAM 9.9.2010, 22:19
http://ru.wikipedia.org/wiki/Windows_Presentation_Foundation 

и все же, как прогресс с панелью? 

Автор: larinva 9.9.2010, 22:27
а с литературой на русском похоже проблемка или я ошибаюсь smile

Добавлено через 1 минуту и 13 секунд
думаю что делать с панелью

Автор: CYBERDREAM 9.9.2010, 22:37
на счет панели: контрол, который я сделал, можно унаследовать от Panel. И вот у тебя получится расширенный Panel для своих нужд без мерцаний. Иначе не реализуешь - такая уж наша судьба грешная. Да ничем это ведь тебе не помешает, или нет?

На счет WPF 
WPF. Windows Presentation Foundation в .NET 3.5 с примерами на C# 2008 для профессионалов
в сети полно сурсов для закачки. Если не найдешь, напишу в личку - незнаю можно ли выкладывать линки. На днях буду покупать эту книгу. Но все же тебе нужно почитать и про основы шарпа, прежде чем переходить к WPF - на мой взгляд, а то без базы сложновато будет

Автор: larinva 9.9.2010, 22:46
нашел 
Цитата

WPF. Windows Presentation Foundation в .NET 3.5 с примерами на C# 2008 для профессионалов

а на счет основ читаю тока чет с трудом дается
читаю вроде все понятно,а как начинаю что - то делать то как баран на новые ворота смотрю ((((

Автор: CYBERDREAM 10.9.2010, 09:14
так как с контролом, вариант подошел?

Автор: larinva 10.9.2010, 09:36
я еще не пробовал чет с утра загружен как тока так сразу отпишусь )))

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