Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как извлечь многоугольник из структуры TEMRExtSelectClipRgn?


Pavlik_Morozov ©   (2004-12-27 15:23:00) 

Уважаемые господа!
Если кто-то сталкивался с данной проблемой и знает путь её решения, поделитесь, пожалуйста!
Суть проблемы:
1. есть EMF файл, имеющий регионы, которые создавались функцией CreatePolygonRgn и выбирались SelectClipRgn;
2. при "разбиении" EMF файла по функциям имею структуру (Windows.h):
 PEMRExtSelectClipRgn = ^TEMRExtSelectClipRgn;
 {$EXTERNALSYM tagEMREXTSELECTCLIPRGN}
 tagEMREXTSELECTCLIPRGN = record
   emr: TEMR;
   cbRgnData: DWORD; { Size of region data in bytes}
   iMode: DWORD;
   RgnData: array[0..0] of Byte;
 end;

...
не могу понять, как извлечь набор TPoint'ов!?:(


Pavlik_Morozov   (2004-12-27 18:01:00) [1]

большое спасибо за помощь...


MBo   (2004-12-27 17:48:00) [2]

нет, готового нет.
Если регион без дырок, то алгоритм достаточно прост - берем верхний прямоугольник, записываем его левые и правые точки в список. Можно вести два списка, один из них задом наперед - так будет проще потом слить. Для следующего прямоугольника смотрим координаты и если x-координата не изменилась, заменяем в списке нижнюю точку предыдущего на нижнюю точку текущего, иначе добавляем.


Pavlik_Morozov   (2004-12-27 17:27:00) [3]

ясно, thanks... а нет готовых алгоритмов "сборки" единого многоугольника из заданных прямоугольников?.. или просто грубо говоря беру все точки полученных прямоугольников (мне нужна ограничивающая область в виде массива (массивов) точек) ?


MBo   (2004-12-27 16:44:00) [4]

P.S.
учти, что если регион непрямоугольный, данные региона будут содержать много прямоугольников - т.е. это не прямо тот многоугольник, из которого был создан регион.


Pavlik_Morozov   (2004-12-27 16:39:00) [5]

ок, спасибо!:)


MBo   (2004-12-27 16:23:00) [6]

function EnumProc(DC: HDC; lpHTable: PHANDLETABLE;
 EMFR: PENHMETARECORD; nObj, lpData: Integer): Integer; stdcall;
...
var
 recClip:PEMRExtSelectClipRgn;
 PRgnD:PRgnData;
...
 recClip:=PEMRExtSelectClipRgn(EMFR);
 PRgnD:=PRgnData(@recclip.RgnData);
и дальше копаешься в RgnData


Наверх

Титульная страница Поиск, карта сайта Написать письмо