VB.NET我要用鼠标轨迹画一个矩形框 然后选中控件。就像星际和魔兽争霸里对部队单位的选中一样~等大神回答

 我来答
Silin_Silin
2014-05-15 · TA获得超过470个赞
知道小有建树答主
回答量:303
采纳率:50%
帮助的人:384万
展开全部

这个类继承自Panel,把它加到你的项目里面,先运行一下,然后从工具箱里把它拖到窗体上,然后再向里面添加其它控件就可以了,支持Shift加选,Alt减选


Imports System.Linq
Imports System.Collections

Public Class MyPanel
    Inherits Panel

    ' 选择模式,相交还是包含
    Enum SelectMode
        Intersects
        Contains
    End Enum

    Dim down As New Point(-1, -1)
    Dim rect As Rectangle
    Dim selected As New List(Of Control)
    Dim editting As IEnumerable(Of Control)
    Dim mode As SelectMode = SelectMode.Contains
    Dim shift, alt As Boolean

    Public Sub New()
        Me.DoubleBuffered = True
    End Sub

    Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
        MyBase.OnMouseDown(e)
        down = e.Location
        editting = selected.ToArray().ToList()
        OnMouseMove(e)
    End Sub

    Protected Overrides Sub OnMouseMove(e As MouseEventArgs)
        MyBase.OnMouseMove(e)
        If e.Button = Windows.Forms.MouseButtons.Left Then
            Dim loc As New Point(Math.Min(down.X, e.X), Math.Min(down.Y, e.Y))
            Dim size As New Size(Math.Abs(down.X - e.X), Math.Abs(down.Y - e.Y))
            rect = New Rectangle(loc, size)
            Dim cs As New List(Of Control)
            For Each c In Controls
                cs.Add(c)
            Next
            Dim a = cs.Where(Function(n As Control) (mode = SelectMode.Contains And rect.Contains(n.Bounds)) Or (mode = SelectMode.Intersects And rect.IntersectsWith(n.Bounds)))
            If shift Then editting = a.Union(selected) Else If alt Then editting = selected.Except(a) Else editting = a
            Invalidate()
        End If
    End Sub

    Protected Overrides Sub OnMouseUp(e As MouseEventArgs)
        MyBase.OnMouseUp(e)
        down = New Point(-1, -1)
        selected = editting.ToList()
        editting = Nothing
        Invalidate()
    End Sub

    Protected Overrides Function ProcessKeyPreview(ByRef m As Message) As Boolean
        Dim KeyCode As Keys = CInt(m.WParam) And CInt(Keys.KeyCode)
        Dim d As Boolean
        If m.Msg = &H100 Or m.Msg = &H104 Then d = True Else If m.Msg = &H101 Or m.Msg = &H105 Then d = False Else Return MyBase.ProcessKeyPreview(m)
        If KeyCode = Keys.ShiftKey Then
            shift = d
        ElseIf KeyCode = Keys.Menu Then
            alt = d
        End If
        Return MyBase.ProcessKeyPreview(m)
    End Function

    Protected Overrides Sub OnPaint(e As PaintEventArgs)
        MyBase.OnPaint(e)
        For Each c As Control In IIf(editting Is Nothing, selected, editting)
            e.Graphics.DrawRectangle(New Pen(Color.Gray) With {.DashStyle = Drawing2D.DashStyle.DashDot}, c.Left - 1, c.Top - 1, c.Width + 1, c.Height + 1)
        Next
        If (down.X > 0) Then e.Graphics.DrawRectangle(New Pen(Color.Gray) With {.DashStyle = Drawing2D.DashStyle.DashDot}, rect)
    End Sub
End Class
更多追问追答
追问
不好意思,用了你这个代码后~ 矩形框的功能是有~ 但是我添加别的控件都看不出了~
追答
什么意思,能说详细点吗~~
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式