Solved

Creating a Drawing Panel in VB.NET

Posted on 2006-07-18
7
3,851 Views
Last Modified: 2008-01-09
Hello All,

I am working on creating a mini-paint program written in VB.NET.  The program is relatively simple in nature, my issue is this...

While I can get the program to paint fine, I now want to add functionality to select one of four different paint colors (Red, Blue, Green, or Black) and one of three bursh sizes (Small, Medium, or Large).

I am completely versed in the stance of homework in Experts-Exchange and am not seeking someone to give me the correct code, instead some clear explanations and guidance would be most appreciated.  My code will be posted next...

==================================================================================================

Public Class FrmPainter
    Inherits System.Windows.Forms.Form

    Dim shouldPaint As Boolean = False

#Region " Windows Form Designer generated code "

    Public Sub New()
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call

    End Sub

    'Form overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.  
    'Do not modify it using the code editor.
    Friend WithEvents GroupBox1 As System.Windows.Forms.GroupBox
    Friend WithEvents GroupBox2 As System.Windows.Forms.GroupBox
    Friend WithEvents btnBlack As System.Windows.Forms.RadioButton
    Friend WithEvents btnGreen As System.Windows.Forms.RadioButton
    Friend WithEvents btnBlue As System.Windows.Forms.RadioButton
    Friend WithEvents btnRed As System.Windows.Forms.RadioButton
    Friend WithEvents btnLarge As System.Windows.Forms.RadioButton
    Friend WithEvents btnMedium As System.Windows.Forms.RadioButton
    Friend WithEvents btnSmall As System.Windows.Forms.RadioButton
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.GroupBox1 = New System.Windows.Forms.GroupBox
        Me.btnBlack = New System.Windows.Forms.RadioButton
        Me.btnGreen = New System.Windows.Forms.RadioButton
        Me.btnBlue = New System.Windows.Forms.RadioButton
        Me.btnRed = New System.Windows.Forms.RadioButton
        Me.GroupBox2 = New System.Windows.Forms.GroupBox
        Me.btnLarge = New System.Windows.Forms.RadioButton
        Me.btnMedium = New System.Windows.Forms.RadioButton
        Me.btnSmall = New System.Windows.Forms.RadioButton
        Me.GroupBox1.SuspendLayout()
        Me.GroupBox2.SuspendLayout()
        Me.SuspendLayout()
        '
        'GroupBox1
        '
        Me.GroupBox1.BackColor = System.Drawing.SystemColors.ScrollBar
        Me.GroupBox1.Controls.Add(Me.btnBlack)
        Me.GroupBox1.Controls.Add(Me.btnGreen)
        Me.GroupBox1.Controls.Add(Me.btnBlue)
        Me.GroupBox1.Controls.Add(Me.btnRed)
        Me.GroupBox1.Location = New System.Drawing.Point(0, 0)
        Me.GroupBox1.Name = "GroupBox1"
        Me.GroupBox1.Size = New System.Drawing.Size(112, 168)
        Me.GroupBox1.TabIndex = 1
        Me.GroupBox1.TabStop = False
        Me.GroupBox1.Text = "Color"
        '
        'btnBlack
        '
        Me.btnBlack.Location = New System.Drawing.Point(24, 120)
        Me.btnBlack.Name = "btnBlack"
        Me.btnBlack.Size = New System.Drawing.Size(64, 24)
        Me.btnBlack.TabIndex = 3
        Me.btnBlack.Text = "Black"
        '
        'btnGreen
        '
        Me.btnGreen.Location = New System.Drawing.Point(24, 88)
        Me.btnGreen.Name = "btnGreen"
        Me.btnGreen.Size = New System.Drawing.Size(64, 24)
        Me.btnGreen.TabIndex = 2
        Me.btnGreen.Text = "Green"
        '
        'btnBlue
        '
        Me.btnBlue.Location = New System.Drawing.Point(24, 56)
        Me.btnBlue.Name = "btnBlue"
        Me.btnBlue.Size = New System.Drawing.Size(64, 24)
        Me.btnBlue.TabIndex = 1
        Me.btnBlue.Text = "Blue"
        '
        'btnRed
        '
        Me.btnRed.Location = New System.Drawing.Point(24, 24)
        Me.btnRed.Name = "btnRed"
        Me.btnRed.Size = New System.Drawing.Size(64, 24)
        Me.btnRed.TabIndex = 0
        Me.btnRed.Text = "Red"
        '
        'GroupBox2
        '
        Me.GroupBox2.BackColor = System.Drawing.SystemColors.ScrollBar
        Me.GroupBox2.Controls.Add(Me.btnLarge)
        Me.GroupBox2.Controls.Add(Me.btnMedium)
        Me.GroupBox2.Controls.Add(Me.btnSmall)
        Me.GroupBox2.Location = New System.Drawing.Point(0, 168)
        Me.GroupBox2.Name = "GroupBox2"
        Me.GroupBox2.Size = New System.Drawing.Size(112, 144)
        Me.GroupBox2.TabIndex = 2
        Me.GroupBox2.TabStop = False
        Me.GroupBox2.Text = "Size"
        '
        'btnLarge
        '
        Me.btnLarge.Location = New System.Drawing.Point(24, 88)
        Me.btnLarge.Name = "btnLarge"
        Me.btnLarge.Size = New System.Drawing.Size(64, 24)
        Me.btnLarge.TabIndex = 6
        Me.btnLarge.Text = "Large"
        '
        'btnMedium
        '
        Me.btnMedium.Location = New System.Drawing.Point(24, 56)
        Me.btnMedium.Name = "btnMedium"
        Me.btnMedium.Size = New System.Drawing.Size(64, 24)
        Me.btnMedium.TabIndex = 5
        Me.btnMedium.Text = "Medium"
        '
        'btnSmall
        '
        Me.btnSmall.Location = New System.Drawing.Point(24, 24)
        Me.btnSmall.Name = "btnSmall"
        Me.btnSmall.Size = New System.Drawing.Size(64, 24)
        Me.btnSmall.TabIndex = 4
        Me.btnSmall.Text = "Small"
        '
        'FrmPainter
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.BackColor = System.Drawing.SystemColors.Window
        Me.ClientSize = New System.Drawing.Size(536, 310)
        Me.Controls.Add(Me.GroupBox2)
        Me.Controls.Add(Me.GroupBox1)
        Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D
        Me.MaximizeBox = False
        Me.Name = "FrmPainter"
        Me.Text = "Drawing Panel"
        Me.GroupBox1.ResumeLayout(False)
        Me.GroupBox2.ResumeLayout(False)
        Me.ResumeLayout(False)

    End Sub

