![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как извлечь многоугольник из структуры 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