type Orientation = |Up |Down |Left |Right type Button() = let mutable (rect:Rectangle) = new Rectangle() let mutable orientation:Orientation = Up let getAngle () = match orientation with |Up -> -90.f |Down -> 90.f |Right -> 0.f |Left -> 180.f let clickEvent = new Event() member x.Click = clickEvent.Publish member x.ClientRectangle with get() = rect and set(r : Rectangle) = rect <- rect member x.Position with set(v:Point) = rect <- new Rectangle(v.X, v.Y, 20, 20) member x.Resize (v:Size) = match orientation with |Up -> base.Position <- new Point(v.Width/2,0) |Down -> base.Position <- new Point(v.Width/2,v.Height-20) |Right -> base.Position <- new Point(v.Width-20,v.Height/2) |Left -> base.Position <- new Point(0,v.Height/2) member x.Direction with get() = orientation and set(v) = orientation <- v member x.Contains (p:Point) = let ret = rect.Contains(p) if ret then clickEvent.Trigger(new System.EventArgs()) ret member x.Paint (g:Graphics, pen:Pen) = let mutable l, t, w, h = ClientRectangle.Left, ClientRectangle.Top, ClientRectangle.Width, ClientRectangle.Height let back = g.Save() g.ResetTransform() g.DrawRectangle(Pens.Black, l, t, w, h) g.TranslateTransform(single (l+w/2),single (t+h/2)) g.RotateTransform(getAngle()) g.FillPolygon(Brushes.Red, [| Point(-w/2, -h/2); Point(w/2, 0); Point(-w/2, h/2); |]) g.Restore(back)