Here my IsIntersectRect (=RectInRect) and GetIntersectRect procedures:

[pascal]
FUNCTION IsIntersectRect(CONST R1,R2:TRect):BOOLEAN;
BEGIN
RESULT:=(R2.Right>=R1.Left) AND (R2.Bottom>=R1.Top) AND (R1.Right>=R2.Left) AND (R1.Bottom>=R2.Top);
END;

FUNCTION Min(A,B:INTEGER):INTEGER;
BEGIN
IF A<B THEN BEGIN
RESULT:=A;
END ELSE BEGIN
RESULT:=B;
END;
END;

FUNCTION Max(A,B:INTEGER):INTEGER;
BEGIN
IF A>B THEN BEGIN
RESULT:=A;
END ELSE BEGIN
RESULT:=B;
END;
END;

FUNCTION GetIntersectRect(OUT DestRect:TRect;CONST R1,R2:TRect):BOOLEAN;
BEGIN
RESULT:=(R2.Right>=R1.Left) AND (R2.Bottom>=R1.Top) AND (R1.Right>=R2.Left) AND (R1.Bottom>=R2.Top);
IF RESULT THEN BEGIN
DestRect.Left:=Max(R1.Left,R2.Left);
DestRect.Right:=Min(R1.Right,R2.Right);
DestRect.Top:=Max(R1.Top,R2.Top);
DestRect.Bottom:=Min(R1.Bottom,R2.Bottom);
END ELSE BEGIN
FILLCHAR(DestRect,SIZEOF(TRect),#0);
END;
END;
[/pascal]