十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这个类继承自Panel,把它加到你的项目里面,先运行一下,然后从工具箱里把它拖到窗体上,然后再向里面添加其它控件就可以了,支持Shift加选,Alt减选
创新互联公司长期为上1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为鄂温克企业提供专业的做网站、网站建设,鄂温克网站改版等技术服务。拥有10余年丰富建站经验和众多成功案例,为您定制开发。
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
使用Line方法,向Form,PictureBox这些控件都支持这个方法。
语法:
object.Line [Step] (x1, 1) [Step] (x2, y2), [color], [B][F]
如:
Me.Line (100,100)-(600,600), vbred, bf
加B这个参数就是矩形,加F就是用就边框颜色填充
补充:
Color参数就是边框颜色,如果省略,就用对象的ForeColor(前景色,就是字体的颜色) 属性值
g = Me.picDisplay.CreateGraphics
Dim mybrush As Brush = New SolidBrush(Map_Empty_Color)
Dim rect2 As System.Drawing.Rectangle = New System.Drawing.Rectangle(0, 0, Map_Width, Map_Height)
g.FillRectangle(mybrush, rect2)
Line 方法
在对象上画直线和矩形。
语法
object.Line [Step] (x1, 1)
[Step] (x2, y2), [color], [B][F]
Line 方法的语法有以下对象限定符和部分:
部分
描述
object
可选的。
对象表达式,其值为“应用于”列表中的对象。如果object 省略,具有焦点的窗体作为object。
Step
可选的。关键字,指定起点坐标,它们相对于由
CurrentX 和 CurrentY 属性提供的当前图形位置。
(x1, y1)
可选的。Single (单精度浮点数),直线或矩形的起点坐标。ScaleMode
属性决定了使用的度量单位。如果省略,线起始于由 CurrentX 和 CurrentY 指示的位置。
Step
可选的。关键字,指定相对于线的起点的终点坐标。
(x2, y2)
必需的。Single (单精度浮点数),直线或矩形的终点坐标。
color
可选的。Long (长整型数),画线时用的 RGB 颜色。如果它被省略,则使用 ForeColor 属性值。可用 RGB 函数或 QBColor
函数指定颜色。
B
可选的。如果包括,则利用对角坐标画出矩形。
F
可选的。如果使用了 B 选项,则 F
选项规定矩形以矩形边框的颜色填充。不能不用 B 而用 F。如果不用 F 光用 B,则矩形用当前的
FillColor 和 FillStyle 填充。FillStyle 的缺省值为
transparent。
说明
画联结的线时,前一条线的终点就是后一条线的起点。
线的宽度取决于 DrawWidth 属性值。在背景上画线和矩形的方法取决于
DrawMode 和 DrawStyle 属性值。
执行 Line 方法时, CurrentX 和 CurrentY
属性被参数设置为终点。
这个方法不能用于With...End With 语句块。
例子:
Line (500, 500)-(1000, 1000), RGB(255, 200, 0), BF