library poligon32;
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, stdctrls, extctrls;
// Основное тело функции, идет на экспорт, вызывается из кликера
function execute( _mas: pInteger; _size: Integer): Integer; export; stdcall;
type
pIntArr = array[0..0] of Integer;
var
bp:Tcanvas;
pol: array of TPoint; //x,y - это массив указателей на координаты вершин (количество не известно). //Однако при большом количестве координат может быть затык, потому что при выделения памяти для //новой точки переписываются в новую область памяти все предыдущие
btm: TBitMap;
mc: integer; //цвет точки
i: integer; //счетчик в массиве указателей переданных в DLL (0-первый эл.)
n: integer; //счетчик вершин многоугольника в динамическом массиве(0-первая, 1-вторая и тд)
begin
// _mas - указатель на начало массива параметров integer
// _size - размер массива (число параметров)
btm := TBitMap.create;
btm.Width:=pIntArr(_mas^)[_size-2]; //x
btm.Height:=pIntArr(_mas^)[_size-1]; //y
i:=2; //с него начинаются координаты вершин многоугольников
n:=-1;
with btm.Canvas do
begin
while pIntArr(_mas^)[i]<>-3 do
begin
if ((pIntArr(_mas^)[i]<>-2) and (pIntArr(_mas^)[i]<>-1))
then
begin
n:=n+1;
SetLength(pol, n+1);
pol[n].X := pIntArr(_mas^)[i];
pol[n].Y := pIntArr(_mas^)[i+1];
//ShowMessage('i='+IntToStr(i+1)+' n='+IntToStr(n+1)+' x='+IntToStr(pol[n].X)+' y=' + IntToStr(pol[n].Y));
end
else
begin
//ShowMessage('i=' + IntToStr(i+1)); //i счет от 1
if pIntArr(_mas^)[i]=-1 then
begin
Brush.Color:= clYellow;
pen.Color := clYellow;
end;
if pIntArr(_mas^)[i]=-2 then
begin
Brush.Color:= clWhite;
pen.Color := clWhite;
end;
Polygon(pol);
n:=-1;
pol:=nil;
end;
i:=i+2;
end;
mc:= Pixels[pIntArr(_mas^)[0], pIntArr(_mas^)[_size-_size+1]];//:=clRed;
end;
if pIntArr(_mas^)[i+1]=-4 then
begin
//просто красная точка малозаметна, рисуем красный крест
btm.Canvas.Pixels[pIntArr(_mas^)[0], pIntArr(_mas^)[_size-_size+1]]:=clRed;
btm.Canvas.Pixels[pIntArr(_mas^)[0]+1, pIntArr(_mas^)[_size-_size+1]]:=clRed;
btm.Canvas.Pixels[pIntArr(_mas^)[0], pIntArr(_mas^)[_size-_size+1]+1]:=clRed;
btm.Canvas.Pixels[pIntArr(_mas^)[0]-1, pIntArr(_mas^)[_size-_size+1]]:=clRed;
btm.Canvas.Pixels[pIntArr(_mas^)[0], pIntArr(_mas^)[_size-_size+1]-1]:=clRed;
bp:=Tcanvas.create();
bp.Handle:=getDC(0);// присваиваем идентификатор контекста устройства вывода
bp.Draw(1024,0,btm);
bp.Free;
end;
btm.Free;
if mc = 65535 //желтый
then result:= 1 //1-разрешенная область
else result:= 0; //0-запрещенная область
end;
//------------------------------------------------------------------------------
// список экспорта
exports execute;
begin
// тело пусто
end.
// в 0,1 элементе x,y-координаты точки (красный)
// предпоследний, последний элемент массива (Width,Height TBitMap) X,Y размеры полигона для рисования
//-1,-1 конец координат разрешенной области (желтый)
//-2,-2 конец координат запрещенной области (белый)
//-3 конец всех координат, если после него идет -4 будет вывод тестовой картинки на рабочий стол
//------------------------------------------------------------------------------
CALL("poligon32.dll",150,150,310,0,184,495,0,500,48,26,-1,-1,150,100,200,100,200,200,100,200,-2,-2,70,450,100,450,100,500,50,500,-2,-2,-3,-4,0,0,0,0,310,500)
print($_return1)
halt
Возвращает 1 если точка принадлежит разрешенной области и 0 - запрещенной.
ps Координаты должны лежать в положительной области. Точка 0,0 - верхний левый угол.