VB.Net Tutorial/GUI Applications/Painter

Материал из VB Эксперт
Перейти к: навигация, поиск

Scribble 1

Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Windows.Forms
public class Scribble
   public Shared Sub Main
        Application.Run(New frmScribble)
   End Sub
End class

"Sams Teach Yourself Visual Basic .NET in 21 Days
"By Lowell Mauer
"Published 2001
"Sams Publishing
"ISBN 0672322714

Public Class frmScribble
    Inherits System.Windows.Forms.Form
#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
    Private WithEvents pnlTools As System.Windows.Forms.Panel
    Private WithEvents optPen As System.Windows.Forms.RadioButton
    Private WithEvents picDraw As System.Windows.Forms.PictureBox
    Private WithEvents optShape As System.Windows.Forms.RadioButton
    Private WithEvents optText As System.Windows.Forms.RadioButton
    Private WithEvents pnlOptions As System.Windows.Forms.Panel
    Private WithEvents mnuMain As System.Windows.Forms.MainMenu
    Private WithEvents mnuFile As System.Windows.Forms.MenuItem
    Private WithEvents mnuFileNew As System.Windows.Forms.MenuItem
    Private WithEvents mnuFileOpen As System.Windows.Forms.MenuItem
    Private WithEvents mnuFileSave As System.Windows.Forms.MenuItem
    Private WithEvents mnuFileSep As System.Windows.Forms.MenuItem
    Private WithEvents mnuFileExit As System.Windows.Forms.MenuItem
    Private WithEvents dlgOpen As System.Windows.Forms.OpenFileDialog
    Private WithEvents dlgSave As System.Windows.Forms.SaveFileDialog
    Private WithEvents pnlPenOptions As System.Windows.Forms.Panel
    Private WithEvents lblColor As System.Windows.Forms.Label
    Private WithEvents cboColors As System.Windows.Forms.ruboBox
    Private WithEvents lblPenWidth As System.Windows.Forms.Label
    Private WithEvents updPenWidth As System.Windows.Forms.NumericUpDown
    Private WithEvents pnlShapeOptions As System.Windows.Forms.Panel
    Private WithEvents pnlTextOptions As System.Windows.Forms.Panel
    Private WithEvents lblText As System.Windows.Forms.Label
    Private WithEvents txtText As System.Windows.Forms.TextBox
    Private WithEvents lblTextFont As System.Windows.Forms.Label
    Private WithEvents cboTextFont As System.Windows.Forms.ruboBox
    Private WithEvents lblFontSize As System.Windows.Forms.Label
    Private WithEvents updFontSize As System.Windows.Forms.NumericUpDown
    Private WithEvents lblShapeType As System.Windows.Forms.Label
    Private WithEvents cboShapeType As System.Windows.Forms.ruboBox
    Private WithEvents lblShapeHeight As System.Windows.Forms.Label
    Private WithEvents updShapeHeight As System.Windows.Forms.NumericUpDown
    Private WithEvents updShapeWidth As System.Windows.Forms.NumericUpDown
    Private WithEvents lblShapeWidth As System.Windows.Forms.Label
    "Required by the Windows Form Designer
    Private components As System.ruponentModel.Container
    "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.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.updShapeHeight = New System.Windows.Forms.NumericUpDown()
        Me.cboColors = New System.Windows.Forms.ruboBox()
        Me.pnlShapeOptions = New System.Windows.Forms.Panel()
        Me.lblShapeWidth = New System.Windows.Forms.Label()
        Me.updShapeWidth = New System.Windows.Forms.NumericUpDown()
        Me.lblShapeHeight = New System.Windows.Forms.Label()
        Me.cboShapeType = New System.Windows.Forms.ruboBox()
        Me.lblShapeType = New System.Windows.Forms.Label()
        Me.updPenWidth = New System.Windows.Forms.NumericUpDown()
        Me.pnlTools = New System.Windows.Forms.Panel()
        Me.optText = New System.Windows.Forms.RadioButton()
        Me.optShape = New System.Windows.Forms.RadioButton()
        Me.optPen = New System.Windows.Forms.RadioButton()
        Me.picDraw = New System.Windows.Forms.PictureBox()
        Me.pnlPenOptions = New System.Windows.Forms.Panel()
        Me.lblPenWidth = New System.Windows.Forms.Label()
        Me.mnuFileExit = New System.Windows.Forms.MenuItem()
        Me.updFontSize = New System.Windows.Forms.NumericUpDown()
        Me.mnuMain = New System.Windows.Forms.MainMenu()
        Me.mnuFile = New System.Windows.Forms.MenuItem()
        Me.mnuFileNew = New System.Windows.Forms.MenuItem()
        Me.mnuFileOpen = New System.Windows.Forms.MenuItem()
        Me.mnuFileSave = New System.Windows.Forms.MenuItem()
        Me.mnuFileSep = New System.Windows.Forms.MenuItem()
        Me.cboTextFont = New System.Windows.Forms.ruboBox()
        Me.pnlOptions = New System.Windows.Forms.Panel()
        Me.pnlTextOptions = New System.Windows.Forms.Panel()
        Me.lblFontSize = New System.Windows.Forms.Label()
        Me.lblTextFont = New System.Windows.Forms.Label()
        Me.txtText = New System.Windows.Forms.TextBox()
        Me.lblText = New System.Windows.Forms.Label()
        Me.lblColor = New System.Windows.Forms.Label()
        Me.dlgSave = New System.Windows.Forms.SaveFileDialog()
        Me.dlgOpen = New System.Windows.Forms.OpenFileDialog()
        CType(Me.updShapeHeight, System.ruponentModel.ISupportInitialize).BeginInit()
        Me.updShapeHeight.SuspendLayout()
        Me.pnlShapeOptions.SuspendLayout()
        CType(Me.updShapeWidth, System.ruponentModel.ISupportInitialize).BeginInit()
        Me.updShapeWidth.SuspendLayout()
        CType(Me.updPenWidth, System.ruponentModel.ISupportInitialize).BeginInit()
        Me.updPenWidth.SuspendLayout()
        Me.pnlTools.SuspendLayout()
        Me.pnlPenOptions.SuspendLayout()
        CType(Me.updFontSize, System.ruponentModel.ISupportInitialize).BeginInit()
        Me.updFontSize.SuspendLayout()
        Me.pnlOptions.SuspendLayout()
        Me.pnlTextOptions.SuspendLayout()
        Me.SuspendLayout()
        "
        "updShapeHeight
        "
        Me.updShapeHeight.Location = New System.Drawing.Point(64, 32)
        Me.updShapeHeight.Maximum = New Decimal(New Integer() {1000, 0, 0, 0})
        Me.updShapeHeight.Minimum = New Decimal(New Integer() {1, 0, 0, 0})
        Me.updShapeHeight.Name = "updShapeHeight"
        Me.updShapeHeight.Size = New System.Drawing.Size(48, 20)
        Me.updShapeHeight.TabIndex = 3
        Me.updShapeHeight.Value = New Decimal(New Integer() {20, 0, 0, 0})
        "
        "cboColors
        "
        Me.cboColors.DropDownStyle = System.Windows.Forms.ruboBoxStyle.DropDownList
        Me.cboColors.DropDownWidth = 136
        Me.cboColors.Location = New System.Drawing.Point(8, 24)
        Me.cboColors.Name = "cboColors"
        Me.cboColors.Size = New System.Drawing.Size(136, 21)
        Me.cboColors.TabIndex = 2
        "
        "pnlShapeOptions
        "
        Me.pnlShapeOptions.Controls.AddRange(New System.Windows.Forms.Control() {Me.lblShapeWidth, Me.updShapeWidth, Me.updShapeHeight, Me.lblShapeHeight, Me.cboShapeType, Me.lblShapeType})
        Me.pnlShapeOptions.Location = New System.Drawing.Point(160, 8)
        Me.pnlShapeOptions.Name = "pnlShapeOptions"
        Me.pnlShapeOptions.Size = New System.Drawing.Size(274, 56)
        Me.pnlShapeOptions.TabIndex = 0
        "
        "lblShapeWidth
        "
        Me.lblShapeWidth.Location = New System.Drawing.Point(128, 32)
        Me.lblShapeWidth.Name = "lblShapeWidth"
        Me.lblShapeWidth.Size = New System.Drawing.Size(48, 16)
        Me.lblShapeWidth.TabIndex = 2
        Me.lblShapeWidth.Text = "Width:"
        "
        "updShapeWidth
        "
        Me.updShapeWidth.Location = New System.Drawing.Point(184, 32)
        Me.updShapeWidth.Maximum = New Decimal(New Integer() {1000, 0, 0, 0})
        Me.updShapeWidth.Minimum = New Decimal(New Integer() {1, 0, 0, 0})
        Me.updShapeWidth.Name = "updShapeWidth"
        Me.updShapeWidth.Size = New System.Drawing.Size(48, 20)
        Me.updShapeWidth.TabIndex = 3
        Me.updShapeWidth.Value = New Decimal(New Integer() {20, 0, 0, 0})
        "
        "lblShapeHeight
        "
        Me.lblShapeHeight.Location = New System.Drawing.Point(8, 32)
        Me.lblShapeHeight.Name = "lblShapeHeight"
        Me.lblShapeHeight.Size = New System.Drawing.Size(48, 16)
        Me.lblShapeHeight.TabIndex = 2
        Me.lblShapeHeight.Text = "Height:"
        "
        "cboShapeType
        "
        Me.cboShapeType.DropDownStyle = System.Windows.Forms.ruboBoxStyle.DropDownList
        Me.cboShapeType.DropDownWidth = 121
        Me.cboShapeType.Location = New System.Drawing.Point(64, 8)
        Me.cboShapeType.Name = "cboShapeType"
        Me.cboShapeType.Size = New System.Drawing.Size(121, 21)
        Me.cboShapeType.TabIndex = 1
        "
        "lblShapeType
        "
        Me.lblShapeType.Location = New System.Drawing.Point(8, 8)
        Me.lblShapeType.Name = "lblShapeType"
        Me.lblShapeType.Size = New System.Drawing.Size(48, 16)
        Me.lblShapeType.TabIndex = 0
        Me.lblShapeType.Text = "Type:"
        "
        "updPenWidth
        "
        Me.updPenWidth.Location = New System.Drawing.Point(96, 8)
        Me.updPenWidth.Maximum = New Decimal(New Integer() {10, 0, 0, 0})
        Me.updPenWidth.Minimum = New Decimal(New Integer() {1, 0, 0, 0})
        Me.updPenWidth.Name = "updPenWidth"
        Me.updPenWidth.Size = New System.Drawing.Size(48, 20)
        Me.updPenWidth.TabIndex = 1
        Me.updPenWidth.Value = New Decimal(New Integer() {1, 0, 0, 0})
        "
        "pnlTools
        "
        Me.pnlTools.Controls.AddRange(New System.Windows.Forms.Control() {Me.optText, Me.optShape, Me.optPen})
        Me.pnlTools.Dock = System.Windows.Forms.DockStyle.Left
        Me.pnlTools.Name = "pnlTools"
        Me.pnlTools.Size = New System.Drawing.Size(64, 332)
        Me.pnlTools.TabIndex = 0
        "
        "optText
        "
        Me.optText.Appearance = System.Windows.Forms.Appearance.Button
        Me.optText.Location = New System.Drawing.Point(8, 88)
        Me.optText.Name = "optText"
        Me.optText.Size = New System.Drawing.Size(48, 36)
        Me.optText.TabIndex = 0
        Me.optText.Text = "Text"
        Me.optText.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
        "
        "optShape
        "
        Me.optShape.Appearance = System.Windows.Forms.Appearance.Button
        Me.optShape.Location = New System.Drawing.Point(8, 48)
        Me.optShape.Name = "optShape"
        Me.optShape.Size = New System.Drawing.Size(48, 36)
        Me.optShape.TabIndex = 0
        Me.optShape.Text = "Shape"
        Me.optShape.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
        "
        "optPen
        "
        Me.optPen.Appearance = System.Windows.Forms.Appearance.Button
        Me.optPen.Checked = True
        Me.optPen.Location = New System.Drawing.Point(8, 8)
        Me.optPen.Name = "optPen"
        Me.optPen.Size = New System.Drawing.Size(48, 36)
        Me.optPen.TabIndex = 0
        Me.optPen.TabStop = True
        Me.optPen.Text = "Pen"
        Me.optPen.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
        "
        "picDraw
        "
        Me.picDraw.BackColor = System.Drawing.SystemColors.Window
        Me.picDraw.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
        Me.picDraw.Dock = System.Windows.Forms.DockStyle.Fill
        Me.picDraw.Location = New System.Drawing.Point(64, 0)
        Me.picDraw.Name = "picDraw"
        Me.picDraw.Size = New System.Drawing.Size(436, 260)
        Me.picDraw.TabIndex = 2
        Me.picDraw.TabStop = False
        "
        "pnlPenOptions
        "
        Me.pnlPenOptions.Controls.AddRange(New System.Windows.Forms.Control() {Me.updPenWidth, Me.lblPenWidth})
        Me.pnlPenOptions.Location = New System.Drawing.Point(160, 8)
        Me.pnlPenOptions.Name = "pnlPenOptions"
        Me.pnlPenOptions.Size = New System.Drawing.Size(274, 56)
        Me.pnlPenOptions.TabIndex = 0
        "
        "lblPenWidth
        "
        Me.lblPenWidth.Location = New System.Drawing.Point(8, 8)
        Me.lblPenWidth.Name = "lblPenWidth"
        Me.lblPenWidth.Size = New System.Drawing.Size(80, 16)
        Me.lblPenWidth.TabIndex = 0
        Me.lblPenWidth.Text = "Pen Width:"
        "
        "mnuFileExit
        "
        Me.mnuFileExit.Index = 4
        Me.mnuFileExit.Shortcut = System.Windows.Forms.Shortcut.CtrlQ
        Me.mnuFileExit.Text = "E&xit"
        "
        "updFontSize
        "
        Me.updFontSize.Location = New System.Drawing.Point(208, 32)
        Me.updFontSize.Maximum = New Decimal(New Integer() {72, 0, 0, 0})
        Me.updFontSize.Minimum = New Decimal(New Integer() {6, 0, 0, 0})
        Me.updFontSize.Name = "updFontSize"
        Me.updFontSize.Size = New System.Drawing.Size(48, 20)
        Me.updFontSize.TabIndex = 5
        Me.updFontSize.Value = New Decimal(New Integer() {12, 0, 0, 0})
        "
        "mnuMain
        "
        Me.mnuMain.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.mnuFile})
        "
        "mnuFile
        "
        Me.mnuFile.Index = 0
        Me.mnuFile.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.mnuFileNew, Me.mnuFileOpen, Me.mnuFileSave, Me.mnuFileSep, Me.mnuFileExit})
        Me.mnuFile.Text = "&File"
        "
        "mnuFileNew
        "
        Me.mnuFileNew.Index = 0
        Me.mnuFileNew.Shortcut = System.Windows.Forms.Shortcut.CtrlN
        Me.mnuFileNew.Text = "&New"
        "
        "mnuFileOpen
        "
        Me.mnuFileOpen.Index = 1
        Me.mnuFileOpen.Shortcut = System.Windows.Forms.Shortcut.CtrlO
        Me.mnuFileOpen.Text = "&Open..."
        "
        "mnuFileSave
        "
        Me.mnuFileSave.Index = 2
        Me.mnuFileSave.Shortcut = System.Windows.Forms.Shortcut.CtrlS
        Me.mnuFileSave.Text = "&Save"
        "
        "mnuFileSep
        "
        Me.mnuFileSep.Index = 3
        Me.mnuFileSep.Text = "-"
        "
        "cboTextFont
        "
        Me.cboTextFont.DropDownStyle = System.Windows.Forms.ruboBoxStyle.DropDownList
        Me.cboTextFont.DropDownWidth = 104
        Me.cboTextFont.Location = New System.Drawing.Point(48, 32)
        Me.cboTextFont.Name = "cboTextFont"
        Me.cboTextFont.Size = New System.Drawing.Size(104, 21)
        Me.cboTextFont.TabIndex = 3
        "
        "pnlOptions
        "
        Me.pnlOptions.Controls.AddRange(New System.Windows.Forms.Control() {Me.pnlTextOptions, Me.pnlShapeOptions, Me.cboColors, Me.lblColor, Me.pnlPenOptions})
        Me.pnlOptions.Dock = System.Windows.Forms.DockStyle.Bottom
        Me.pnlOptions.Location = New System.Drawing.Point(64, 260)
        Me.pnlOptions.Name = "pnlOptions"
        Me.pnlOptions.Size = New System.Drawing.Size(436, 72)
        Me.pnlOptions.TabIndex = 1
        "
        "pnlTextOptions
        "
        Me.pnlTextOptions.Controls.AddRange(New System.Windows.Forms.Control() {Me.updFontSize, Me.lblFontSize, Me.cboTextFont, Me.lblTextFont, Me.txtText, Me.lblText})
        Me.pnlTextOptions.Location = New System.Drawing.Point(160, 8)
        Me.pnlTextOptions.Name = "pnlTextOptions"
        Me.pnlTextOptions.Size = New System.Drawing.Size(274, 56)
        Me.pnlTextOptions.TabIndex = 0
        "
        "lblFontSize
        "
        Me.lblFontSize.Location = New System.Drawing.Point(160, 32)
        Me.lblFontSize.Name = "lblFontSize"
        Me.lblFontSize.Size = New System.Drawing.Size(40, 16)
        Me.lblFontSize.TabIndex = 4
        Me.lblFontSize.Text = "Size:"
        "
        "lblTextFont
        "
        Me.lblTextFont.Location = New System.Drawing.Point(8, 32)
        Me.lblTextFont.Name = "lblTextFont"
        Me.lblTextFont.Size = New System.Drawing.Size(40, 16)
        Me.lblTextFont.TabIndex = 2
        Me.lblTextFont.Text = "Font:"
        "
        "txtText
        "
        Me.txtText.Location = New System.Drawing.Point(48, 8)
        Me.txtText.Name = "txtText"
        Me.txtText.Size = New System.Drawing.Size(208, 20)
        Me.txtText.TabIndex = 1
        Me.txtText.Text = "Scribble!"
        "
        "lblText
        "
        Me.lblText.Location = New System.Drawing.Point(8, 8)
        Me.lblText.Name = "lblText"
        Me.lblText.Size = New System.Drawing.Size(40, 16)
        Me.lblText.TabIndex = 0
        Me.lblText.Text = "Text:"
        "
        "lblColor
        "
        Me.lblColor.Location = New System.Drawing.Point(8, 8)
        Me.lblColor.Name = "lblColor"
        Me.lblColor.Size = New System.Drawing.Size(48, 16)
        Me.lblColor.TabIndex = 1
        Me.lblColor.Text = "Color:"
        "
        "dlgSave
        "
        Me.dlgSave.DefaultExt = "bmp"
        Me.dlgSave.FileName = "Scribble1"
        Me.dlgSave.Filter = "Bitmap files|*.bmp|PNG files|*.png"
        "
        "dlgOpen
        "
        Me.dlgOpen.DefaultExt = "bmp"
        Me.dlgOpen.Filter = "Bitmap files|*.bmp|PNG files|*.png"
        "
        "frmScribble
        "
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(500, 332)
        Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.picDraw, Me.pnlOptions, Me.pnlTools})
        Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
        Me.Menu = Me.mnuMain
        Me.Name = "frmScribble"
        Me.Text = "Scribble"
        CType(Me.updShapeHeight, System.ruponentModel.ISupportInitialize).EndInit()
        Me.updShapeHeight.ResumeLayout(False)
        Me.pnlShapeOptions.ResumeLayout(False)
        CType(Me.updShapeWidth, System.ruponentModel.ISupportInitialize).EndInit()
        Me.updShapeWidth.ResumeLayout(False)
        CType(Me.updPenWidth, System.ruponentModel.ISupportInitialize).EndInit()
        Me.updPenWidth.ResumeLayout(False)
        Me.pnlTools.ResumeLayout(False)
        Me.pnlPenOptions.ResumeLayout(False)
        CType(Me.updFontSize, System.ruponentModel.ISupportInitialize).EndInit()
        Me.updFontSize.ResumeLayout(False)
        Me.pnlOptions.ResumeLayout(False)
        Me.pnlTextOptions.ResumeLayout(False)
        Me.ResumeLayout(False)
    End Sub
