Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.029 c
15-1187590944
kudatsky
2007-08-20 10:22
2007.09.16
Пропали хинты


2-1187597172
tomkat
2007-08-20 12:06
2007.09.16
Компоненты в консольном приложении


15-1187433979
GhosTer
2007-08-18 14:46
2007.09.16
Где взять?


15-1187385078
Real
2007-08-18 01:11
2007.09.16
MIDI кабель


15-1187506728
rol_intal@mail.ru
2007-08-19 10:58
2007.09.16
сименс сотовый