Příklad výběru oblasti na PictureBox
Public Class Form1
Dim mDn, mMv, mUp, kLc As Point ' pro záznam souřadnic MouseDown, Move, Up...
Dim vR As Rectangle ' vybraná oblast
Dim Tah, Kriz As Boolean ' pro řízení vykreslování
Dim Fnt As Font = New Font("Verdana", 18, FontStyle.Bold) ' font, křížek pomocí písmene X
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
PictureBox1.Dock = DockStyle.Fill
PictureBox1.BackColor = Color.Ivory
End Sub
Private Sub PictureBox1_MouseDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
' smazat předchozí výběr:
mMv.X = 0 : mMv.Y = 0
vR = New Rectangle(0, 0, 0, 0)
Kriz = False
Tah = False
mDn = e.Location ' poloha kursoru
PictureBox1.Invalidate() ' překreslit (smazat)
End Sub
Private Sub PictureBox1_MouseMove(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
If e.Button = Windows.Forms.MouseButtons.Left Then ' akce Move při stisknutém l. tl.
Dim w As Integer = Me.Left + Me.Width - 5 ' pravý okraj PictureBox na obrazovce
Dim h As Integer = Me.Top + Me.Height - 5 ' dtto spodní okraj
' omezení pohybu kursoru mimo okno:
' vlevo:
If e.X < 0 Then
Cursor.Position = New Point(Me.Left + 5, Cursor.Position.Y)
End If
' nahoře:
If e.Y < 0 Then
Cursor.Position = New Point(Cursor.Position.X, Me.Top + 30)
End If
' vpravo:
If Cursor.Position.X >= w Then
Cursor.Position = New Point(w, Cursor.Position.Y)
End If
' dole:
If Cursor.Position.Y > h Then
Cursor.Position = New Point(Cursor.Position.X, h)
End If
mMv = e.Location ' aktuální souřadnice myši
Tah = True ' probíhá tažení
PictureBox1.Invalidate() ' překreslovat
End If
End Sub
Private Sub PictureBox1_MouseUp(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
' konec akce:
mMv = e.Location ' souřadnice na konci tažení
mUp = e.Location
kLc.X = mDn.X + (mMv.X - mDn.X) / 2 - 13 ' výpočet souřadnic pro křížek (X)
kLc.Y = mDn.Y + (mMv.Y - mDn.Y) / 2 - 14
Kriz = True ' křížek kreslit
Tah = False ' tažení skončilo
mDn.X = 0 : mDn.Y = 0
mMv.X = 0 : mMv.Y = 0
PictureBox1.Invalidate()
End Sub
Private Sub PictureBox1_Paint(ByVal sender As Object, _
ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
Dim mDn2 As Point ' pomocné souřadnice l. h. rohu
Dim mRw, mRh As Integer ' šířka a výška obdélníku
' pro případ tažení vlevo a nahoru:
mRw = Math.Abs(mMv.X - mDn.X) ' absolutní šířka
mRh = Math.Abs(mMv.Y - mDn.Y) ' dtto výška
If (mMv.X - mDn.X) < 0 Then
' záměna souřadnic při tažení vlevo
mDn2.X = mMv.X
Else
mDn2.X = mDn.X
End If
If (mMv.Y - mDn.Y) < 0 Then
' záměna souřadnic při tažení nahoru
mDn2.Y = mMv.Y
Else
mDn2.Y = mDn.Y
End If
If Tah Then
' vyplněný obdélník:
e.Graphics.FillRectangle(New SolidBrush(Color.FromArgb(16, Color.Blue)), mDn2.X, mDn2.Y, mRw, mRh)
' orámování obdélníka:
e.Graphics.DrawRectangle(New Pen(Color.DarkGray, 1), mDn2.X, mDn2.Y, mRw, mRh)
vR = New Rectangle(mDn2.X, mDn2.Y, mRw, mRh) ' obdélník vybrané oblasti
End If
If Kriz Then
e.Graphics.DrawString("X", Fnt, Brushes.DarkBlue, kLc.X, kLc.Y) ' křížek - znak X
e.Graphics.DrawRectangle(New Pen(Color.Red, 1), vR) ' orámování vybrané oblasti - červeně
End If
End Sub
End Class
|