|
|
| Посл.отвђт | Сообщен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 и всегда опрашивать весь список, а десятки тысяч блоков - трудно даже представить..., хотя я знаю где их может быть столько ;-) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.107 |