vb.net绘图问题

vb2013在窗口paint事件中绘图,如果图形参数和窗口大小有关联,则在改变窗口大小时窗口重绘会出现图形错误,请问该如何解决... vb2013在窗口paint事件中绘图,如果图形参数和窗口大小有关联,则在改变窗口大小时窗口重绘会出现图形错误,请问该如何解决 展开
 我来答
张玉毕寿林
2014-11-04 · 超过39用户采纳过TA的回答
知道答主
回答量:70
采纳率:0%
帮助的人:59.4万
展开全部
代码:
Public Class Form1
    '*********************************************************************   
    '作者:章鱼哥,QQ:3107073263 群:309816713       
    '如有疑问或好的建议请联系我,大家一起进步     
    '*********************************************************************     
    '绘制圆角矩形函数
    Private Function GetRoundedRectPath(ByVal rect As Rectangle, ByVal radius As Integer) As System.Drawing.Drawing2D.GraphicsPath
        rect.Offset(-1, -1)
        Dim RoundRect As New Rectangle(rect.Location, New Size(radius - 1, radius - 1))

        Dim path As New System.Drawing.Drawing2D.GraphicsPath
        path.AddArc(RoundRect, 180, 90)     '左上角
        RoundRect.X = rect.Right - radius   '右上角
        path.AddArc(RoundRect, 270, 90)
        RoundRect.Y = rect.Bottom - radius  '右下角
        path.AddArc(RoundRect, 0, 90)
        RoundRect.X = rect.Left             '左下角
        path.AddArc(RoundRect, 90, 90)
        path.CloseFigure()
        Return path
    End Function
    '绘制矩形
    Private Sub DrawingRect()
        Dim g As Graphics = Me.CreateGraphics
        Dim Pen As New Pen(Brushes.DarkRed, 2)
        Dim Hei As Integer = Me.Height
        Dim Wid As Integer = Me.Width
        '矩形的位置和长宽随着窗体的变化而改变
        Dim Rec As New Rectangle(Int(Wid / 5), Int(Hei / 5), Int(Wid / 2), Int(Hei / 2))
        '  g.DrawRectangle(Pen, Rec)
        '清楚现有的矩形
        g.Clear(Me.BackColor)
        g.DrawPath(Pen, GetRoundedRectPath(Rec, 30))
    End Sub

    Private Sub Form1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
        DrawingRect()
    End Sub

    Private Sub Form1_SizeChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.SizeChanged
        Me.Invalidate() '此函数可引发Paint事件
    End Sub
End Class

效果截图:

原窗口:

缩小后:

更多追问追答
追问
所以是说重点是在Invalidate()这个函数上么 那为什么将绘图代码写在paint事件里就会出现问题呢
还有就是如何获得绘图的有效区域,我感觉每次绘图的时候坐标都会有一些偏差,不知道是为什么
追答
关于第一个问题,我想应该是你在改变窗体大小时,SizeChanged事件已经触发,但是当前的窗体还没有重绘,所以可能会引起未知的错误。第二个问题:绘制矩形最重要的是图形的Location,和有长宽。我们知道这些都是参数都是整型,而我上面的代码什么1/5窗体大小,最后是舍弃小数点的。关于获取绘图的有效区域,这个还真不好实现,不像在ASP.NET 中可以设置图形的热点,窗体程序不好设置,可能是我还不知道这个实现方法,你可以多查查
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式