急!GDI+在VB2005中的重绘问题,高手请进。

AreZong 2007-12-16 04:44:23
我在窗体中放一PictureBox控件,然后在它上面绘图:

Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
Me.PictureBox1.Refresh()
End Sub

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)
End Sub

Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1_Draw.Paint
Dim g As Graphics = e.Graphics
sender.CreateGraphics().Clear(Color.Black)
g.DrawLine(System.Drawing.Pens.Red, 0, sender.Height / 2, sender.Width, sender.Height / 2)
End Sub

问题:
上面代码绘图没有问题,但当我用鼠标打开窗体的菜单覆盖了PictureBox1时,或当我切换到其它程式(如小画家),该程式覆盖了PictureBox1时,PicurtBox1中的所有已画的图都会给覆盖部份擦掉,不会自动恢复。

请问:
我该如何保持绘画?无论绘画区有没有被覆盖,只要已绘好的画就会象一幅图片一样保留着。

谢谢!!
...全文
154 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
niulei 2011-03-24
  • 打赏
  • 举报
回复
2楼正解!
AreZong 2007-12-19
  • 打赏
  • 举报
回复
To wzuomin :
不好意思,理解错了你的代码,原来就这么简单!
谢啦!
AreZong 2007-12-18
  • 打赏
  • 举报
回复
3天了,没有答案,期待VB的绘画高手指教。。。
wzuomin 2007-12-17
  • 打赏
  • 举报
回复

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.PictureBox1.Dock = DockStyle.Fill
Me.PictureBox1.BackColor = Color.Black
End Sub

Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
e.Graphics.Clear(Color.Black)
e.Graphics.DrawLine(Pens.Red, 0, 100, PictureBox1.Width, 100)
End Sub

End Class
AreZong 2007-12-17
  • 打赏
  • 举报
回复
楼上的 wzuomin ,
有什么高见啊?
AreZong 2007-12-16
  • 打赏
  • 举报
回复
楼上的,谢谢。
我把测试代码重新写过,如下,但还是不行啊。

你试着打开小画家(不要最大化,用小窗体),然后拖动小画家从PictureBox1上面慢慢地移过,你就知道了。
小画家会象粉笔擦一样擦掉PictureBox1上面的画。


Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.PictureBox1.Dock = DockStyle.Fill
Me.PictureBox1.BackColor = Color.Black
End Sub

Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
Me.PictureBox1.Refresh()
End Sub

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
Me.PictureBox1.Refresh()
End Sub

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)
End Sub

Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
Dim g As Graphics = e.Graphics
sender.CreateGraphics().Clear(Color.Black)
g.DrawLine(System.Drawing.Pens.Red, 0, 100, sender.Width, 100)
End Sub

End Class
lgx1972 2007-12-16
  • 打赏
  • 举报
回复
首先你的代码在VB2005下测试失败。
问题出在这句上面了:g.DrawLine(System.Drawing.Pens.Red, 0, sender.Height / 2, sender.Width, sender.Height / 2)

然后回答你的提问:
把:Me.PictureBox1.Refresh() 这语句放在 Form1_Paint里,而不是放在Form1_Activated里
问题就解决了!

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