Supergeek, your non recursive function did not producte the correct result, but mine does. I believe yours does one too many additions.
private Point LocationOnClient(Control c)
{
Point retval = new Point(0, 0);
for (; c.Parent != null; c = c.Parent)
{ retval.Offset(c.Location); }
return retval;
}