#End Region
#Region "Enumerations"
    Public Enum DrawingTools
        Pen
        Shape
        Text
    End Enum
#End Region
#Region "Member variables for properties"
    Private m_sFileName As String
    Private m_bDrawing As Boolean
    Private m_eCurrentTool As DrawingTools
#End Region
#Region "Private variables"
    Private oGraphics As System.Drawing.Graphics
    Private oTool As Object
    Private sngX As Single
    Private sngY As Single
#End Region
#Region "Properties"
    Public Property FileName() As String
        Get
            Return m_sFileName
        End Get
        Set(ByVal Value As String)
            m_sFileName = Value
        End Set
    End Property
    Public Property Drawing() As Boolean
        Get
            Return m_bDrawing
        End Get
        Set(ByVal Value As Boolean)
            m_bDrawing = Value
        End Set
    End Property
    Public Property CurrentTool() As DrawingTools
        Get
            Return m_eCurrentTool
        End Get
        Set(ByVal Value As DrawingTools)
            m_eCurrentTool = Value
            "destroy the existing tool
            If Not oTool Is Nothing Then
                CType(oTool, IDisposable).Dispose()
            End If
        End Set
    End Property
#End Region
#Region "Menu commands"
    Private Sub mnuFileNew_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles mnuFileNew.Click
        Me.oGraphics.Clear(Color.White)
        "force the refresh
        Me.picDraw.Refresh()
    End Sub
    Private Sub mnuFileOpen_Click()
        If Me.dlgOpen.ShowDialog = DialogResult.OK Then
            Me.picDraw.Image.FromFile(Me.dlgOpen.FileName)
        End If
    End Sub
    Private Sub mnuFileSave_Click(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles mnuFileSave.Click
        Dim sFileName As String
        Dim oFormat As System.Drawing.Imaging.ImageFormat
        "get the filename to save to
        If dlgSave.ShowDialog = DialogResult.OK Then
            sFileName = dlgSave.FileName
            Select Case dlgSave.FilterIndex
                Case 0  "save as bitmap
                    oFormat = System.Drawing.Imaging.ImageFormat.Bmp
                Case 1  "save as PNG
                    oFormat = System.Drawing.Imaging.ImageFormat.Png
                Case Else
                    "should never happen
            End Select
            "possible exception on save
            Try
                Me.picDraw.Image.Save(sFileName, oFormat)
            Catch ex As Exception
                "just display for now
                MessageBox.Show(ex.Message, "Error saving file", _
                    MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        End If
    End Sub
    Private Sub mnuFileExit_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles mnuFileExit.Click
        Me.Close()
    End Sub
#End Region
#Region "PictureBox Event Handlers"
    Private Sub picDraw_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles picDraw.MouseMove
        If Me.Drawing Then
            "this is only true if the current tool is a pen
            oGraphics.DrawLine(oTool, sngX, sngY, e.X, e.Y)
            sngX = e.X
            sngY = e.Y
            "force a redraw
            Me.picDraw.Refresh()
        End If
    End Sub
    Private Sub picDraw_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles picDraw.MouseUp
        "we can stop drawing now
        Me.Drawing = False
    End Sub
    Private Sub picDraw_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles picDraw.MouseDown
        "start drawing
        "Shape and Text are stamps, Pen works on MouseMove
        "we need to create the tool and either draw it, or get ready to draw it
        Select Case Me.CurrentTool
            Case DrawingTools.Shape
                Select Case Me.cboShapeType.Text
                    Case "Rectangle"
                        oGraphics.FillRectangle(New SolidBrush(Color.FromName(Me.cboColors.Text)), _
                            e.X, _
                            e.Y, _
                            Me.updShapeWidth.Value, _
                            Me.updShapeHeight.Value)
                    Case "Ellipse"
                        oGraphics.FillEllipse(New SolidBrush(Color.FromName(Me.cboColors.Text)), _
                        e.X, _
                        e.Y, _
                        Me.updShapeWidth.Value, _
                        Me.updShapeHeight.Value)
                    Case Else
                End Select
                "force a redraw
                Me.picDraw.Refresh()
            Case DrawingTools.Text
                "create a font
                oTool = New System.Drawing.Font(Me.cboTextFont.Text, Me.updFontSize.Value)
                "draw the text at the current mouse location
                oGraphics.DrawString(Me.txtText.Text, _
                    oTool, New SolidBrush(Color.FromName(Me.cboColors.Text)), _
                    e.X, e.Y)
                "force a redraw
                Me.picDraw.Refresh()
            Case DrawingTools.Pen
                "create the pen (for drawing in MouseMove)
                oTool = New System.Drawing.Pen(Color.FromName(Me.cboColors.Text), Me.updPenWidth.Value)
                sngX = e.X
                sngY = e.Y
                Me.Drawing = True
        End Select
    End Sub
#End Region
#Region "Other Event Handlers"
    Private Sub frmScribble_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        "set up the Color ComboBox
        FillLists()
        "create the graphics we"ll be drawing on
        Me.picDraw.Image = New Bitmap(picDraw.Width, picDraw.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb)
        Me.oGraphics = Graphics.FromImage(Me.picDraw.Image)
        "set the background to white
        Me.oGraphics.Clear(Color.White)
        "set the initial tool to the Pen
        optPen_Click(Nothing, Nothing)
    End Sub
    Private Sub optPen_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles optPen.Click
        "set the tool to a pen
        Me.CurrentTool = DrawingTools.Pen
        "hide all the other tool"s panels
        pnlPenOptions.Visible = True
        pnlShapeOptions.Visible = False
        pnlTextOptions.Visible = False
    End Sub
    Private Sub optShape_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles optShape.Click
        "set the tool to a Shape
        Me.CurrentTool = DrawingTools.Shape
        "hide all the other tool"s panels
        pnlPenOptions.Visible = False
        pnlShapeOptions.Visible = True
        pnlTextOptions.Visible = False
    End Sub
    Private Sub optText_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles optText.Click
        "set the tool to Text
        Me.CurrentTool = DrawingTools.Text
        "hide all the other tool"s panels
        pnlPenOptions.Visible = False
        pnlShapeOptions.Visible = False
        pnlTextOptions.Visible = True
    End Sub
#End Region
#Region "Assorted methods"
    Private Sub FillLists()
        With cboColors.Items
            .Add("Black")
            .Add("Red")
            .Add("Green")
            .Add("Blue")
        End With
        cboColors.SelectedIndex = 0
        With cboShapeType.Items
            .Add("Rectangle")
            .Add("Ellipse")
        End With
        cboShapeType.SelectedIndex = 0
        With cboTextFont.Items
            .Add("Arial")
            .Add("Times New Roman")
            .Add("Courier New")
        End With
        cboTextFont.SelectedIndex = 0
    End Sub
#End Region
End Class

Scribble application buffered by Bitmap

Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Windows.Forms
Imports System.Math
public class ScribbleApplication
   public Shared Sub Main
        Application.Run(New Form1)
   End Sub
End class
Public Class Form1
    Private m_Bitmap As Bitmap
    Private m_Graphics As Graphics
    Private m_Drawing As Boolean
    Private m_X As Integer
    Private m_Y As Integer
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
     Handles MyBase.Load
        MakeNewBitmap()
    End Sub
    Private Sub mnuFileClear_Click(ByVal sender As System.Object, _
     ByVal e As System.EventArgs) Handles mnuFileClear.Click
        MakeNewBitmap()
    End Sub
    Private Sub MakeNewBitmap()
        Dim wid As Integer = picCanvas.ClientSize.Width
        Dim hgt As Integer = picCanvas.ClientSize.Height
        m_Bitmap = New Bitmap(wid, hgt)
        m_Graphics = Graphics.FromImage(m_Bitmap)
        m_Graphics.Clear(Me.BackColor)
        picCanvas.Image = m_Bitmap
    End Sub
    Private Sub picCanvas_MouseDown(ByVal sender As Object, _
     ByVal e As System.Windows.Forms.MouseEventArgs) Handles picCanvas.MouseDown
        m_Drawing = True
        m_X = e.X
        m_Y = e.Y
    End Sub
    Private Sub picCanvas_MouseMove(ByVal sender As Object, _
     ByVal e As System.Windows.Forms.MouseEventArgs) Handles picCanvas.MouseMove
        If Not m_Drawing Then Exit Sub
        m_Graphics.DrawLine(Pens.Black, m_X, m_Y, e.X, e.Y)
        m_X = e.X
        m_Y = e.Y
        picCanvas.Image = m_Bitmap
    End Sub
    Private Sub picCanvas_MouseUp(ByVal sender As Object, _
     ByVal e As System.Windows.Forms.MouseEventArgs) Handles picCanvas.MouseUp
        m_Drawing = False
    End Sub
End Class
<Global.Microsoft.VisualBasic.rupilerServices.DesignerGenerated()> _
Partial Public Class Form1
    Inherits System.Windows.Forms.Form
    "Form overrides dispose to clean up the component list.
    <System.Diagnostics.DebuggerNonUserCode()> _
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing AndAlso components IsNot Nothing Then
            components.Dispose()
        End If
        MyBase.Dispose(disposing)
    End Sub
    "Required by the Windows Form Designer
    Private components As System.ruponentModel.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.
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        Me.picCanvas = New System.Windows.Forms.PictureBox
        Me.MenuStrip1 = New System.Windows.Forms.MenuStrip
        Me.mnuFile = New System.Windows.Forms.ToolStripMenuItem
        Me.mnuFileClear = New System.Windows.Forms.ToolStripMenuItem
        CType(Me.picCanvas, System.ruponentModel.ISupportInitialize).BeginInit()
        Me.MenuStrip1.SuspendLayout()
        Me.SuspendLayout()
        "
        "picCanvas
        "
        Me.picCanvas.Dock = System.Windows.Forms.DockStyle.Fill
        Me.picCanvas.Location = New System.Drawing.Point(0, 24)
        Me.picCanvas.Name = "picCanvas"
        Me.picCanvas.Size = New System.Drawing.Size(303, 246)
        Me.picCanvas.TabIndex = 0
        Me.picCanvas.TabStop = False
        "
        "MenuStrip1
        "
        Me.MenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuFile})
        Me.MenuStrip1.Location = New System.Drawing.Point(0, 0)
        Me.MenuStrip1.Name = "MenuStrip1"
        Me.MenuStrip1.Size = New System.Drawing.Size(303, 24)
        Me.MenuStrip1.TabIndex = 1
        Me.MenuStrip1.Text = "MenuStrip1"
        "
        "mnuFile
        "
        Me.mnuFile.DropDownItems.AddRange(New System.Windows.Forms.ToolStripItem() {Me.mnuFileClear})
        Me.mnuFile.Name = "mnuFile"
        Me.mnuFile.Text = "&File"
        "
        "mnuFileClear
        "
        Me.mnuFileClear.Name = "mnuFileClear"
        Me.mnuFileClear.Text = "&Clear"
        "
        "Form1
        "
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(303, 270)
        Me.Controls.Add(Me.picCanvas)
        Me.Controls.Add(Me.MenuStrip1)
        Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
        Me.MainMenuStrip = Me.MenuStrip1
        Me.Name = "Form1"
        Me.Text = "Scribble"
        CType(Me.picCanvas, System.ruponentModel.ISupportInitialize).EndInit()
        Me.MenuStrip1.ResumeLayout(False)
        Me.ResumeLayout(False)
        Me.PerformLayout()
    End Sub
    Friend WithEvents picCanvas As System.Windows.Forms.PictureBox
    Friend WithEvents MenuStrip1 As System.Windows.Forms.MenuStrip
    Friend WithEvents mnuFile As System.Windows.Forms.ToolStripMenuItem
    Friend WithEvents mnuFileClear As System.Windows.Forms.ToolStripMenuItem
