正文
vb.net矩形 vb如何把矩形变成椭圆
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
VB.NET我要用鼠标轨迹画一个矩形框 然后选中控件。就像星际和魔兽争霸里对部队单位的选中一样~等大神回答
这个类继承自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
VB.net 中如何判断一个圆和一个矩形相交
建立新窗体,新建timer控件,间隔随意,运行即可,输入以下代码,可以充分看到你要的效果
Dim yuanxin As New Point(50, 50) '圆心
Dim zhijing As Long = 100 '直径,其实里面用的多的是半径,但你说是直径,我就用直径
Private Sub Form1_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
e.Graphics.Clear(Color.Beige) '刷除底色
Dim myRect As New RectangleF(150, 80, 100, 100) '建立矩形
e.Graphics.DrawRectangle(Pens.Red, Rectangle.Round(myRect)) '画出矩形
Dim p As System.Drawing.Drawing2D.GraphicsPath = New System.Drawing.Drawing2D.GraphicsPath() '新建路径
p.AddEllipse(yuanxin.X - zhijing \ 2, yuanxin.Y - zhijing \ 2, zhijing, zhijing) '向当前路径增加椭圆,里面的运算是把圆心转换为圆形外切矩形的左上角坐标以及这个矩形的宽和高,在本例中宽高即为圆形的直径
e.Graphics.DrawPath(Pens.Black, p) '在窗体上画出椭圆(本例中是圆形)
Dim myRegion As New [Region](p) '根据椭圆建立区域
Dim contained As Boolean = myRegion.IsVisible(myRect) '判断区域是否相交
Dim myFont As New Font("Arial", 8)
Dim myBrush As New SolidBrush(Color.Black)
e.Graphics.DrawString("相交 = " contained.ToString(), myFont, myBrush, New PointF(20, 260)) '输出结果
End Sub
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
yuanxin.X += 1
Me.Refresh()
End Sub
在vb.net中,矩形只能从左向右画么
对于VB来说vb.net矩形,其实是无所谓左右的。它只是把参数传递给底层的绘图接口而已。
对于底层接口来说vb.net矩形,绘制矩形是可以有方向的。可以把四个参数对调就反过来了。
vb.net矩形的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于vb如何把矩形变成椭圆、vb.net矩形的信息别忘了在本站进行查找喔。