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

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

#1
Всем привет!

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

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

MechWarrior

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

Guest

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

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

Guest

#4
MechWarrior,

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

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

MechWarrior

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

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

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

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

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

Guest

#6
MechWarrior,

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

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

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

С уважением,
 
G

Guest

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

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

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

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

С уважением,
 
Статус
Закрыто для дальнейших ответов.