drawImage画图的问题

hnwl0507 2008-09-18 04:50:39
我采用drawImage画图时为保当图画出来后,你去去操作别的窗体或是打开另一个窗体后,当新的窗体在画出图的上面时你画出来的那个画上就会出现新窗体一样大的空白,也可是像是被擦去了一样,若在画上移动整个新窗体那么图就全擦去了,这不知是何因啊?那位高手是否遇到过?

还有就是在picturebox上进行不同的条件画出不同的图来,当条件平凡刷新时画出的图闪得历害,不知何解决?我的代码是:
Dim map As Image
map = Image.FromFile(Application.StartupPath & "\picture\" & path)
Dim Bmap As New Bitmap(map.Width, map.Height)
gmap = Graphics.FromImage(Bmap)
gmap.DrawImage(map, 0, 0, map.Width, map.Height)
PBGongChengImage.CreateGraphics.DrawImage(Bmap, 0, 0, map.Width, map.Height)
gmap.Dispose()
Bmap.Dispose()
...全文
161 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hnwl0507 2008-09-19
  • 打赏
  • 举报
回复
问题已经解决,我采用了楼上的LZ研究,二个问题同时解决了
cauhorse 2008-09-18
  • 打赏
  • 举报
回复
一种方法是:
随处画,重绘代码写在OnPaint()事件中,这样,一旦出现其它窗体覆盖、主窗体最小化后复原等引发窗体重绘的事件时,代码可以自动重绘你的图形,就不会消失了;当然,画在PictureBox内的图形,PictureBox会自动重绘,这样更方便一些。
如果消除闪烁,有方法介绍说使用“双缓冲”(DoubleBuffering),不过我以前没试出什么特别的效果,LZ可以再研究下。。
一个可行的办法就是:
把图形先画到bitmap中,比如先定义一个bitmap,
然后再在这个bitmap中画图,比如定义一个Graphics对象实例,在bitmap中画图;
最后,把这个处于内存中的bitmap作为BackGroundImage或者Image贴到一个PictureBox中(即为这个PictureBox指定BackGroundImage或者Image),
就行。
这种方法可以有效地解决闪烁的问题。
LZ可以试下。
cccccui 2008-09-18
  • 打赏
  • 举报
回复
点一下节点,刷新下窗体没什么吧......

我以前看过一程序,他还是不停的刷新窗体......
我也新人,不怎么懂....
hnwl0507 2008-09-18
  • 打赏
  • 举报
回复
楼上说的方法可以,但想想我是要平凡选择Treeview节点的,那这样每次都刷新次窗体这样对负担太大了。
cccccui 2008-09-18
  • 打赏
  • 举报
回复
那你在加句 刷新语句,,每次点treeview调用窗口刷新....
invalidate(不知道这样可不可以)
hnwl0507 2008-09-18
  • 打赏
  • 举报
回复
这样是否不行,虽然用全局变量改变bitmap值,但是你是点treeview中的节点来改变的,而这并没有使窗体重绘制,所以不会引发paint事件。
cccccui 2008-09-18
  • 打赏
  • 举报
回复
那只好把你要画的图定义成窗口内的公用变量,在Paint事件里调用这些变量来画了" 这句话是建立在下面那话的基础上的

他意思是 你定义个全局bitmap变量, paint 里调用画的图就是bitmap

当你选择其他图时,只改变bitmap 的值就可以了...

(刚多写了句话。 .)

cccccui 2008-09-18
  • 打赏
  • 举报
回复
"那只好把你要画的图定义成窗口内的公用变量,在Paint事件里调用这些变量来画了" 这句话是建立在下面那话的基础上的

他意思是 你定义个全局bitmap变量, paint 里调用画的图就是bitmap

当你选择其他图时,只改变bitmap 的值就可以了...

cccccui 2008-09-18
  • 打赏
  • 举报
回复
"那只好把你要画的图定义成窗口内的公用变量,在Paint事件里调用这些变量来画了" 这如何实现呢? 能否给个代码?


就是定义个全局变量 map
hnwl0507 2008-09-18
  • 打赏
  • 举报
回复
"那只好把你要画的图定义成窗口内的公用变量,在Paint事件里调用这些变量来画了" 这如何实现呢? 能否给个代码?
yanlongwuhui 2008-09-18
  • 打赏
  • 举报
回复
支持楼上的
oo渣渣oo 2008-09-18
  • 打赏
  • 举报
回复
那只好把你要画的图定义成窗口内的公用变量,在Paint事件里调用这些变量来画了
hnwl0507 2008-09-18
  • 打赏
  • 举报
回复
但是我的图是动态的,是过几秒后就要重绘的。比如说在TreeView中选择不同的节点在picturebox中画出不同的图来。
但picturebox又不能用image来源来显示(picturebox.image="..."),因为我还需要在其中再画一些小图标的。
oo渣渣oo 2008-09-18
  • 打赏
  • 举报
回复
第二个问题,你最好是先在内存里把图画好,再画到窗口上,也许能解决。不过没试过,给你一段代码参考一下:


p_Body_Rect = New Rectangle(p_Body_X, p_Body_Y, Me.Width - p_Body_X * 2, Me.Height - p_Body_Y - p_Body_Height_Offset)
p_Pict_Rect = New Bitmap(p_Body_Rect.Width, p_Body_Rect.Height)

'创建两个Graphics对象
p_Grap_Background = Me.CreateGraphics '这是最终显示画面的Graphics对象
p_Grap_Rect = Graphics.FromImage(p_Pict_Rect) '创建一个Graphics对象
p_Grap_Rect.DrawImage(p_Pict_Rect2, 0, 0, p_Body_Rect.Width, p_Body_Rect.Height) '在临时作画区画出背景
For I = 0 To tInfo.Length - 1
'在临时作画区画出文字
p_Grap_Rect.DrawString(strTmp, New Font(p_Body_Font, p_Body_Size), New SolidBrush(p_Body_Color), rect(I), fm)
Next
'在最终背景上画出结果
p_Grap_Background.DrawImage(p_Pict_Rect, p_Body_Rect.Location)
oo渣渣oo 2008-09-18
  • 打赏
  • 举报
回复
如果想窗口有变动时画出的图不被刷新掉,必须将画图的代码放在Form的Paint事件里


Private Sub frmMain_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Dim grap As Graphics = Me.CreateGraphics
grap.DrawImage ...
End Sub

16,549

社区成员

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

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