Текущий архив: 2007.09.16;
Скачать: CL | DM;
ВнизМетод Refresh и событие Paint Найти похожие ветки
← →
Галинка © (2006-12-06 13:02) [0]Задача: соединить два объекта "поводком". Т.е. при перемещении одного из объектов на до перерисовывать линию, соединяющую их.
Реализация: в методе объекта OnMouseMove изменяю координаты обхекта и сообветственно координаты центра, к которому и идет соединительная линия. После нахождения новых координат, вызываю метод Refresh родительского контрола, т.е. object.Parent.Refresh(); Refresh в свою очередь вызывает метод Paint этого самого родителя-контейнера и перерисовываем в этом методе "поводок".
Вопрос: почему на контроле сохраняется только одна линия?
← →
Галинка © (2006-12-06 13:06) [1]Вот код проекта:
/* выбирает объект, с которым должен быть связан текущий объект*/
private void label_MouseDoubleClick(object sender, MouseEventArgs e)
{
labOut = sender as Label;
DlgConnection _dlg = new DlgConnection(labOut);
if (_dlg.ShowDialog() == DialogResult.OK)
{
curLbl.Location = new Point(curLbl.Location.X + e.X - newPt.X,
curLbl.Location.Y + e.Y - newPt.Y);
if (curLbl.Tag != null)
{
string strTo = curLbl.Tag.ToString();
int gr = strTo.Length - strTo.IndexOf(" ") - 1;
strTo = strTo.Substring(0, gr);
indTo = Convert.ToInt32(strTo);
this.panel1.Refresh();
}
}
}
/*запоминаем еоординату начальную для перемещения*/
private void label_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left) newPt = new Point(e.X, e.Y);
}
/*перемещаем объект*/
private void label_MouseMove(object sender, MouseEventArgs e)
{
curLbl = sender as Label;
if (e.Button == MouseButtons.Left)
{
curLbl.Location = new Point(curLbl.Location.X + e.X - newPt.X,
curLbl.Location.Y + e.Y - newPt.Y);
if (curLbl.Tag != null)
{
string strTo = curLbl.Tag.ToString();
int gr = strTo.Length - strTo.IndexOf(" ") - 1;
strTo = strTo.Substring(0, gr);
indTo = Convert.ToInt32(strTo);
this.panel1.Refresh();
}
}
}
/*отрисовываем линию-поводок*/
private void panel1_Paint(object sender, PaintEventArgs e)
{
Graphics ge = e.Graphics;
Pen myPen = new Pen(Color.Blue, 3);
if (indTo != -1)
{
Point fromPt = new Point(curLbl.Left + (int)(curLbl.Width / 2),
curLbl.Top + (int)(curLbl.Height / 2));
Label toLbl = (sender as Panel).Controls[indTo] as Label;
Point toPt = new Point(toLbl.Left + (int)(toLbl.Width / 2),
toLbl.Top + (int)(toLbl.Height / 2));
ge.DrawLine(myPen, fromPt, toPt);
}
}
/*создаем объект типа метка*/
private void panel1_MouseClick(object sender, MouseEventArgs e)
{
Label _lb = new Label();
_lb.Parent = this.panel1;
_lb.Location = new Point(e.X, e.Y);
_lb.AutoSize = true;
_lb.Text = "Hallo " + _lb.Parent.Controls.Count.ToString();
_lb.MouseEnter += new EventHandler(label_MouseEnter);
_lb.MouseLeave += new EventHandler(label_MouseLeave);
_lb.MouseMove += new MouseEventHandler(label_MouseMove);
_lb.MouseDown += new MouseEventHandler(label_MouseDown);
_lb.MouseUp += new MouseEventHandler(label_MouseUp);
_lb.MouseDoubleClick += new MouseEventHandler(label_MouseDoubleClick);
_lb.BorderStyle = BorderStyle.None;
_lb.BringToFront();
}
}
← →
DevilDevil © (2006-12-06 13:32) [2]
> Галинка ©
1) ты пишешь компонент?
2) сколько объектов, что они из себя представляют?
3) откуда и куда должна(ы) рисоваться линия(и) ?
← →
Галинка © (2006-12-06 14:21) [3]1) строго говоря да. Но сейчас пока пробую со стандартными лэйблами.
2) объектов произвольное количество. В примере это обычные стандаотные лэблы. Их можно произвольно соединять по два. Для этого есть диалог. В диалог "передается" все сожержимое панели, т.е. Panel.Controls. Индекс "братского объекта" в списке контролс передается в таг, и потом после анализа тага, находится, с каким компонентом надо связать данный.
3) линия должна рисоваться между центрами связанных объектов
← →
Галинка © (2006-12-06 14:24) [4]Сейчас при образовании новой пары, старая исчезает. (( Хотелось бы знать почему?
← →
Галинка © (2006-12-06 15:02) [5]Поробовала пока проще:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace Lines
{
public partial class Form1 : Form
{
private Point altPt, neuPt;
public Form1()
{
InitializeComponent();
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
altPt = new Point(e.X, e.Y);
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
neuPt = new Point(e.X, e.Y);
this.Refresh();
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics gr = e.Graphics;
Pen np = new Pen(Color.Blue, 5);
gr.DrawLine(np, altPt, neuPt);
}
}
}
та же фмгня. Почему контрол "не запоминает", что было нарисовано до этого?
← →
DevilDevil © (2006-12-06 15:13) [6]Это под net что ли?
Под net я не пробовал, под Win32:
// первая точка отрезка
Canvas->MoveTo(X, Y);
// вторая точка отрезка
Canvas->LineTo(X, Y);
← →
Галинка © (2006-12-06 15:36) [7]Да в Дельфи у меня не было проблем. Это в шарпе (( А больше никто не знает ((
← →
Eraser © (2006-12-08 02:03) [8]> [4] Галинка © (06.12.06 14:24)
> Сейчас при образовании новой пары, старая исчезает. (( Хотелось
> бы знать почему?
не вникал в код. а линия между "старой парой" при перерсовке строится?
← →
Eraser © (2006-12-08 04:20) [9]> [5] Галинка © (06.12.06 15:02)
> Почему контрол "не запоминает", что было нарисовано до этого?
по тому же почему не запоминал и в делфи ))
вобщем решил я тут попрактиковаться в C#
вот проект по твоему ТЗ http://slil.ru/23536373 :-)
перетаскивание меток можно улучшить конечно, но уже пол 5 утра - лень стало )
ЗЫ
проект на MSVS2005.
Страницы: 1 вся ветка
Текущий архив: 2007.09.16;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.047 c