代码改变世界

大图像移动时的闪动解决方案[原创]

2006-10-18 09:54  老博客哈  阅读(1317)  评论(3编辑  收藏  举报
暑假的时候yangmin和我讨论了一个问题, 就是如何实现像GoogleEarth那样, 鼠标移动图片的时候很平滑。详细观察之后, 才知道它用了DX, OpenGl的**技术。心有不甘,决定用Gdi+来试试。
我是在Form上放置了一个PictureBox, 然后进行移动。 刚开始的时候我是用整个图来画的, 发现当图片大到一个程度之后就可以闪了,尽管PictureBox有一个双缓冲。。。后来仔细想想, 其实完全可以在图片移动的过程中仅仅绘制一部分,也就是ClientSize的那一块, 试验了一下 , 效果果然不错。(在图片巨大无比的时候, 内存会上涨到250M,这个时候拖动的平滑感就欠缺一点了)
核心代码如下:
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        
{
            
            
if (e.Button == MouseButtons.Left)
            
{
                
//移动处理
                if (!isLeftCtrlKeyDown)
                
{
                    offset.Width 
+= e.X - mousePressPoint.X;
                    offset.Height 
+= e.Y - mousePressPoint.Y;
                    mousePressPoint 
= e.Location;
                    Bitmap newbmp 
= new Bitmap(this.ClientSize.Width, this.ClientSize.Height);
                    Graphics g 
= Graphics.FromImage(newbmp);
                    
//重绘一小段图片
                    g.DrawImage(bmp, new Rectangle(00this.ClientSize.Width, this.ClientSize.Height),
                        
-offset.Width, -offset.Height, this.ClientSize.Width, this.ClientSize.Height, GraphicsUnit.Pixel);
                    pictureBox1.Image 
= newbmp;
                    pictureBox1.Refresh();                   
                }

                
else
                
{
                    
//放大缩小处理
                    int width = bmp.Width + pictureBox1.Location.X + e.X - mousePressPoint.X;
                    
int height = bmp.Height + pictureBox1.Location.Y + e.Y - mousePressPoint.Y;
                    
if (width > 0 && height > 0)
                    
{
                        bmp 
= new Bitmap(bmp, new Size(width, height));
                        pictureBox1.Image 
= bmp;
                        pictureBox1.Refresh();
                    }

                }

                
            }

        }