vb.net中的一个绘图问题

时间:2021-09-17 13:58:39
我使用了Tabcontrol控件,在tabpage1中的picturebox1中用pen画了个圆和直线,运行时点了tabpage2再点tabpage1时画的图就不见了,这是为什么那?怎么样才能保持图形一直处于显示状态?
代码如下:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        
        g = PictureBox1.CreateGraphics
        
        ’画圆
        pen1 = New Drawing.Pen(Color.Red, 1)
        g.DrawEllipse(pen1, 0, 0, 2 * r, 2 * r)
        
        '画直线
        pen1 = New Drawing.Pen(Color.Green, 1)
        g.Graphics.DrawLine(pen1, P_X(1), P_Y(1), P_X(1) + 60, P_Y(1))
End Sub

目的很简单,就是想点Button让picturebox1中画出我要的图形,并且进行界面操作的时候图形不会消失,请高手指点,并给出代码

6 个解决方案

#1


貌似没有VB6那个持续功能。。。。没看

方法倒是挺多的,可以在切换回来的时候,找到一个恰当的事件。。然后再次绘图。。。。

可以重载消息函数什么什么的绘图。。重载谁的就看你的爱好了。。。。

当然还有更简单的。。画一个容器进去。。。panel了,image什么什么的,然后在内存画你的图像,画好了放进去。。。

要是特别的情况,可以看看那个控件有没有背景图属性什么的,把画好的图像放进去。。。。

反正你就慢慢想吧,办法会有的……效率高的有,效率低下的也有。。。。。

#2


Dim image As New Bitmap(300, 300, Imaging.PixelFormat.Format32bppArgb)
        Dim g As Graphics = Graphics.FromImage(image)
        g.DrawLine(New Pen(Color.Black), 0, 0, 200, 200)
        Me.PictureBox1.Image = image
这段代码是可以自动重绘的

如果不想用
Me.PictureBox1.Image = image
那就在
Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        
    End Sub
这个事件中用 e.Graphics.DrawLine   ...

但如果用这种方式的时候,如果绘图的内容多的话,每paint一次,就重绘(计算)一次,会影响效果,建议用第一种。

#3


首先谢谢你的回复,但我想要的不是自动绘图,而是点一个button健后绘图,而且在对界面进行操作的时候图像不会丢失。用paint来绘图是可以不丢失的,非常不灵活。我想把一段代码放到button_click中,该怎么做那?也就是怎么让paint不要自动绘图,而是在点button后再绘图。

#4


而且我需要在一张picturebox或者groupbox内画多个图形,每点一个button画一个出来,如何才能实现那?

#5


赫赫上面说的第一种就不时自动绘图的啊,具体过程是
在窗体中声明两个变量
private image As Image
private g As Graphics 

在窗体的load过程中初始化变量
image =  New Bitmap(300, 300, Imaging.PixelFormat.Format32bppArgb) 
g = Graphics.FromImage(image)

然后在Button中写下你的绘图代码
 g.DrawLine(New Pen(Color.Black), 0, 0, 200, 200)  '当然,每个按钮是不一样的绘图代码咯
 Me.PictureBox1.Image = image

就可以啦.这只是最基本的代码咯,如果你想更灵活点,就要多练习咯.

#6


ls的正解,就是将所绘图绘在image上。

#1


貌似没有VB6那个持续功能。。。。没看

方法倒是挺多的,可以在切换回来的时候,找到一个恰当的事件。。然后再次绘图。。。。

可以重载消息函数什么什么的绘图。。重载谁的就看你的爱好了。。。。

当然还有更简单的。。画一个容器进去。。。panel了,image什么什么的,然后在内存画你的图像,画好了放进去。。。

要是特别的情况,可以看看那个控件有没有背景图属性什么的,把画好的图像放进去。。。。

反正你就慢慢想吧,办法会有的……效率高的有,效率低下的也有。。。。。

#2


Dim image As New Bitmap(300, 300, Imaging.PixelFormat.Format32bppArgb)
        Dim g As Graphics = Graphics.FromImage(image)
        g.DrawLine(New Pen(Color.Black), 0, 0, 200, 200)
        Me.PictureBox1.Image = image
这段代码是可以自动重绘的

如果不想用
Me.PictureBox1.Image = image
那就在
Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        
    End Sub
这个事件中用 e.Graphics.DrawLine   ...

但如果用这种方式的时候,如果绘图的内容多的话,每paint一次,就重绘(计算)一次,会影响效果,建议用第一种。

#3


首先谢谢你的回复,但我想要的不是自动绘图,而是点一个button健后绘图,而且在对界面进行操作的时候图像不会丢失。用paint来绘图是可以不丢失的,非常不灵活。我想把一段代码放到button_click中,该怎么做那?也就是怎么让paint不要自动绘图,而是在点button后再绘图。

#4


而且我需要在一张picturebox或者groupbox内画多个图形,每点一个button画一个出来,如何才能实现那?

#5


赫赫上面说的第一种就不时自动绘图的啊,具体过程是
在窗体中声明两个变量
private image As Image
private g As Graphics 

在窗体的load过程中初始化变量
image =  New Bitmap(300, 300, Imaging.PixelFormat.Format32bppArgb) 
g = Graphics.FromImage(image)

然后在Button中写下你的绘图代码
 g.DrawLine(New Pen(Color.Black), 0, 0, 200, 200)  '当然,每个按钮是不一样的绘图代码咯
 Me.PictureBox1.Image = image

就可以啦.这只是最基本的代码咯,如果你想更灵活点,就要多练习咯.

#6


ls的正解,就是将所绘图绘在image上。