Floodlight
Floodlight

Reputation: 65

Draw rectangle with mouse while maintaining a given ratio

I have what I think is a basic problem that has me scratching my head.

I want to be able to draw a rectangle on my form while constraining it to a given ratio. Similar to how Photoshop's crop tool works.

I can scale images correctly using a ratio, but I am having trouble applying the formula to a 'live' drawn rectangle.

Here is the basic working code to draw said rectangle.

Public Class Form2

Dim mRect As Rectangle

Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
mRect = New Rectangle(e.X, e.Y, 0, 0)
Me.Invalidate()
End Sub

Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left Then
mRect = New Rectangle(mRect.Left, mRect.Top, e.X - mRect.Left, e.Y - mRect.Top)
Me.Invalidate()
End If
End sub

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
Using pen As New Pen(Color.Red, 3)
e.Graphics.DrawRectangle(pen, mRect)
End Using

End class

The above code works fine to draw a freeform rectangle. I'm just not sure where or how to apply the formula to ensure the drawn rectangle always adheres to a given ratio such as 1.5

Any help would be hugely appreciated. Thanks

Upvotes: 1

Views: 124

Answers (1)

Precious Uwhubetine
Precious Uwhubetine

Reputation: 3007

Try this ;

 Dim mRect As Rectangle

 Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
     mRect = New Rectangle(e.X, e.Y, 0, 0)
     Me.Invalidate()
 End Sub

 Protected Overrides Sub OnMouseMove(ByVal e As MouseEventArgs)
     If e.Button = Windows.Forms.MouseButtons.Left Then
         mRect = New Rectangle(mRect.Left, mRect.Top, e.X - mRect.Left, e.Y - mRect.Top)
         'Replace 1.5 with the scale you want to use
         Dim hgt As Integer = Convert.ToInt32(mRect.Height/1.5)
         Dim wdth As Integer = Convert.ToInt32(mRect.Width/1.5)
         mRect.Size = New Size(wdth*1.5, hgt*1.5)
         Me.Invalidate()
     End If
 End sub

 Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
     Using pen As New Pen(Color.Red, 3)
         e.Graphics.DrawRectangle(pen, mRect)
     End Using
 End class

Upvotes: 1

Related Questions