The lack of XOR Drawing feature in GDI+ was not certainly welcome in the programmer's community. I guess it will be hard to survive with this handicap. In spite of this, I would like to show how we can draw rubber-band lines and shapes in GDI+ with just a few lines of code.
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Dim size As Size = SystemInformation.PrimaryMonitorMaximizedWindowSize
bitmap = New Bitmap(size.Width, size.Height)
gB = Graphics.FromImage(bitmap)
Dim bckColor As Color = Me.BackColor
gB.Clear(bckColor)
End Sub
Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e AsSystem.Windows.Forms.MouseEventArgs)
Dim p As Point = New Point(e.X, e.Y)
x0 = p.X
y0 = p.Y
drag = True
End Sub
Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e AsSystem.Windows.Forms.MouseEventArgs)
Dim p As Point = New Point(e.X, e.Y)
x= p.X
y = p.Y
Dim cx As Integer = x - x0
Dim cy As Integer = y - y0
If drag Then
Dim gx As Graphics = CreateGraphics()
gx.DrawImage(bitmap, 0, 0)
gx.Dispose()
Dim g As Graphics = CreateGraphics()
Dim pen As Pen = New Pen(Color.Blue)
Select Case DrawMode
Case 1
g.DrawLine(pen, x0, y0, x, y)
Exit Select
Case 2
g.DrawEllipse(pen, x0, y0, cx, cy)
Exit Select
Case 3
g.DrawRectangle(pen, x0, y0, cx, cy)
Exit Select
End Select
g.Dispose()
pen.Dispose()
End If
End Sub
Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e AsSystem.Windows.Forms.MouseEventArgs)
Dim cx As Integer = x - x0
Dim cy As Integer = y - y0
Dim pen As Pen = New Pen(Color.Blue)
Select Case DrawMode
Case 1
gB.DrawLine(pen, x0, y0, x, y)
Exit Select
Case 2
gB.DrawEllipse(pen, x0, y0, cx, cy)
Exit Select
Case 3
gB.DrawRectangle(pen, x0, y0, cx, cy)
Exit Select
End Select
drag = False
pen.Dispose()
End Sub
Private Sub Form1_Paint(ByVal sender As Object, ByVal e AsSystem.Windows.Forms.PaintEventArgs)
Dim gx As Graphics = CreateGraphics()
gx.DrawImage(bitmap, 0, 0)
gx.Dispose()
End Sub
Private Sub button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)button1.ForeColor = Color.Red
button2.ForeColor = Color.Black
button3.ForeColor = Color.Black
DrawMode = 1
End Sub
Private Sub button2_Click(ByVal sender As Object, ByVal e As System.EventArgs)
button2.ForeColor = Color.Red
button1.ForeColor = Color.Black
button3.ForeColor = Color.Black
DrawMode = 2
End Sub
Private Sub button3_Click(ByVal sender As Object, ByVal e As System.EventArgs)
button3.ForeColor = Color.Red
button1.ForeColor = Color.Black
button2.ForeColor = Color.Black
DrawMode = 3
End Sub
Private Sub panel1_Paint(ByVal sender As Object, ByVal e AsSystem.Windows.Forms.PaintEventArgs)
button1.ForeColor = Color.Red
button1.Focus()
End Sub