Function TFormMain.getClipSpaceToWCSMatrix(bx,by,dx,dy:integer;rtExtended,m_FrameStyledbl:boolean;ShapeType: integer): HRGN;
Const
Delta = 10;
var
xp : Integer;
Pts : Array[0..6] of TPoint;
min, bx1, by1, w1, w2, fw: Integer;
begin
w1 := Round(Width shr 1);
w2 := Round((Width - 1) shr 1);
fw := Round(Width);
bx1:=bx+dx+1;
by1:=by+dy+1;
case ShapeType of
// frstRoundRect:
00:
begin
Inc(bx1, w2);
Inc(by1, w2);
Dec(bx, w1);
Dec(by, w1);
if m_FrameStyledbl then
begin
Dec(bx, fw);
Dec(by, fw);
Inc(bx1, fw);
Inc(by1, fw);
end;
min := dx;
if dy < dx then
min := dy;
if rtExtended then begin
min := min + 2 * delta;
result := CreateRoundRectRgn(bx-delta, by-delta, bx1+delta, by1+delta, min div 4, min div 4)
end
else
result := CreateRoundRectRgn(bx, by, bx1, by1, min div 4, min div 4);
end;
1,2:
// frstEllipse, frstRectangle:
begin
Inc(bx1, w2);
Inc(by1, w2);
Dec(bx, w1);
Dec(by, w1);
if m_FrameStyleDbl then
begin
Dec(bx, fw);
Dec(by, fw);
Inc(bx1, fw);
Inc(by1, fw);
end;
if rtExtended then begin
if odd(ShapeType) then
result := CreateRectRgn(bx-Delta, by-Delta, bx1 + Delta, by1 + Delta)
else
result := CreateEllipticRgn(bx-Delta, by-Delta, bx1 + Delta, by1 + Delta)
end else begin
if odd(ShapeType) then
result := CreateRectRgn(bx, by, bx1, by1)
else
result := CreateEllipticRgn(bx, by, bx1, by1);
end;
end;
3:
begin
Inc(bx1, w2);
Inc(by1, w2);
Dec(bx, w1);
Dec(by, w1);
if m_FrameStyleDbl then
begin
Dec(bx, fw * 2);
Dec(by, fw * 2);
Inc(bx1, fw * 2);
Inc(by1, fw * 2);
end;
xp := bx + (bx1 - bx) div 2;
if rtExtended then
begin
Pts[0]:=Point(bx1+Delta, by1+Delta);
Pts[1]:=Point(bx-Delta, by1+Delta);
Pts[2]:=Point(xp, by-Delta);
Pts[3]:=Point(bx1+Delta, by1+Delta);
end else begin
Pts[0]:=Point(bx1, by1);
Pts[1]:=Point(bx, by1);
Pts[2]:=Point(xp, by);
Pts[3]:=Point(bx1, by1);
end;
result := CreatePolygonRgn(Pts, 4, 1);
end;
// frstDiagonal1: //Line(x,y,x1,y1);
4:
begin
if m_FrameStyleDbl then
begin
Dec(by, fw);
Inc(by1, fw);
end;
if w1=0 then
w1 := 1; // avoid disappearing line
if rtExtended then
begin
Pts[0]:=Point(bx-w1-Delta, by);
Pts[1]:=Point(bx+w2+Delta, by);
Pts[2]:=Point(bx1+w2+Delta, by1);
Pts[3]:=Point(bx1-w1-Delta, by1);
Pts[4]:=Point(bx-w1-Delta, by);
end else begin
Pts[0]:=Point(bx-w1, by);
Pts[1]:=Point(bx+w2, by);
Pts[2]:=Point(bx1+w2, by1);
Pts[3]:=Point(bx1-w1, by1);
Pts[4]:=Point(bx-w1, by);
end;
result := CreatePolygonRgn(Pts, 5, 1);
end;
5:
// frstDiagonal2: //Line(x,y1,x1,y);
begin
if m_FrameStyleDbl then
begin
Dec(by, fw);
Inc(by1, fw);
end;
if w1=0 then
w1 := 1; // avoid disappearing line
if rtExtended then begin
Pts[0]:=Point(bx-w1-Delta, by1);
Pts[1]:=Point(bx+w2+Delta, by1);
Pts[2]:=Point(bx1+w2+Delta, by);
Pts[3]:=Point(bx1-w1-Delta, by);
Pts[4]:=Point(bx-w1-Delta,by);
end else begin
Pts[0]:=Point(bx-w1, by1);
Pts[1]:=Point(bx+w2, by1);
Pts[2]:=Point(bx1+w2, by);
Pts[3]:=Point(bx1-w1, by);
Pts[4]:=Point(bx-w1,by1);
end;
result := CreatePolygonRgn(Pts, 5, 1);
end
end;
end;