Форум Кургана и Курганской области и наших друзей

Зима. Форум Кургана и Курганской области и наших друзей
01 Декабрь 2020, 23:57:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости:
 
   Начало   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: C# Граф  (Прочитано 2499 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Андрюшка
Корабельный секретарь
***

Карма: -6
Offline Offline

Пол: Мужской
Сообщений: 163


Россия навсегда!


Награды
« : 14 Апрель 2012, 19:31:37 »

Здравствуйте. Тут такая проблема. Я рисую граф на C#. Делаю так, чтобы его вершины можно было перетаскивать мышкой. Они перетаскиваются очень медленно. Помогите найти почему.
Вот функция, которая рисует
Код:
public void DrawAll(int e)
        {
            Bmp = new Bitmap(picture.Width, picture.Height);
            gr = Graphics.FromImage(Bmp);
            picture.Image = Bmp;
            gr.SmoothingMode = SmoothingMode.AntiAlias;
            SolidBrush SB = new SolidBrush(Color.Azure);
            Font FN = new Font("Arial", 14);
            //рисуем вершины
            for (int i = 0; i < LS.Count; i++)
            {
                gr.DrawEllipse(PN, LS[i].pn.X - 16, LS[i].pn.Y - 16, 32, 32);
                gr.FillEllipse(BR, LS[i].pn.X - 16, LS[i].pn.Y - 16, 32, 32);
                gr.DrawString((i + 1).ToString(), FN, SB, LS[i].pn.X-10,LS[i].pn.Y-10);
            }

            SB = new SolidBrush(Color.Black);
            //рисуем вершину на которую навели мышкой
            if (e >= 0)
            {
                gr.DrawEllipse(PN, LS[e].pn.X - 16, LS[e].pn.Y - 16, 32, 32);
                gr.FillEllipse(Brushes.Aquamarine, LS[e].pn.X - 16, LS[e].pn.Y - 16, 32, 32);
                gr.DrawString(LS[e].number.ToString(), FN, SB, LS[e].pn.X - 10, LS[e].pn.Y - 10);
            }
           
          }
Получение номера вершины на которую навели мышкой
Код:
  public int GetPointers(Point e)
        {
            for (int i = 0; i < LS.Count; i++)
            {
                if (e.X <= LS[i].pn.X + 16 && e.X >= LS[i].pn.X - 16 && e.Y <= LS[i].pn.Y + 16 && e.Y >= LS[i].pn.Y - 16)
                    return i;
            }
            return -1;
        }
Обработчик события картинки
Код:
private void picture_MouseMove(object sender, MouseEventArgs e)
        {
            //проверяем куда навели
            int point;
            point = GetPointers(e.Location);
            if (point != -1)
            {
                DrawAll(point);
            }
            else
                DrawAll(-1);

            if (e.Button == MouseButtons.Right && point >= 0)
            {
                LS[point].pn = e.Location;
               
            }
        }
LS - это переменная типа List<Tree>. Tree - это класс вершин.
Записан
ysv45
Гость
« Ответ #1 : 14 Апрель 2012, 19:44:27 »

Попробуйте буферизацию http://msdn.microsoft.com/ru-ru/library/ka0yazs1(v=VS.90).aspx
Записан
Андрюшка
Корабельный секретарь
***

Карма: -6
Offline Offline

Пол: Мужской
Сообщений: 163


Россия навсегда!


Награды
« Ответ #2 : 14 Апрель 2012, 19:51:36 »

А чем это ускорит? Вообще проблема в том, что я перетаскивая вершину медленно мышкой то все ок. если двигают мышь быстрее, то вершина отцепляется от курсора и все.
Записан
ysv45
Гость
« Ответ #3 : 14 Апрель 2012, 21:12:52 »

А чем это ускорит? Вообще проблема в том, что я перетаскивая вершину медленно мышкой то все ок. если двигают мышь быстрее, то вершина отцепляется от курсора и все.

Делай передвижение не при полном равенстве, а при небольшом отличии.
Записан
Андрюшка
Корабельный секретарь
***

Карма: -6
Offline Offline

Пол: Мужской
Сообщений: 163


Россия навсегда!


Награды
« Ответ #4 : 14 Апрель 2012, 21:51:15 »

Нашел статью на Хабре "Редактор векторной графики". Там это реализовано, буду смотреть как. Спасибо за помощь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.11 | SMF © 2006-2008, Simple Machines LLC
rss | wap
Valid XHTML 1.0! Valid CSS!