Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2007.09.16;
Скачать: [xml.tar.bz2];

Вниз

Метод 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 вся ветка

Форум: "Media";
Текущий архив: 2007.09.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.043 c
15-1187213795
SaMar
2007-08-16 01:36
2007.09.16
Предлагаю книги по DELPHI для скачивания!!!


15-1187506992
rol_intal@mail.ru
2007-08-19 11:03
2007.09.16
кабель


1-1183951734
Dr. Andrew
2007-07-09 07:28
2007.09.16
Как эмулировать показ hint нажатием, например, button на форме?


15-1184229560
evvcom
2007-07-12 12:39
2007.09.16
FMP (Феодосия Мастак Пати)


2-1187848771
fd979
2007-08-23 09:59
2007.09.16
Проблема с цветами в ХР





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский