Code:
'==============================================================================
' uses an algo found in VB Helper to determine whether two line segments intersect
' Chris Holbrook Sep 2009
'==============================================================================
#compile exe
#include "win32api.inc"
'-------------------------------------------------------------------------------
' THIS FUNCTION DOES IT ALL - the rest is just to show working!
' Return True if the segments intersect.
' parameters are x, y of one end of first line, x, y of other end of first line
'                x, y of one end of second line, x, y of other end of second line
function SegmentsIntersect( X1 as long,  Y1 as long, _
                            X2 as long,  Y2 as long, _
                            A1 as long,  B1 as long, _
                            A2 as long,  B2 as long) as long
    local dx, dy, da, db as single ', t, s As Single
    local s, t as single

    dx = X2 - X1
    dy = Y2 - Y1
    da = A2 - A1
    db = B2 - B1
    if (da * dy - db * dx) = 0 then
        ' The segments are parallel.
        SegmentsIntersect = %False
        exit function
    end if

    s = (dx * (B1 - Y1) + dy * (X1 - A1)) / (da * dy - db * dx)
    t = (da * (Y1 - B1) + db * (A1 - X1)) / (db * dx - da * dy)
    if (s >= 0#) and (s <= 1#) and (t >= 0#) and (t <= 1#) then
        function = %true
    else
        function = %false
    end if

    ' If it exists, the point of intersection is:
    ' (x1 + t * dx, y1 + t * dy)
end function
'------------------------------------------------------------------------------
callback function CbMain
  local     hDc                 as dword
  local     PS                  as PAINTSTRUCT
  local     lp                  as POINTAPI
  static    start1x, start1y, end1x, end1y    as long
  static    start2x, start2y, end2x, end2y    as long
'  LOCAL     ra, rb, rc, rd, rp, rq _
'                                AS SINGLE
  local     sz                  as asciz * 64
  local     rtext               as rect
  local     lresult             as long
'  LOCAL     lx, ly              AS SINGLE 'closest point coordinates

  select case cbmsg
    case %wm_initdialog

    case %wm_paint
        hDc = BeginPaint(cbhndl, PS)
        gosub paintdlg
        EndPaint cbhndl, PS

    case %WM_ERASEBKGND


    case %wm_lbuttondown
       GetCursorPos lp
       ScreenToClient cbhndl, lp
       start1x = lp.x
       start1y = lp.y

    case %wm_rbuttondown
       GetCursorPos lp
       ScreenToClient cbhndl, lp
       start2x = lp.x
       start2y = lp.y

    case %wm_mousemove
        select case cb.wparam
            '
            case %MK_LBUTTON
                GetCursorPos lp
                ScreenToClient cbhndl, lp
                end1x = lp.x
                end1y = lp.y
                InvalidateRect cbhndl, byval 0, byval %TRUE
                UpdateWindow cbhndl
            '
            case %MK_RBUTTON
                GetCursorPos lp
                ScreenToClient cbhndl, lp
                end2x = lp.x
                end2y = lp.y
                InvalidateRect cbhndl, byval 0, byval %TRUE
                UpdateWindow cbhndl
        end select
  end select
  exit function
''''''''''''''''''''
paintdlg:
    sz = "1. draw first line using mouse with L button down"
    rText.ntop = 20: rtext.nleft = 10: rtext.nright = 350: rtext.nbottom = 36
    drawtext (hdc, byval varptr(sz),len(sz), rtext, %DT_LEFT) to lresult
    sz = "2. draw second line using mouse with R button down"
    rText.ntop = 38: rtext.nleft = 10: rtext.nright = 350: rtext.nbottom = 52
    drawtext (hdc, byval varptr(sz),len(sz), rtext, %DT_LEFT) to lresult
    MoveTo hdc, start1x, start1y
    LineTo hdc, end1x, end1y
    if start2x + start2y = 0 then return
    MoveTo hdc, start2x, start2y
    LineTo hdc, end2x, end2y
    lresult = segmentsintersect(start1x, start1y, end1x, end1y, start2x,start2y,end2x,end2y)
    if lresult = %true then
        sz = "true"
    else
        sz = "false"
    end if
    rText.ntop = end2y: rtext.nleft = end2x + 12: rtext.nright = end2x + 112: rtext.nbottom = end2y + 20
    drawtext (hdc, byval varptr(sz),len(sz), rtext, %DT_LEFT) to lresult
return
end function
'===============================================================
function pbmain as long
  local hDlg as long
  dialog new 0,"Lines intersect",,,300,300,%ws_sysmenu  to hDlg
  dialog show modal hDlg call CbMain
end function