· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Интерфейс типа Delpi или Viso

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Дек 14, 2003 06:04:32

Господа мне нужно сделать интерфейс подобный тому что есть в Microsoft Visio, т.е. кучка блоков со своими свойствами и связи между ними которые можно таскать по окну и редактировать их свойства. Единственная идея которая лезет в голову это отображение канвы и запоминание графических координат каждого объекта + слежение за грызуном но это когда блоков мало, а если их несколько десятков? Поделитесь пожалуйста идеями кому не жалко, пойдут любые даже самые безумные с исходниками или без оных. Заранее спасибо тем кто откликнится.


Дата: Дек 14, 2003 06:17:02

:-) Я как раз об этом хочу цикл статей написать, но уже в следующем году. Идея может быть только одна - классическая, с использованием ООП. Иначе никак, разве что чужой контрол использовать через OLE-COM. Количество блоков далеко не самое узкое место...


Дата: Дек 14, 2003 06:47:27

>>Идея может быть только одна - классическая, с использованием ООП
Это как раз и понятно, проблемма для меня состоит только в отображении на экране всей этой мути и в выборе (таскании) конкретного блока мышью или клавой. А дописать редактор свойств блока труда не составляет. А вот чужой контрол использовать не желательно из-за некоторой спесифичности задачи. Проги свои я обычно пишу без использования гуев, типа получил задание выполнил и отвали, а тут именно гуи вотя и не знаю с какого бока к нему подлезть.


Дата: Дек 14, 2003 06:51:59

>>Идея может быть только одна - классическая, с использованием ООП
Это как раз и понятно, проблемма для меня состоит только в отображении на экране всей этой мути и в выборе (таскании) конкретного блока мышью или клавой. А дописать редактор свойств блока труда не составляет. А вот чужой контрол использовать не желательно из-за некоторой спесифичности задачи. Проги свои я обычно пишу без использования гуев, типа получил задание выполнил и отвали, а тут именно гуи вотя и не знаю с какого бока к нему подлезть.


Дата: Дек 14, 2003 06:53:10

Упс пардон браузер чего-то глюкнул.


Дата: Дек 14, 2003 14:03:29 · Поправил: Black_mirror

Grevgeny
Чтобы не проверять все блоки можно сделать так:
Берем разбиваем нашу рабочую область на квадратики. Пусть размер каждого квадратика будет чуть больше чем размер самого большого блока. Сопоставляем каждому квадратику ячейку массива. В этой ячейке хранится указатель на начало списка блоков, левый верхний угол которых попадает в данный квадратик. Тогда чтобы определить куда попадает курсор мыши нужно будет проверить блоки в 4 квадратиках: над которым находится курсор, который правее, который ниже и в том который правее и ниже.
Если размеры блоков сильно различаются то возможно придется помещать большие блоки сразу в несколько списков. Тут нужно выбрать такой размер квадратиков, чтобы с одной стороны в них не попадало слишком много блоков, а с другой чтобы блок не попадал в слишком большое количество списков.


Дата: Дек 14, 2003 16:55:34 · Поправил: rst

для таскание делаешь так (С++):
Создаешь интерфейс манипуляции фигурой, обзываешь его CShape.
для каждого объекта генерируешь формулу, которая определяет площадь фигуры (площадь - имеется ввиду не сколько занимает места фигура, а описывает саму фигуру - круг, квадрат, параллелепипед и т.д. )
Пишешь функцию с названием к примеру CheckHover (POINT p) по которой определяешь находиться ли мыша сейчас над этим объектом или нет.
Ну и дальше все просто..
vector<CShape> vec_shapes;
в WM_LBUTTONDOWN: {
   POINT pnt;           
   pnt.x=LOWORD(lParam);
   pnt.y=HIWORD(lParam);

   vector<CShape>::iterator i;
   for (i=vec_shapes.begin();i!=vec_shapes.end();i++)
   {
      if (i->CheckHover(pnt))
      {
        i->Moving=true;
        i->MousePos=pnt;
        break;
      }
   }
}
WM_MOUSEMOVE: {
   POINT pnt;           
   pnt.x=LOWORD(lParam);
   pnt.y=HIWORD(lParam);

   vector<CShape>::iterator i;
   for (i=vec_shapes.begin();i!=vec_shapes.end();i++)
   {
      if (i->Moving)
      {
        i->DoMove(pnt);
        break;
      }
   }
   
}


Дата: Дек 14, 2003 17:50:30

Black_mirror
Можно и так, но только если все блоки имеют прямоугольную форму, а как быть со стрелками?

rst
Примерно так я и делаю, только на асме :-)

Grevgeny
Там соль заключается не в перетаскивании блока, а в автоматической перерисовке стрелок, которые висят на данном блоке.


Дата: Дек 14, 2003 18:12:48

Quantum - задачу подобного рода я никогда бы на асме не писал -) Но да это наверное мой удел -)
Greveny - а вообще-то есть прекрасные OpenSource аналоги Visio под линух. ArgoUML к примеру. Идем на www.freshmeat.net качаем, учимся.


Дата: Дек 14, 2003 18:25:45

rst
Да, полно готовых примеров на ЯВУ, особенно на Java. У меня на них аллергия :-)


Дата: Дек 14, 2003 19:22:21

Ну у кого как... Может быть если бы у меня было много времени, либо _очень_ много экспириенса, либо если бы я был просто Сеймуром Креем - я бы тоже все писал на асме, а так приходится искать наиболее оптимальный вариант, которым асм бывает относительно редко.


Дата: Дек 14, 2003 19:30:05

Хмм спасибо конечно но....

rst
linux это линух а мне нужно под винду, и насколько я понимаю у нее (винды) совершенно разные способы работы гуев с по сравнению линухом. Да и не работаю я с линухом не ндравиться он мне сильно.

Помог бы способ работы с диалогами в RadAsme но чегото я на него исходников надыбать никак на сайте не можу может подскажет кто?


Дата: Дек 14, 2003 19:32:56

Grevgeny - да причем тут линух и винда?
начнем с того, что многие UML-редакторы пишутся на Яве. Помимо этого - тебе нужен как раз алгоритм работы оного. И я тебе привел пример где его можно надыбать. Хотя если тебе конечно нужно уже готовое решение ака "напишите за меня" то ты не по адресу обратился -)


Дата: Дек 14, 2003 19:43:18

Quantum
Стрелки тоже можно рассматривать как блоки. Вообще идея была в том, что большой список блоков нужно разбить на маленькие чтобы не проверять все блоки. Хотя это стоит делать только если блоков десятки тысяч. А определять что ближе всего к курсору мыши естественно нужно вызывая метомы блоков.


Дата: Дек 14, 2003 22:18:07

Black_mirror
В точку! Правда, у меня была задача чуть сложнее, со степенью вложенности (блоки внутри других блоков) и пришлось добавить нечто вроде координаты Z и всегда опрашивать весь список, а десятки тысяч блоков - трудно даже представить..., хотя я знаю где их может быть столько ;-)

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.107