OK, a couple of things that may make life easier. First, I misunderstood what you were trying to do (I think). Learning to program mouse logic is one of the more frustrating things that one has to do when creating a complex control. Now if there is just one action, then it isn't that big of a deal, but the more complex and more elements that you get, then the more structured it needs to be otherwise you will NEVER be able to debug a faulty mouse click.
In this example, the mouse should no longer be handled it not within a valid region:
if(this.ClientRectangle.Contains(e.Location))
{
this.WriteLog(string.Format("MouseMove ({0}) [{1},{2}]", e.Button, e.X, e.Y));
base.OnMouseMove(e);
}
By making sure that the mouse is within a valid region (in this case I just used the bounds of the control) then it should not do anything. Also, within a move, you might need to know if a mouse was down on a object previously. When you create a control like this that will have internal contents (i.e. a block in this case) you are going down the right path in that you do not want to use another object, but you DO want to create a collection that manages itself with the items. This way each item is responsible for "knowing" where it is making mouse logic easy when clicking.
I added a new control called TrentMouseControl (or something like that) that creates an internal collection to keep up with the items as discrete blocks that know their location. I just handled the OnMouseUp event to show a click event, but the same logic would be used for a MouseMove.