| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 917 人关注过本帖
标题:百叶窗,卷动,积木效果,世界之窗,双缓冲技术
取消只看楼主 加入收藏
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
结帖率:80.91%
收藏
 问题点数:0 回复次数:0 
百叶窗,卷动,积木效果,世界之窗,双缓冲技术
程序代码:
using System;
using System.Collections.Generic;
using using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace 图形动画
...{
    public partial class Form1 : Form
    ...{
        public Form1()
        ...{
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        ...{
            this.Left = 0;
            this.Width = Screen.AllScreens[0].WorkingArea.Width;
            pictureBox1.Left = this.Width - pictureBox1.Width;
            this.Height = pictureBox1.Height + 19;

        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        ...{

        }
        //从左到右拉伸显示
        int iWidth; //图像宽度   
        int iHeight; //图像高度
        //取得Graphics对象
        Graphics g;
        Image image;
        private void myCreateGraphics()
        ...{
            iWidth = this.pictureBox1.Width; //图像宽度   
            iHeight = this.pictureBox1.Height; //图像高度
            //取得Graphics对象
            g = this.pictureBox1.CreateGraphics();

            g.Clear(Color.Gray); //初始为全灰色
        }
        Graphics Coverg;//界面
        private void mynewCreateGraphics()
        ...{
            iWidth = this.pictureBox1.Width; //图像宽度   
            iHeight = this.pictureBox1.Height; //图像高度
            //取得Graphics对象

            image = new Bitmap(iWidth, iHeight);
            g = Graphics.FromImage(image);
            Coverg = this.CreateGraphics();
        }


        private void button1_Click(object sender, EventArgs e)
        ...{
            //从左到右拉伸显示
            myCreateGraphics();
            for (int x = 0; x <= iWidth; x = x + 2)
            ...{
                g.DrawImage(pictureBox1.Image, 0, 0, x, iHeight);

                //Application.DoEvents();               

            }
        }

        private void button2_Click(object sender, EventArgs e)
        ...{
            //从上到下拉伸显示
            myCreateGraphics();
            for (int y = 0; y <= iHeight; y = y + 2)
            ...{
                g.DrawImage(pictureBox1.Image, 0, 0, iWidth, y);
            }


        }

        private void button3_Click(object sender, EventArgs e)
        ...{
            //四周扩散显示
            myCreateGraphics();
            for (int x = 0; x <= iWidth / 2; x = x + 2)
            ...{
                int y = (int)((iHeight * x / iWidth));
                Rectangle DestRect = new Rectangle(iWidth / 2 - x,
                    iHeight / 2 - y, 2 * x, 2 * y);
                Rectangle SrcRect = new Rectangle(0, 0,
                    pictureBox1.Width, pictureBox1.Height);
                g.DrawImage(pictureBox1.Image, DestRect, SrcRect,
                    GraphicsUnit.Pixel);

            }
        }

        private void button4_Click(object sender, EventArgs e)
        ...{
            //反转图像
            myCreateGraphics();
            for (int x = -iWidth / 2; x <= iWidth / 2; x = x + 2)
            ...{
                int y = (int)((iHeight * x / iWidth));
                Rectangle DestRect = new Rectangle(0, iHeight / 2 - y,
                    iWidth, 2 * y);
                Rectangle SrcRect = new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height);
                g.DrawImage(pictureBox1.Image, DestRect, SrcRect, GraphicsUnit.Pixel);
            }
        }

        private void button5_Click(object sender, EventArgs e)
        ...{
            //两边拉伸显示
            myCreateGraphics();
            for (int y = 0; y <= iWidth / 2; y++)
            ...{
                Rectangle DestRect = new Rectangle(iWidth / 2 - y, 0,
                    2 * y, iHeight);
                Rectangle SrcRect = new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height);
                g.DrawImage(pictureBox1.Image, DestRect, SrcRect, GraphicsUnit.Pixel);
            }

        }

        private void button6_Click(object sender, EventArgs e)
        ...{
            //上下对接显示
            myCreateGraphics();

            int x = 0;
            while (x <= iHeight / 2)
            ...{
                Rectangle SrcRect = new Rectangle(0, x, iWidth, 1);
                g.DrawImage(pictureBox1.Image, 0, x, SrcRect, GraphicsUnit.Pixel);
                SrcRect = new Rectangle(0, iHeight - x, iWidth, 1);
                g.DrawImage(pictureBox1.Image, 0, iHeight - x, SrcRect, GraphicsUnit.Pixel);
                x++;
            }

        }

        private void button7_Click(object sender, EventArgs e)
        ...{
            //左右对接
            myCreateGraphics();

            int x = 0;
            while (x <= iWidth / 2)
            ...{
                Rectangle SrcRect = new Rectangle(x, 0, 1, iHeight);
                g.DrawImage(pictureBox1.Image, x, 0, SrcRect, GraphicsUnit.Pixel);
                SrcRect = new Rectangle(iWidth - x, 0, 1, iHeight);
                g.DrawImage(pictureBox1.Image, iWidth - x, 0, SrcRect, GraphicsUnit.Pixel);
                x++;
            }

        }

        private void button8_Click(object sender, EventArgs e)
        ...{
            int i = 0, j;
            //垂直交错
            myCreateGraphics();
            Rectangle SrcRect;
            while (i <= iHeight)
            ...{
                j = i;
                while (j > 0)
                ...{
                    SrcRect = new Rectangle(0, j - 1, iWidth, 4);
                    g.DrawImage(pictureBox1.Image, 0, j - 1, SrcRect, GraphicsUnit.Pixel);
                    SrcRect = new Rectangle(0, iHeight - j, iWidth, 4);
                    g.DrawImage(pictureBox1.Image, 0, iHeight - j, SrcRect, GraphicsUnit.Pixel);
                    j = j - 5;
                }
                i = i + 5;
            }


        }

        private void button9_Click(object sender, EventArgs e)
        ...{
            myCreateGraphics();
            int xgroup = 24;
            int xcount = iWidth / xgroup;
            Rectangle SrcRect;

            for (int i = 0; i < xcount; i++)
                for (int j = 0; j < xgroup; j++)
                ...{
                    SrcRect = new Rectangle(xcount * j + i - 1, 0, 1,
                        iHeight);
                    g.DrawImage(pictureBox1.Image, xcount * j + i - 1, 0, SrcRect, GraphicsUnit.Pixel);
                    //Application.DoEvents();
                }

        }

        private void pictureBox1_Click(object sender, EventArgs e)
        ...{

        }

        private void button10_Click(object sender, EventArgs e)
        ...{
            myCreateGraphics();
            int i = iHeight;
            int k = 60;
            Rectangle SrcRect;
            while (i > 0)
            ...{
                for (int j = k; j <= i; j = j + 3)
                ...{
                    SrcRect = new Rectangle(0, j - k, iWidth, k);
                    Rectangle DestRect = new Rectangle(0, i - k, iWidth, k);
                    g.DrawImage(pictureBox1.Image, DestRect, SrcRect, GraphicsUnit.Pixel);

                }

                i = i - k;
            }

        }
       
        private void copygline(Bitmap g, Bitmap image, int x1, int y1, int x2, int y2, int step)
        ...{
           //by 闫磊 Email:Landgis@,yanleigis@ 2007.10.18
            int xdelta = x2 - x1;
            int ydelta = y2 - y1;
            int xstep, ystep;
            //Rectangle SrcRect;

            if (xdelta < 0)
            ...{

                xdelta = -xdelta;
                xstep = -step;
            }

            else
                xstep = step;
            if (ydelta < 0)
            ...{
                ydelta = -ydelta;
                ystep = -step;
            }

            else
                ystep = step;
            int change;
            if (xdelta > ydelta)
            ...{
                change = xdelta / 2;
                while (x1 != x2)
                ...{
                    //SrcRect = new Rectangle(x1, y1, step, step);
                    g.SetPixel(x1, y1, image.GetPixel(x1, y1));
                    //g.DrawImage(image, x1, y1, SrcRect, GraphicsUnit.Pixel);
                    //dest.Pixels[x1, y1] := src.Pixels[x1, y1];
                    x1 = x1 + xstep;
                    change = change + ydelta;
                    if (change > xdelta)
                    ...{
                        y1 = y1 + ystep;
                        change = change - xdelta;
                    }

                }

            }

            else
            ...{
                change = ydelta / 2;
                while (y1 != y2)
                ...{
                    g.SetPixel(x1, y1, image.GetPixel(x1, y1));
                    //SrcRect = new Rectangle(x1, y1, step, step);
                    //g.DrawImage(image, x1, y1, SrcRect, GraphicsUnit.Pixel);
                    //dest.Pixels[x1, y1] = src.Pixels[x1, y1];
                    y1 = y1 + ystep;
                    change = change + xdelta;
                    if (change > ydelta)
                    ...{
                        x1 = x1 + xstep;
                        change = change - ydelta;
                    }
                }
            }
        }
        /**//*

        private void copygline(Graphics g, Image image, int x1, int y1, int x2, int y2, int step)
        {
            int xdelta = x2 - x1;
            int ydelta = y2 - y1;
            int xstep, ystep;
            Rectangle SrcRect;

            if (xdelta < 0)
            {

                xdelta = -xdelta;
                xstep = -step;
            }

            else
                xstep = step;
            if (ydelta < 0)
            {
                ydelta = -ydelta;
                ystep = -step;
            }

            else
                ystep = step;
            int change;
            if (xdelta > ydelta)
            {
                change = xdelta / 2;
                while (x1 != x2)
                {
                    SrcRect = new Rectangle(x1, y1, step, step);
                    g.DrawImage(image, x1, y1, SrcRect, GraphicsUnit.Pixel);
                    //dest.Pixels[x1, y1] := src.Pixels[x1, y1];
                    x1 = x1 + xstep;
                    change = change + ydelta;
                    if (change > xdelta)
                    {
                        y1 = y1 + ystep;
                        change = change - xdelta;
                    }

                }

            }

            else
            {
                change = ydelta / 2;
                while (y1 != y2)
                {
                    SrcRect = new Rectangle(x1, y1, step, step);
                    g.DrawImage(image, x1, y1, SrcRect, GraphicsUnit.Pixel);
                    //dest.Pixels[x1, y1] = src.Pixels[x1, y1];
                    y1 = y1 + ystep;
                    change = change + xdelta;
                    if (change > ydelta)
                    {
                        x1 = x1 + xstep;
                        change = change - ydelta;
                    }
                }
            }
        }
        */
        private void button11_Click(object sender, EventArgs e)
        ...{
            myCreateGraphics();
            int speed = 15;
            Rectangle SrcRect, DestRect;
            for (int i = 0; i < iHeight; i++)
            ...{
                if (i <= iHeight - speed)
                ...{
                    for (int j = 1; j < speed - 1; j++)
                    ...{
                        SrcRect = new Rectangle(0, i + 10 - j, iWidth, 1);
                        DestRect = new Rectangle(0, i + j, iWidth, 1);
                        g.DrawImage(pictureBox1.Image, DestRect, SrcRect, GraphicsUnit.Pixel);


                    }
                }
                SrcRect = new Rectangle(0, i, iWidth, 1);
                g.DrawImage(pictureBox1.Image, 0, i, SrcRect, GraphicsUnit.Pixel);



            }
        }

        private void button12_Click(object sender, EventArgs e)
        ...{
            int step = 1;
            mynewCreateGraphics();
            iWidth = iWidth - 2;
            iHeight = iHeight - 2;

            for (int r = 1; r < iWidth; r = r + step)
            ...{
                /**//* copygline(g, pictureBox1.Image, iWidth - r, 0, iWidth, r * 3 / 4,step);               
                 copygline(g, pictureBox1.Image, 0, iHeight - r * 3 / 4, r, iHeight,step);
                 copygline(g, pictureBox1.Image, 0, r * 3 / 4, r, 0,step);
                 copygline(g,  pictureBox1.Image, iWidth - r, iHeight, iWidth, iHeight - r * 3 / 4,step);*/
                copygline((Bitmap)image, (Bitmap)pictureBox1.Image, iWidth - r, 0, iWidth, r * 3 / 4, step);
                copygline((Bitmap)image, (Bitmap)pictureBox1.Image, 0, iHeight - r * 3 / 4, r, iHeight, step);
                copygline((Bitmap)image, (Bitmap)pictureBox1.Image, 0, r * 3 / 4, r, 0, step);
                copygline((Bitmap)image, (Bitmap)pictureBox1.Image, iWidth - r, iHeight, iWidth, iHeight - r * 3 / 4, step);

                 if (r == r / 10 * 10)
                    Coverg.DrawImage(image, 0, 0);



            }
            //this.CreateGraphics().DrawImage(image, 0, 0);

        }


    }
}


实现双缓冲的具体步骤

我再来详细解释一下刚才实现双缓冲的具体步骤:

1、在内存中建立一块“虚拟画布”:

Bitmap bmp = new Bitmap(600, 600);

2、获取这块内存画布的Graphics引用:

Graphics g = Graphics.FromImage(bmp);

3、在这块内存画布上绘图:

g.FillEllipse(brush, i * 10, j * 10, 10, 10);

4、将内存画布画到窗口中

this.CreateGraphics().DrawImage(bmp, 0, 0);




搜索更多相关主题的帖子: 世界之窗 百叶窗 积木 效果 技术 
2010-11-25 11:11
快速回复:百叶窗,卷动,积木效果,世界之窗,双缓冲技术
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.055141 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved