задача: запрограммировать графику, например: поле, на нем распологаются графические элементы, их можно выделять, перетаскивать, и т.п., ну как например в визио. вот даже не знаю как это назвать чтобы в инете поискать, все не то выдает, в какую сторону копать? ps ну или может универсальные компоненты для этого есть какие готовые
Копать надо в сторону ООП. В двух словах: 1. Cоздается абстрактный класс с виртуальной функцией рисования, например Draw. В качестве параметра в эту функцию передается, например graphics если это .NET, или canvas - если Delphi. 2. Создаются обычные классы на основе ранее созданного абстрактного. Каждый из них хранит уже полную информацию о том что и где именно надо рисовать. Для каждого из таких классов функция Draw обретает свою окончательную функциональность. 3. В рамках документа создается список ссылок на абстрактный класс, который заполняется ссылками на объекты того или иного обычного класса. Т.е. к примеру, в момент добавления нового объекта в зависимость от того, какая кнопка на панели инструментов нажата, в список добавляются объекты различных классов. 4. Для PictureBox или еще какого элемента, где будет выводиться полный рисунок, добавляется обработчик OnPaint, в котором для каждого элемента списка вызывается виртуальная функция Draw, которая сама будет различным образом обрабатываться для объектов различного типа. Если надо, могу пример на C# какой-нибудь рабочий подыскать.
DirectX, пасиб, я сам кое что нарыл уже - основы GDI так сказать, но у меня появились идея другого подхода. Суть - нужны объекты на картинке, их можно выделить, и просмотреть инфу по ним (инфа берется из бд) 1. рисовать эти объекты самому - вот про который я и спросил изначально; 2. 2.1. нарисовать карту с границами объектов (черным например цветом границы) - физический графический файл (bmp/jpeg/...), отметить на нем цветом области которые объектами не являются (например желтый), а сами объекты внутри их границы - белым цветом. 2.2. потом алгоритмом как в пайнте - закрасить область - он красит все до границы начиная с указанного пиксели, если есть разрыв линии - красит соседние области; 2.3. в бд хранить объекты (их инфу, состояние) и тот начальный пискель закраски, в соответствие с картой. и потом при отрисовке - закрашивать объекты внутри границы нужным цветом в зависимости от состояния объекта, алгоритм закраски будет всегда красить до границы (типа выделение объекта ); 2.4. моменты которые надо продумать - ограничения на правила рисования изначальной карты (всегда рисовать границы и выделять каким либо цветом "области-не-объекты") и при изменении масштаба карты - начальные пиксели закраски - могут сдвинуться и попасть в другие области вот такая идейка ps у тебя нет инфы по алгоритму закраски из пейнта ?
Вы конечно не обижайтесь, но способ ИМХО на редкость извращенческий Все же рекомендую обратить самое пристальное внимание на систему с абстрактными классами - это собственно самая общепризнанная система организации подобной функциональности. И более чем уверен, что Visio, Corel Draw и т.п. сделаны исключительно на рисовании объектов с помощью виртуальных функций. Там вся сложность, собственно, в оптимизации процесса рисования, чтобы по 100 раз не перерисовывать невидимые или неизменные участки, но концепция там однозначно аналогичная - список указателей/ссылок и автоматическая его прорисовка через виртуальные функции. Что касается информации об объекте под курсором, то эта задача решается в таком же ключе на раз-два. В базовом абстрактном классе рядом с функцией Draw добавляется пара функций вроде такой: virtual bool IsMouseOver(int x, int y); virtual string GetInfo(); В наследных классах они переопределяется и в соответствии с геометрией конкретного объекта и его свойствами. IsMouseOver возвращает истину, если точка (x, y) в него попадает, а GetInfo - информацию об объекте. Если теперь надо найти объект и выдать о нем инфу, то пишутся шесть строчек: public void OnMouseMove(MouseEventsArg e, object sender) // ~обработчк вроде этого { foreach (GraphicalObject currentObject in objects) if (currentObject.IsMouseOver(e.x, e.y)) { tooltip.Show(currentObject.GetInfo()); // Что-то вроде этого return; } } Причем совсем не важно какого именно типа этот currentObject - все будет работать!
Почему бы не реализовать это на Visio? Создать собственную библиотеку объектов и привязать их атрибуты к БД. Далее строишь что необходимо и при наведении мыши отображается информация из БД к объекту.
Гость, графическая часть и связанная с ней бд - только часть программы есть еще другие функции, насколько я знаю визио не позволят делать запускаемые клиент-серверные приложения с обращением к бд и построением отчетов
1777, Visio позволяет. типичный пример - stencil - построитель схемы БД. как раз клиент-серверное приложение, обращающееся к БД и строящее отчет.