End Class

Shape Painter

"Sams Teach Yourself Microsoft Visual Basic .NET 2003 in 21 Days, Second Edition (Paperback)
"by Steve Holzner (Author)
"# Publisher: Sams; 2 edition (April 21, 2003)
"# Language: English
"# ISBN-10: 0672325314
"# ISBN-13: 978-0672325311
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Windows.Forms
public class PainterShape
   public Shared Sub Main
        Application.Run(New Form1)
   End Sub
End class
Public Class Form1
    Inherits System.Windows.Forms.Form
#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.ruponentModel.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 Button1 As System.Windows.Forms.Button
    Friend WithEvents Button2 As System.Windows.Forms.Button
    Friend WithEvents Button3 As System.Windows.Forms.Button
    Friend WithEvents Label1 As System.Windows.Forms.Label
    Friend WithEvents Button4 As System.Windows.Forms.Button
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.Button1 = New System.Windows.Forms.Button
        Me.Button2 = New System.Windows.Forms.Button
        Me.Button3 = New System.Windows.Forms.Button
        Me.Label1 = New System.Windows.Forms.Label
        Me.Button4 = New System.Windows.Forms.Button
        Me.SuspendLayout()
        "
        "Button1
        "
        Me.Button1.Location = New System.Drawing.Point(0, 248)
        Me.Button1.Name = "Button1"
        Me.Button1.TabIndex = 0
        Me.Button1.Text = "Rectangle"
        "
        "Button2
        "
        Me.Button2.Location = New System.Drawing.Point(80, 248)
        Me.Button2.Name = "Button2"
        Me.Button2.TabIndex = 1
        Me.Button2.Text = "Ellipse"
        "
        "Button3
        "
        Me.Button3.Location = New System.Drawing.Point(160, 248)
        Me.Button3.Name = "Button3"
        Me.Button3.TabIndex = 2
        Me.Button3.Text = "Line"
        "
        "Label1
        "
        Me.Label1.Font = New System.Drawing.Font("Microsoft Sans Serif", 24.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.Label1.Location = New System.Drawing.Point(0, 0)
        Me.Label1.Name = "Label1"
        Me.Label1.Size = New System.Drawing.Size(152, 48)
        Me.Label1.TabIndex = 3
        Me.Label1.Text = "Graphics"
        "
        "Button4
        "
        Me.Button4.Location = New System.Drawing.Point(240, 248)
        Me.Button4.Name = "Button4"
        Me.Button4.TabIndex = 4
        Me.Button4.Text = "Freehand"
        "
        "Form1
        "
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(320, 273)
        Me.Controls.Add(Me.Button4)
        Me.Controls.Add(Me.Label1)
        Me.Controls.Add(Me.Button3)
        Me.Controls.Add(Me.Button2)
        Me.Controls.Add(Me.Button1)
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)
    End Sub
