1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.

Программирование графического интерфейса

Тема в разделе "Программирование", создана пользователем 1777, 08.07.07.

  1. 1777

    1777 Активный участник

    6.532
    12
    задача: запрограммировать графику, например: поле, на нем распологаются графические элементы, их можно выделять, перетаскивать, и т.п., ну как например в визио. вот даже не знаю как это назвать чтобы в инете поискать, все не то выдает, в какую сторону копать? :shys:
    ps ну или может универсальные компоненты для этого есть какие готовые :)
     
  2. DirectX

    DirectX Активный участник

    1.873
    0
    Копать надо в сторону ООП. В двух словах:

    1. Cоздается абстрактный класс с виртуальной функцией рисования, например Draw. В качестве параметра в эту функцию передается, например graphics если это .NET, или canvas - если Delphi.

    2. Создаются обычные классы на основе ранее созданного абстрактного. Каждый из них хранит уже полную информацию о том что и где именно надо рисовать. Для каждого из таких классов функция Draw обретает свою окончательную функциональность.

    3. В рамках документа создается список ссылок на абстрактный класс, который заполняется ссылками на объекты того или иного обычного класса. Т.е. к примеру, в момент добавления нового объекта в зависимость от того, какая кнопка на панели инструментов нажата, в список добавляются объекты различных классов.

    4. Для PictureBox или еще какого элемента, где будет выводиться полный рисунок, добавляется обработчик OnPaint, в котором для каждого элемента списка вызывается виртуальная функция Draw, которая сама будет различным образом обрабатываться для объектов различного типа.

    Если надо, могу пример на C# какой-нибудь рабочий подыскать.
     
  3. 1777

    1777 Активный участник

    6.532
    12
    DirectX,
    пасиб, я сам кое что нарыл уже - основы GDI так сказать, но у меня появились идея другого подхода. Суть - нужны объекты на картинке, их можно выделить, и просмотреть инфу по ним (инфа берется из бд)

    1. рисовать эти объекты самому - вот про который я и спросил изначально;

    2.
    2.1. нарисовать карту с границами объектов (черным например цветом границы) - физический графический файл (bmp/jpeg/...), отметить на нем цветом области которые объектами не являются (например желтый), а сами объекты внутри их границы - белым цветом.

    2.2. потом алгоритмом как в пайнте - закрасить область - он красит все до границы начиная с указанного пиксели, если есть разрыв линии - красит соседние области;

    2.3. в бд хранить объекты (их инфу, состояние) и тот начальный пискель закраски, в соответствие с картой. и потом при отрисовке - закрашивать объекты внутри границы нужным цветом в зависимости от состояния объекта, алгоритм закраски будет всегда красить до границы (типа выделение объекта :) );

    2.4. моменты которые надо продумать - ограничения на правила рисования изначальной карты (всегда рисовать границы и выделять каким либо цветом "области-не-объекты") и при изменении масштаба карты - начальные пиксели закраски - могут сдвинуться и попасть в другие области

    вот такая идейка
    :sla:

    ps у тебя нет инфы по алгоритму закраски из пейнта :shys: ?
     
  4. DirectX

    DirectX Активный участник

    1.873
    0
    Вы конечно не обижайтесь, но способ ИМХО на редкость извращенческий :) Все же рекомендую обратить самое пристальное внимание на систему с абстрактными классами - это собственно самая общепризнанная система организации подобной функциональности. И более чем уверен, что 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 - все будет работать!
     
  5. Гость

    Гость Гость

    Почему бы не реализовать это на Visio? Создать собственную библиотеку объектов и привязать их атрибуты к БД. Далее строишь что необходимо и при наведении мыши отображается информация из БД к объекту.
     
  6. 1777

    1777 Активный участник

    6.532
    12
    Гость,
    графическая часть и связанная с ней бд - только часть программы :)
    есть еще другие функции, насколько я знаю визио не позволят делать запускаемые клиент-серверные приложения с обращением к бд и построением отчетов
     
  7. AlTk

    AlTk Читатель

    10.699
    0
    1777,
    Visio позволяет.
    типичный пример - stencil - построитель схемы БД. как раз клиент-серверное приложение, обращающееся к БД и строящее отчет. ;)