#End Region

    ' draw circle if shouldPaint is True
    Private Sub FrmPainter_MouseMove( _
                ByVal sender As System.Object, _
                ByVal e As System.Windows.Forms.MouseEventArgs) _
                Handles MyBase.MouseMove

        ' paint circle if mouse pressed
        If shouldPaint Then
            Dim graphic As Graphics = CreateGraphics()

            graphic.FillEllipse _
                (New SolidBrush(Color.Red), e.X, e.Y, 4, 4)
        End If

    End Sub 'FrmPainter_MouseMove

    ' set shouldPaint to True
    Private Sub FrmPainter_MouseDown(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.MouseEventArgs) _
        Handles MyBase.MouseDown

        shouldPaint = True
    End Sub ' FrmPainter_MouseDown

    ' set shouldPaint to False
    Private Sub FrmPainter_MouseUp(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.MouseEventArgs) _
        Handles MyBase.MouseUp

        shouldPaint = False
    End Sub ' FrmPainter_MouseUp
End Class

==================================================================================================

Any guidance is most appreciated.  What I think the next step would be is to create some type of case control repitition, but I am having difficulty determining how this would operate.

Kind Regards,

Dan Malek
danielmalek@hotmail.com
0
Comment
Question by:danielmalek
  • 2
7 Comments
 
LVL 14

Expert Comment

by:jjardine
Comment Utility
I think you would start by adding in either a listbox, dropdownlist, or radio buttons that would allow the user to select which color and brush size they want to use.   Then Once they select that value, store that value in some variables (ie.   _selectedColor as Color and _selectedBrush as Brush)   So when they set their change their settings, do a case statement to map your strings in the list to the actual color to store it.  Then in your code change where you hard code the Color.red or any other reference to color to the new _selectedColor and the same with the Brush.
0
 

Author Comment

by:danielmalek
Comment Utility
If you look at the above code, I have used radio buttons but am having difficulties creating the logic...
0
 
LVL 14

Accepted Solution

by:
jjardine earned 250 total points
Comment Utility
How about if you added a Click event for the radio buttons.  Then when that event fires you can update your local variables.  For Example

Public Sub rdoRed_Click(sender as Object, e as eventargs) handles rdoRed.Click
  If rdoRed.checked Then
    _selectedColor = Color.Red
  End If
End Sub
0
 
LVL 21

Assisted Solution

by:oleggold
oleggold earned 250 total points
Comment Utility
Here's the wonderfull step by step example by SAMS:
http://www.samspublishing.com/articles/article.asp?p=29477&seqNum=10&rl=1
I'm sure You'll find all Your answers down there,e,g:
Draw module:
 Public Sub draw( _
    ByVal shape As String, _
    ByVal width As Integer, _
    ByVal height As Integer, _
    ByVal x As Integer, _
    ByVal y As Integer, _
    ByVal fillType As String, _
    ByVal outlineWeight As Single, _
    ByVal outlineColor As String, _
    ByVal solidColor As String, _
    ByVal blendFrom As String, _
    ByVal blendTo As String, _
    ByVal pattern As String, _
    ByVal patternForeColor As String, _
    ByVal patternBackColor As String, _
    ByVal blendStyle As String, _
    ByVal rotateAngle As Single)

    'purpose: draw a shape to the drawing surface (frmChild)

    'local scope
    Dim myPen As Pen
    Dim myRectangle As Rectangle
    Dim myBrush As Brush
    Dim myHatchStyle As Drawing2D.HatchStyle
    Dim myType As System.Type
    Dim myBlendStyle As Drawing2D.LinearGradientMode
    Dim myState As Drawing2D.GraphicsState

    'get the current state of the graphics object (pre-tranform)
    myState = m_myGraphics.Save()

    'set the rotation transformation value
    m_myGraphics.RotateTransform(angle:=rotateAngle)

    'check what shape to draw
    Select Case shape
      Case "Line"

        'create a new pen instance
        myPen = New Pen(color.FromName(name:=outlineColor), _
          width:=outlineWeight)

        'draw the line to the surface
        m_myGraphics.DrawLine(pen:=myPen, x1:=x, y1:=y, _
          x2:=x + width, y2:=y + height)

      Case "Rectangle", "Ellipse"

        'note: the rectangle and ellipse are very similar
        '   they can use the same code

        'create a new pen myect for the outline of the shape
        myPen = New Pen(color.FromName(name:=outlineColor), _
          width:=outlineWeight)

        'create the rectangle object
        myRectangle = New Rectangle(x:=x, y:=y, width:=width, _
          height:=height)

        'draw the rectangle to the surface
        If shape = "Ellipse" Then

          'draw the ellipse
          m_myGraphics.DrawEllipse(pen:=myPen, _
            rect:=myRectangle)

        Else

          'draw a rectangle
          m_myGraphics.DrawRectangle(pen:=myPen, _
            rect:=myRectangle)

        End If

        'fill the rectangle/ellipse
        If fillType <> "NONE" Then

          'determine brush type to create
          Select Case fillType
            Case "SOLID"

              'create a new solid brush
              myBrush = New SolidBrush( _
                color:=color.FromName(name:=solidColor))

            Case "PATTERN"

              'create the hatch brush
              'note: we use the type object and the parse
              '    method of the enum to return the
              '    value of the enum's member from its
              '    name (string)
              myType = myHatchStyle.GetType()
              myBrush = New System.Drawing.Drawing2D.HatchBrush _
              (myHatchStyle.Parse(enumType:=myType, _
                value:=pattern),
_foreColor:=Color.FromName(name:=patternForeColor),
_backColor:=color.FromName(name:=patternBackColor))

            Case "BLEND"

              'create a blend brush
              'note: we use the type object and the parse
              '    method of the enum to return the
              '    value of the enum's member from its
              '    name (string)
              myType = myBlendStyle.GetType
              myBrush = New _
                System.Drawing.Drawing2D.LinearGradientBrush( _
                rect:=myRectangle, _
                color1:=color.FromName(name:=blendFrom), _
                color2:=color.FromName(name:=blendTo), _
                LinearGradientMode:=myBlendStyle.Parse( _
                enumType:=myType, value:=blendStyle))

          End Select

          'fill the shape
          If shape = "Ellipse" Then

            'draw the ellipse with the correct brush
            m_myGraphics.FillEllipse(brush:=myBrush, _
              rect:=myRectangle)

          Else

            'fill the rectangle with the correct brush
            m_myGraphics.FillRectangle(brush:=myBrush, _
              rect:=myRectangle)

          End If

        End If

    End Select

    'reset the state of the graphics object
    m_myGraphics.Restore(myState)

  End Sub

End Module
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

Introduction As chip makers focus on adding processor cores over increasing clock speed, developers need to utilize the features of modern CPUs.  One of the ways we can do this is by implementing parallel algorithms in our software.   One recent…
Microsoft Reports are based on a report definition, which is an XML file that describes data and layout for the report, with a different extension. You can create a client-side report definition language (*.rdlc) file with Visual Studio, and build g…
Get a first impression of how PRTG looks and learn how it works.   This video is a short introduction to PRTG, as an initial overview or as a quick start for new PRTG users.
This video demonstrates how to create an example email signature rule for a department in a company using CodeTwo Exchange Rules. The signature will be inserted beneath users' latest emails in conversations and will be displayed in users' Sent Items…

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now