#End Region
    Dim gphFormGraphics As Graphics
    Dim pt1, pt2 As Point
    Dim ptPointsArray() As Point
    Dim intNumberOfPoints As Integer = 0
    Dim recDrawingRectangle As Rectangle
    Dim btnCurrentButton As Buttons
    Enum Buttons
        Rectangle
        Ellipse
        Line
        Freehand
    End Enum
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        gphFormGraphics = Me.CreateGraphics()
    End Sub
    Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
        pt1 = New Point(e.X, e.Y)
    End Sub
    Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseUp
        pt2 = New Point(e.X, e.Y)
        recDrawingRectangle = New Rectangle(Math.Min(pt2.X, pt1.X), Math.Min(pt2.Y, pt1.Y), _
            Math.Abs(pt2.X - pt1.X), Math.Abs(pt2.Y - pt1.Y))
        Select Case btnCurrentButton
            Case Buttons.Rectangle
                gphFormGraphics.DrawRectangle(Pens.Navy, recDrawingRectangle)
            Case Buttons.Ellipse
                gphFormGraphics.DrawEllipse(Pens.Navy, recDrawingRectangle)
            Case Buttons.Line
                gphFormGraphics.DrawLine(Pens.Navy, pt2, pt1)
        End Select
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        btnCurrentButton = Buttons.Rectangle
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        btnCurrentButton = Buttons.Ellipse
    End Sub
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        btnCurrentButton = Buttons.Line
    End Sub
    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        btnCurrentButton = Buttons.Freehand
    End Sub
    Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove
        If btnCurrentButton = Buttons.Freehand And e.Button = MouseButtons.Left Then
            Dim ptNew As New Point(e.X, e.Y)
            ReDim Preserve ptPointsArray(intNumberOfPoints)
            ptPointsArray(intNumberOfPoints) = ptNew
            intNumberOfPoints += 1
            If intNumberOfPoints >= 2 Then
                gphFormGraphics.DrawLines(Pens.Navy, ptPointsArray)
            End If
        End If
    End Sub
    Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
        Select Case btnCurrentButton
            Case Buttons.Rectangle
                gphFormGraphics.DrawRectangle(Pens.Navy, recDrawingRectangle)
            Case Buttons.Ellipse
                gphFormGraphics.DrawEllipse(Pens.Navy, recDrawingRectangle)
            Case Buttons.Line
                gphFormGraphics.DrawLine(Pens.Navy, pt2, pt1)
            Case Buttons.Freehand
                If intNumberOfPoints >= 2 Then
                    gphFormGraphics.DrawLines(Pens.Navy, ptPointsArray)
                End If
        End Select
    End Sub
End Class