Главная страница
    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.48 MB
Время: 0.042 c
8-1165417477
algol
2006-12-06 18:04
2007.09.16
Разобрать медиа файл и построить спектр


15-1187700376
сейчас_злой
2007-08-21 16:46
2007.09.16
Ищу работу... есть опыт програмирования на Delphy


2-1187609682
R.O.O.T
2007-08-20 15:34
2007.09.16
Вопрос!!!


2-1187716884
tim_ka
2007-08-21 21:21
2007.09.16
Stretch Bitmap


2-1187949224
Adios
2007-08-24 13:53
2007.09.16
real and integer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский