Контроль графических объектов в приложении

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем -, 19 апр 2007.

Статус темы:
Закрыта.
  1. Гость

    Всем привет!

    Я новичёк в С++.
    Есть кто с опытом работы с графикой в Boland C++ Builder 6?
    Хотел создать полигоны допустим на Image компоненте, и при
    наступлении события OnDblClick, если это произошло над
    одним из объектов, что бы программа выводила данные из
    массивов данных связанных с этим объектом, ну и ещё, что бы
    полигон при этом менял цвет.

    Хотя бы ссылку какую-нибудь на эту тему, хоть что-то,
    зацепиться.
     
  2. MechWarrior

    MechWarrior Гость

    Хм, с BCB не работал (для CPP пользую VC), но по идее там должен быть компонент PaintBox. Для интерактивной работы лучше использовать его (положив поверх нужного Control-а - той же картинки, если она нужна как фон, например). В его обработчике OnPaint прописать отрисовку полигонов на его Canvas (лучше с двойном буферизацией, чтобы не мерцало - т.е. рисовать на битмапе и его выводить на Canvas). Полигоны держать в каком-нибудь массиве/списке и т.п. К каждому из них поставить в соответствие цвет (которым он отрисовывается) и ссылку на данные (или индекс, или еще что). При двойном клике на PaintBox определять точку, куда кликнули (запомнив например данные последнего MouseDown) и искать по ней полигон, в котором она находится - проходя по полигонам в списке от последнего к первому (поскольку если они отрисовываются по порядку - то последние будут поверх первых при взаимном перекрытии). Найдя нужный полигон, изменять его цвет, перерисовывать PaintBox для обновления картинки - и выдавать данные, связанные с полигоном....
     
  3. Гость

    Большое спасибо за отклик, MechWarrior.

    Меня вводит в сомнение Ваше выражение:
    "При двойном клике на PaintBox определять точку, куда кликнули (запомнив например данные последнего MouseDown) и искать по ней полигон, в котором она находится", - в Матлабе я бы сделал это легко; там есть функция inpolygon, а как это сделать в С++? Мне тут ещё говорили про какой то handle, мол таковой генерится в процессе создания любого графического объекта, такой путь возможен? Если да, то как на него выйти, на handle объекта (тогда вообще было бы супер, всё как в Матлаб, ну или наоборот). B)
     
  4. Гость

    MechWarrior,

    Забыл про хэндл добавить, например в Матлаб есть функция gco - get current object, когда указатель мыши над объектом, неважно, произошёл click или double click или просто в процессе mouse move, она возвращает tag объекта и так далее. Коль уж Матлаб был написан на С, может есть аналогия и с С++?

    Я уже не знаю где мне найти хоть что-нибудь в стиле ООП по этой теме, накупил книг по С++, даже такую: "Программирование трёхмерных игр для Windows", всё переворошил, хоть бы какой-нибудь ик или пук на эту тему... B)
     
  5. MechWarrior

    MechWarrior Гость

    Чтобы по клику получить ссылку на полигон без собственного поиска - надо, чтобы он был как минимум элементом управления (control). Т.е. делать потомка control/wincontrol, переопределять его отрисовку и т.п. При этом поиск просто будет переложен на библиотеку/систему. Но этот способ неэффективен, малоуниверсален и для подобных задач не используется (хотя работать будет). В Матлабе тоже он очень сомнительно что используется, ибо собственная работа с векторными объектами намного удобнее, мощнее и переносимее - просто от пользователя это скрыто.

    Лучше пользоватся описанным мною алгоритмом (стандартным базовым) - тут ничего сложного нет. Если проблема в том, как определить, находится ли точка в полигоне, то могу запостить небольшую функцию, которая это делает для полигона, у которого границы не самопересекаются (такие обычно и используются).

    Или можно воспользоватся стандартными регионами WinGDI - если надо работать только с экранными полигонами, т.е. в целочисленных координатах - но зато там есть и определение попадания точки в полигон, и реализована булева арифметика (пересечения, объединения, вычитания и т.п). Там много всяких функций, но для этой задачи достаточно CreatePolygonRgn (создает полигональный регион, возвращая handle), PaintRgn (отрисовка заданного региона), PtInRegion (находится ли точка в регионе). Всё подробно описано в MSDN (на аглицком), или в инете поищите по названиям данных функций что русское.

    Но это касается работы с каждым отдельным полигоном. Общую же организацию работы со всеми ними я изложил выше. В принципе могу написать несложный пример по одному из способов (если будут затруднения или в инете не найдется чего) - там не более 100 строк кода (скорее менее).

    P.S. Или можете поискать какой компонент для работы векторной графикой, но это для такой задачи перебор, имхо :) По поводу книг - C++ тут не причем, работа с графикой Windows от языка не зависит. А по ней самая лучшая книга - это "Программирование графики для Windows" (автор Фень Юань) - кстати говоря, примеры там как раз на C++.
     
  6. Гость

    MechWarrior,

    Спасибо за помощь! Начну поиски по ключевым словам...

    Блин, тяжко вот так с одного на другое переключаться;
    я уже почти 7 лет в Матлабе пишу, был счастлив с ним
    пока не наступило время работать с огромным количеством
    данных, и всё это ещё надо отображать, в общем то что
    есть у Матлаба уже стало не хватать, проги стали тормозить
    не по детски, вот и решил всё-таки переключиться на С++.

    Ещё раз спасибо добрый человек! Удачи тебе во всём!

    С уважением,
     
  7. Гость

    Добрый день MechWarrior,

    Если Вас не затруднит, не могли бы Вы мне ещё раз помочь с графикой, точнее
    с кодом для этой графики?

    Я хотел бы использовать WinGDI, если он конечно же подходит для моей задачи.
    Вкратце смысл таков: мне нужно создать полигоны связанные с таблицами данных,
    у данных есть уникальные идентификаторы. При изменении, допустим, масштаба
    географической карты на которую будут проецироваться эти полигоны,
    мне необходимо сохранять размеры нарисованных полигонов. Я интересовался у
    разработчиков подобной программы по поводу того, как это можно сделать, они
    сказали, что сделали это через создание классов. Помимо этого, есть ли возможность
    использования CreatePolygonRgn в форме с Image, с кнопками и всякими
    причиндалами?

    Зараннее благодарен.

    С уважением,
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей