mrgloom 242 Жалоба Опубликовано May 25, 2011 Допустим я рисую поверх картинки с помощью PolyPolyline, нарисовал например квадрат, как сделать так чтобы этот квадрат можно было передвигать мышкой? т.е. например перемещать то его наверно возможно отлавливая куда указывает мышка и начинать отрисовывать левый верхний угол квадрата с этой точки, но как сделать как бы драг энд дроп(хотя наверно можно проверять координату мышки и координаты квадрата и если расстояние между ними меньше какой то константы и нажата кнопка мыши, то при передвижении курсора мышки чтобы двигался квадрат)? Как сохранить изображение с нанесенным на него квадратом аля принтскрин, только какую то область изображения. есть идея брать координаты нарисованных линий и рисовать их в само изображение, но может можно как то средствами GDI не залезая в изображение? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
TroyashkA 12 Жалоба Опубликовано May 25, 2011 Допустим я рисую поверх картинки с помощью PolyPolyline, нарисовал например квадрат, как сделать так чтобы этот квадрат можно было передвигать мышкой? т.е. например перемещать то его наверно возможно отлавливая куда указывает мышка и начинать отрисовывать левый верхний угол квадрата с этой точки, но как сделать как бы драг энд дроп(хотя наверно можно проверять координату мышки и координаты квадрата и если расстояние между ними меньше какой то константы и нажата кнопка мыши, то при передвижении курсора мышки чтобы двигался квадрат)? Для этого надо поймать событие назажатия WM_LBUTTONDOWN левой кнопки мыши и ловить события перемещения WM_MOUSEMOVE указателя мыши (это даст координаты указателя), при перемещении производить repaint изображения. Как сохранить изображение с нанесенным на него квадратом аля принтскрин, только какую то область изображения. есть идея брать координаты нарисованных линий и рисовать их в само изображение, но может можно как то средствами GDI не залезая в изображение? А зачем? Получаете изображение - выделяете нужную часть ... Ну как вариант, для особо извращенных старательных - программно снять скриншот, узнать координаты формы приложения (глобальные) GetWindowRect(), узнать координаты контрола (локальные), ну и собственно выделить необходимый участок. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано May 25, 2011 Для этого надо поймать событие назажатия WM_MBUTTONDOWN левой кнопки мыши и ловить события перемещения WM_MOUSEMOVE указателя мыши (это даст координаты указателя), при перемещении производить repaint изображения. это просто сделает перемещение квадрата на то место куда указывает мышка, я же про то говорил, что его надо сначала "подхватить",а потом уже двигать. А зачем? Получаете изображение - выделяете нужную часть ... Ну как вариант, для особо извращенных старательных - программно снять скриншот, узнать координаты формы приложения (глобальные) GetWindowRect(), узнать координаты контрола (локальные), ну и собственно выделить необходимый участок. не очень понял, если просто выделить часть изображения и сохранить ее, то сохранится только эта часть ,а мне надо чтобы сохранилось, и то что я нарисовал поверх, т.е. изображение, а на нем нарисован квадрат. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
TroyashkA 12 Жалоба Опубликовано May 25, 2011 это просто сделает перемещение квадрата на то место куда указывает мышка, я же про то говорил, что его надо сначала "подхватить",а потом уже двигать. Нет не сделает ... у мыши есть события: WM_LBUTTONDOWN // при ЗАжатии левой кнопки мыши WM_MOUSEMOVE // при перемещении мыша WM_LBUTTONUP // при отпускании левой кнопки мыши линк: http://msdn.microsof...7(v=VS.85).aspx Делаем репаинт при перемещении и зажатой левой кливиши мыши, при вылове события WM_LBUTTONUP фиксируем координаты квадрата по координатам указателя мыши + некоторое смещение, ведь мы можем ухватиться за любое место квадрата не очень понял, если просто выделить часть изображения и сохранить ее, то сохранится только эта часть ,а мне надо чтобы сохранилось, и то что я нарисовал поверх, т.е. изображение, а на нем нарисован квадрат. Почему не сохранится ? У вас ж "квадрат" тоже перемещается и находится на изображении, точнее, он часть этого изображения. p.s. Может я не так все понимаю, будет лучше все визуализировать, как говорится: "лучше 1 раз увидеть, чем ..." Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
TroyashkA 12 Жалоба Опубликовано May 25, 2011 Вот накидал простенький код на C#: using System; using System.Drawing; using System.Windows.Forms; using Timer = System.Windows.Forms.Timer; namespace OLOLO { public partial class Form1 : Form { private const int KvadratWh = 100; // размер стороны ■ private int _kvadratShiftX, _kvadratShiftY; // значения смещений Rectangle _kvadrat; // ■ readonly Timer _repainter = new Timer(); // таймер, делающий репаинт private bool _leftBtnDown; // флаг, хранящий ЗАжатие ЛКМ public Form1() { InitializeComponent(); _kvadrat = new Rectangle(pb1.Width / 2 - KvadratWh / 2, pb1.Height / 2 - KvadratWh / 2, KvadratWh, KvadratWh); // центрируем ■ _repainter.Interval = 50; // репаинт через каждые 50 мс _repainter.Tick += RepainterTick; _repainter.Start(); } void RepainterTick(object sender, EventArgs e) { var graphics = pb1.CreateGraphics(); graphics.FillRectangle(Brushes.Tomato, 0, 0, pb1.Width, pb1.Height); // рисуем фон graphics.FillRectangle(Brushes.Black, _kvadrat); // рисуем ■ } private void Pb1MouseMove(object sender, MouseEventArgs e) { if (_leftBtnDown) { _kvadrat.X = e.X - _kvadratShiftX; _kvadrat.Y = e.Y - _kvadratShiftY; } } private void Pb1MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) _leftBtnDown = false; } private void Pb1MouseDown(object sender, MouseEventArgs e) { if ((e.Button == MouseButtons.Left) & (IsInKvadrat(e.X, e.Y))) { _kvadratShiftX = e.X - _kvadrat.X; _kvadratShiftY = e.Y - _kvadrat.Y; _leftBtnDown = true; } } bool IsInKvadrat(int x, int y) { if (((_kvadrat.X <= x) & (_kvadrat.X + KvadratWh >= x)) & ((_kvadrat.Y <= y) & (_kvadrat.Y + KvadratWh >= y))) return true; return false; } } } Или вот проект: OLOLO.rar Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано May 26, 2011 Делаем репаинт при перемещении и зажатой левой кливиши мыши, при вылове события WM_LBUTTONUP фиксируем координаты квадрата по координатам указателя мыши + некоторое смещение, ведь мы можем ухватиться за любое место квадрата. я говорил про то, что его надо "захватить", т.е. если я щелкаю в какой то окрестности рамки квадрата(да на самом деле не квадрат, а рамка, или произвольная фигура состоящая из линий, которые рисуются PolyPolyline) то фигура "захватывается" и я могу ее перетаскивать. в целом то можно смотреть расстояние от той точки где была зажата кнопка мыши до ближайшей точки фигуры, если фигура сложная я пока не понял как правильно посчитать, точнее как хранить координаты этой фигуры, чтобы легко посчитать. Почему не сохранится ? У вас ж "квадрат" тоже перемещается и находится на изображении, точнее, он часть этого изображения. потому что это как бы 2 разных слоя 1 само изображение, а другой линии которые выводятся PolyPolyline. т.е. можно перерисовать линии не перерисовывая картинку, а можно наоборот. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
TroyashkA 12 Жалоба Опубликовано May 26, 2011 я говорил про то, что его надо "захватить", т.е. если я щелкаю в какой то окрестности рамки квадрата(да на самом деле не квадрат, а рамка, или произвольная фигура состоящая из линий, которые рисуются PolyPolyline) то фигура "захватывается" и я могу ее перетаскивать. в целом то можно смотреть расстояние от той точки где была зажата кнопка мыши до ближайшей точки фигуры, если фигура сложная я пока не понял как правильно посчитать, точнее как хранить координаты этой фигуры, чтобы легко посчитать. потому что это как бы 2 разных слоя 1 само изображение, а другой линии которые выводятся PolyPolyline. т.е. можно перерисовать линии не перерисовывая картинку, а можно наоборот. 1) В примере, что я привел, тоже существует неявное разделение на пару слоев - фон и собственно сам квадрат. Насчет "захвата" - тут всё просто: гляньте функцию: bool IsInKvadrat(int x, int y) { if (((_kvadrat.X <= x) & (_kvadrat.X + KvadratWh >= x)) & ((_kvadrat.Y <= y) & (_kvadrat.Y + KvadratWh >= y))) return true; return false; } Она проверяет, не тыкнули ли мы в нашу фигуру: если это так - подхватываем её и таскаем сколь душе угодно. 2) Теперь насчет слоев - ведь в конце концов все выводится на конечное 2-х мерное изображение и пофигу сколько у вас слоев - изображение в итоге у вас одно. Всё, что вам нужно - в примере, что я скинул выше. 3) Так как вы рисуете вашу фигуру (какой-бы она ни была бы формы) - следовательно, вы знаете её координаты. Проблема может быть в том, что вы хотите прозрачности или что-то еще, ну тут тоже дело поправимое. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано May 26, 2011 я имел ввиду не закрашенную фигуру ,а контур, т.е. фигура состоит только из линий, пример на картинке, даже могут быть линии быть и не связаны, но они должны передвигаться как одно целое. т.е. в общем случае надо цикл по всем линиям прогнать и посмотреть расстояние до точки где была нажата мышка и если хотя бы в 1 случае расстояние будет меньше заданной величины, то передвигаем фигуру. Теперь насчет слоев - ведь в конце концов все выводится на конечное 2-х мерное изображение и пофигу сколько у вас слоев - изображение в итоге у вас одно. еще раз посмотрю как оно рисуется и скажу поподробней. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах