如何消除闪烁现象(用Panel1.CreateGraphics),请高手指点。谢谢

tanchengfang 2009-07-03 10:57:04
当我拖动Trackbar旋转(或缩放)图片时,会有闪烁现象,如何消除,Graphics不是用Me.CreateGraphics。谢谢
Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll
Dim g As Graphics
Dim bm As Bitmap
bm = New Bitmap("d:\00.jpg")
g = Panel1.CreateGraphics '不是用g=Me.CreateGraphics
g.TranslateTransform(Panel1.Width\2, Panel1.Height\2)
'一下两句二选一
'g.ScaleTransform(TrackBar1.Value)
g.RotateTransform(TrackBar1.Value)
g.Clear(Color.White)
'g.DrawImage(bm, -bm.Width \ 2, -bm.Height \ 2)
g.DrawImage(bm, 0, 0)

End Sub
...全文
463 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
tdyan 2010-10-16
  • 打赏
  • 举报
回复
在内存中创建image,把变化后的图像存在image中,再显示。
paxiti 2010-10-16
  • 打赏
  • 举报
回复
将panel控件换成picturebox控件,应该有效。我之前碰到一样的问题,研究了差不多半个月才解决。
ineedchrist 2009-07-09
  • 打赏
  • 举报
回复
以下是我用C#写的,解决旋转的时候不以中心点为轴心的问题,其中rotation是要旋转的角度,_symbol是一个bitmap,不会转VB。NET在说。

另外,解决完问题记得结帖。

double offsetX = pp.X - _symbol.Width / 2;
double offsetY = pp.Y - _symbol.Height / 2;
System.Drawing.Rectangle picRect = new System.Drawing.Rectangle((int)offsetX, (int)offsetY, (int)_symbol.Width, (int)_symbol.Height);
System.Drawing.PointF pCenter = new System.Drawing.PointF((Single)(picRect.X + picRect.Width / 2), (Single)(picRect.Y + picRect.Height / 2));
g.TranslateTransform(pCenter.X, pCenter.Y);
g.RotateTransform(rotation);
g.TranslateTransform(-pCenter.X, -pCenter.Y);
g.DrawImageUnscaled(_symbol, picRect);
g.Transform = startingTransform;

tanchengfang 2009-07-08
  • 打赏
  • 举报
回复
谢谢pjagz,有学了一招。谢谢啊
pjagz 2009-07-07
  • 打赏
  • 举报
回复
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
Call MySub()
End Sub

Private Sub MySub()
'绘图代码
End Sub

Private Sub TrackBar1_Scroll(ByVal sender As Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll

Call MySub()

End Sub
tanchengfang 2009-07-07
  • 打赏
  • 举报
回复
各位,运行程序后,最小化窗体后图片消失了,如何解决啊。
dylike 2009-07-06
  • 打赏
  • 举报
回复
约4万字代码的东西,我写了3天3夜的.
dylike 2009-07-06
  • 打赏
  • 举报
回复
我写了个DLL.可到我群共享里下载.只需要你添加几句代码即可实现你要的效果.保证不闪.
共享名:DYD.DLL
tanchengfang 2009-07-06
  • 打赏
  • 举报
回复
pjagz你好,这样做的话,图片是沿图片的左上角旋转。能不能让图片沿着图片自身的中点旋转啊?如何做呢?谢谢
tanchengfang 2009-07-06
  • 打赏
  • 举报
回复
谢谢各位了。
dylike你好,如果用分层技术,如果实现呢?能给我例子吗?谢谢
pjagz 2009-07-05
  • 打赏
  • 举报
回复
Private Sub TrackBar1_Scroll(ByVal sender As Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll

Dim g As Graphics
Dim bm As New Bitmap(Panel1.Width, Panel1.Height)
Dim grph As Graphics = Graphics.FromImage(bm)
grph.Clear(Color.White)
grph.TranslateTransform(0, 0)
grph.RotateTransform(TrackBar1.Value)
grph.DrawImage(Image.FromFile("E:\temp\2.jpg"), 0, 0)

g = Panel1.CreateGraphics
g.DrawImage(bm, 0, 0)

End Sub
dylike 2009-07-05
  • 打赏
  • 举报
回复
1 开启窗体双缓冲,明显改善,但由于使用TrackBar这种高速变化值的东西来控制,不闪不可能
优点:几乎不用添加更多代码
缺点:改善很多,但并不会彻底消除闪屏现象

2 用分层技术,处理操作过程
优点:百分百不闪,如同游戏画面一样
缺点:代码量超多,不适合新手
pjagz 2009-07-05
  • 打赏
  • 举报
回复

' TrackBar1.Maximum = 100
' TrackBar1.Minimum = 1
' TrackBar1.LargeChange = 1
'缩放
grph.ScaleTransform(TrackBar1.Value * 0.01, TrackBar1.Value * 0.01)
沐NeMo 2009-07-04
  • 打赏
  • 举报
回复
可以去参考:双重缓冲技术。
http://space.itpub.net/14325734/viewspace-416221

16,554

社区成员

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

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