Today I am going to explain how you can draw a circle shape in WPF using F# through MouseCapture Event. You can also set font, color, position, width, height as well as thickness of the shape. The steps are given below.

Step 1: First open a new project in F# using Visual Studio 2010. Select the F# WPF Application template and name the project as in the following image.

New Project Dialog Box

Step 2: Now add the following given references to your project by right-clicking on your project in the Solution Explorer.

Step 3: Your Solution Explorer will look as in the following after you have added all references.

Solution Explorer

Step 4: Now click on the Program.fs file in the Solution Explorer and write the following given code in it. Your Window will look like the following given images.

Circleshape Example code1

CircleShape Example code2

CircleShape Example code3

CircleShape Example code 4

CircleShape Example code5

#light

open System
open System.Windows
open System.Windows.Controls
open System.Windows.Documents
open System.Windows.Input
open System.Windows.Media
open System.Windows.Shapes

let fntfam = new FontFamily("Vardana")
let defaultPoint = new Point(0.0,0.0)

type DrwCrcls = class
inherit Window

val cnvs : Canvas
val mutable isDrawing : bool
val mutable elps : Ellipse
val mutable ptCntr : Point
val mutable isDragging : bool
val mutable elDragging : FrameworkElement
val mutable ptMusStrt : Point
val mutable ptElmntStrt : Point

new () as this = {
cnvs = new Canvas()
isDrawing = false
elps = null
ptCntr = defaultPoint
isDragging = false
elDragging = null
ptMusStrt = defaultPoint
ptElmntStrt = defaultPoint } then
this.Title <- "Circle Drawing Application in WPF using F#"
this.Content <- this.cnvs

override this.OnMouseLeftButtonDown (args:MouseButtonEventArgs) =
base.OnMouseLeftButtonDown(args)

if (this.isDragging) then
()
else
this.ptCntr <- args.GetPosition(this.cnvs)
this.elps <- new Ellipse()
this.elps.Stroke <- SystemColors.WindowTextBrush
this.elps.StrokeThickness <- 1.0
this.elps.Width <- 0.0
this.elps.Height <- 0.0
this.cnvs.Children.Add(this.elps) |> ignore
Canvas.SetLeft(this.elps, this.ptCntr.X)
Canvas.SetTop(this.elps, this.ptCntr.Y)

// Capture the mouse and prepare for future events
this.CaptureMouse() |> ignore
this.isDrawing <- true

override this.OnMouseRightButtonDown (args:MouseButtonEventArgs) =
base.OnMouseRightButtonDown(args)

if this.isDrawing then
()
else
// Get the clicked element and prepare for future events
this.ptMusStrt <- args.GetPosition(this.cnvs)
this.elDragging <- (this.cnvs.InputHitTest(this.ptMusStrt) :?> FrameworkElement)

if (this.elDragging <> null) then
this.ptElmntStrt <- new Point(Canvas.GetLeft(this.elDragging),
Canvas.GetTop(this.elDragging))
this.isDragging <- true

override this.OnMouseDown (args:MouseButtonEventArgs) =
base.OnMouseDown(args)

if (args.ChangedButton = MouseButton.Middle) then
let shape = (this.cnvs.InputHitTest(args.GetPosition(this.cnvs)) :?> Shape)

if (shape <> null) then
if ((shape.Fill :?> SolidColorBrush) = Brushes.Pink) then
shape.Fill <- Brushes.Transparent
else
shape.Fill <- Brushes.SkyBlue

override this.OnMouseMove (args:MouseEventArgs) =
base.OnMouseMove(args)
let ptMouse = args.GetPosition(this.cnvs)

// Move and resize the Ellipse
if this.isDrawing then
let dRadius = sqrt (((this.ptCntr.X - ptMouse.X) ** 2.0) +
((this.ptCntr.Y - ptMouse.Y) ** 2.0))
Canvas.SetLeft(this.elps, this.ptCntr.X - dRadius)
Canvas.SetTop(this.elps, this.ptCntr.Y - dRadius)
this.elps.Width <- 2.0 * dRadius
this.elps.Height <- 2.0 * dRadius
elif this.isDragging then
Canvas.SetLeft
(this.elDragging,
this.ptElmntStrt.X +
ptMouse.X - this.ptMusStrt.X)

Canvas.SetTop
(this.elDragging,
this.ptElmntStrt.Y + ptMouse.Y - this.ptMusStrt.Y);

override this.OnMouseUp (args:MouseButtonEventArgs ) =
base.OnMouseUp(args)

if (this.isDrawing && (args.ChangedButton = MouseButton.Left)) then
this.elps.Stroke <- Brushes.Pink
this.elps.StrokeThickness <- min 24.0 (this.elps.Width / 2.0)
this.elps.Fill <- Brushes.SkyBlue
this.isDrawing <- false
this.ReleaseMouseCapture()
else
this.isDragging <- false

override this.OnTextInput (args:TextCompositionEventArgs ) =
base.OnTextInput(args)

// End drawing or dragging with press of Escape key
if (args.Text.IndexOf('\x1B') <> 1) then
if this.isDrawing then
this.ReleaseMouseCapture()
elif this.isDragging then
Canvas.SetLeft(this.elDragging,this.ptElmntStrt.X)
Canvas.SetTop(this.elDragging,this.ptElmntStrt.Y)

override this.OnLostMouseCapture (args:MouseEventArgs ) =
base.OnLostMouseCapture(args)

// Abnormal end of drawing: Remove child Ellipse
if this.isDrawing then
this.cnvs.Children.Remove(this.elps)
this.isDrawing <-
false
end

#if COMPILED
[<STAThread()>]
do
let app = Application() in
app.Run(new DrwCrcls()) |> ignore
#endif

Step 5: Now press F5 to execute the code.

Output

CircleShape output1

CircleShape Output2

CircleShape Output3

CircleShape Output4

CircleShape Output5

CircleShape Output6

Summary

In this article I have discussed how to draw a circle shape in WPF using F# through MouseCapture Event.