C#版一棵开花的树(艺术与技术的结合)[附源码下载]

时间:2022-08-26 21:28:33
首先声明,这个不是本人原创,是在VC/MFC板块看到别人移植到MFC,我用C#包装了一下下,挺有意思
原帖地址
http://topic.csdn.net/u/20120411/12/792B7B0C-FB57-4E5C-9CAB-0A1595679D40.html

效果如下
C#版一棵开花的树(艺术与技术的结合)[附源码下载]

C#版一棵开花的树(艺术与技术的结合)[附源码下载]


源码下载
http://download.csdn.net/detail/mngzilin/4222149

68 个解决方案

#1


该回复于2012-04-13 09:56:02被版主删除

#2


呵呵 支持!

#3


很漂亮 ...

#4


不错不错

#5


呵呵 支持!

#6


下载还要积分呀。。。

#7


楼主把积分给去了吧

#8


2分?!!!!!!!!楼主把积分给去了吧

#9


骗子! 大家别下。 只是一张张图片拼接  擦了

#10


我看错了,额,当我没说 

#11


不地道下载要积分

#13


引用 9 楼  的回复:
骗子! 大家别下。 只是一张张图片拼接 擦了
= =   没什么效果啊  的确是一张张图片拼出来的

#14


很好,2分值得,说是拼接的请自己下载了看看

#15


引用 7 楼  的回复:
楼主把积分给去了吧


怎么把积分去掉呢?指点下

#16


引用 9 楼  的回复:
骗子! 大家别下。 只是一张张图片拼接  擦了


哎,你如果了解双缓存的话,就不会这么说了

#17


引用 13 楼  的回复:
引用 9 楼  的回复:
骗子! 大家别下。 只是一张张图片拼接 擦了
= =   没什么效果啊  的确是一张张图片拼出来的


无语了~~~,里面的Image是为了双缓存而存在的,并不是拼接的,如果你学过用C/C++开发过Form程序的话就不会有这种理解了,哎

#18


对待lz这样的高人,我只能仰望, C#版一棵开花的树(艺术与技术的结合)[附源码下载]

#19


鼠标点击下,可以随机生成一棵新的开花树

#20


昨天看到C++版的,今天马上就看到了C#版 楼主强大!

#21


该回复于2016-12-31 23:58:15被版主删除

#22


C#版一棵开花的树(艺术与技术的结合)[附源码下载]

#23


我也想写的。被楼主抢了。

#24


这个应该推荐。

#25


楼主写的不错哦,感谢分享。

#26


http://topic.csdn.net/u/20120411/12/792B7B0C-FB57-4E5C-9CAB-0A1595679D40.html

#27


不管怎样,还是觉得美得没话说。

#28


树挺漂亮的,赞!!

#29


verygood

#30


C#?  那我把她改装下  嘿嘿

#31


做的不错呀,求代码

#32


C#版一棵开花的树(艺术与技术的结合)[附源码下载]

#33


想起了9年前我的女朋友给我演奏的《玉树后庭花》

#34


呵。。我不懂C#,不懂双缓存,看不出来,不过不知道这算不算一个BUG,先用显示桌面功能把所小桌面最小化后,再通过任务栏的那个form1激活这个窗口的话,激活出现的窗口会出现白屏,不知道是不是窗口重绘的部会出了问题还是做这一步的时候没有窗口更新的数据发送到窗口,呵。。。不懂。。。
用的是C#版FlowerTree\FlowerTree\obj\Debug目录中的那个EXE文件。。

#35


引用 34 楼  的回复:
呵。。我不懂C#,不懂双缓存,看不出来,不过不知道这算不算一个BUG,先用显示桌面功能把所小桌面最小化后,再通过任务栏的那个form1激活这个窗口的话,激活出现的窗口会出现白屏,不知道是不是窗口重绘的部会出了问题还是做这一步的时候没有窗口更新的数据发送到窗口,呵。。。不懂。。。
用的是C#版FlowerTree\FlowerTree\obj\Debug目录中的那个EXE文件。。

忘了说了,系统是XP-sp3的!嘿。。。

#36


引用 34 楼  的回复:
呵。。我不懂C#,不懂双缓存,看不出来,不过不知道这算不算一个BUG,先用显示桌面功能把所小桌面最小化后,再通过任务栏的那个form1激活这个窗口的话,激活出现的窗口会出现白屏,不知道是不是窗口重绘的部会出了问题还是做这一步的时候没有窗口更新的数据发送到窗口,呵。。。不懂。。。
用的是C#版FlowerTree\FlowerTree\obj\Debug目录中的那个EXE文件。。


这的的确是一个bug,不过可以小小修改下:

        private void pictureBox1_Resize(object sender, EventArgs e)
        {
            if (this.WindowState != FormWindowState.Minimized)//加上这个判断
            {
                if (img != null)
                {
                    Image img2 = new Bitmap(this.Width, this.Height);
                    Graphics g = Graphics.FromImage(img2);
                    g.FillRectangle(Brushes.White, 0, 0, img2.Width, img2.Height);
                    g.DrawImage(img, new Point(0, 0));
                    g.Dispose();

                    img.Dispose();

                    img = img2;
                }
            }
        }

#37


进来学习下~

#38


这个应该推荐。

#39


支持一下

#40


MARK。。正好学习重绘

#41


该回复于2016-01-31 23:18:04被版主删除

#42


每天回帖即可获得10分可用分

#43


还有C#版本 ^_^

#44


呵呵  下了 学习了

#45


不错,谢谢分享

#46


引用 36 楼  的回复:
引用 34 楼  的回复:

呵。。我不懂C#,不懂双缓存,看不出来,不过不知道这算不算一个BUG,先用显示桌面功能把所小桌面最小化后,再通过任务栏的那个form1激活这个窗口的话,激活出现的窗口会出现白屏,不知道是不是窗口重绘的部会出了问题还是做这一步的时候没有窗口更新的数据发送到窗口,呵。。。不懂。。。
用的是C#版FlowerTree\FlowerTree\obj\Debug目录中的……


有个地方不明白。vc里讲双缓冲。是绘制大图时,会绘制的比较慢。而使用内存copy的方式。
虽然都是把一些信息临时绘制到一个bitmap。
但不是使用drawimage再画一次。
drawimage与内存copy还是相差很多的。


#47


1.那楼上可以调用bitblt了,如果你不绘制到缓存画布上,当我没有要求重新生成这棵树,但是每次刷新都会重新把旧的树重新绘制一次,然后再重新调用窗体或者picturebox的graphic重新绘制到窗体上,是不是浪费计算时间。
2.如果有了缓存画布,刷新时候只需要直接把布上已经有的东直接西画到窗体上面,是不是省掉了绘制时间?
3.如果这棵树我要生成的枝叶很多,很茂盛,不缓存画布,等绘制完成是不是要很多时间,容易闪屏

#48


46楼还有几个误区,那就是:

1.不是只有绘制大图的时候才用到双缓存,而是在绘制过程中,进行了耗费时间的计算导致绘制区域出现会明显的延迟,尤其是在绘制开始后进行invalidate操作的,有时候清屏invalidate是必须的。即使没有调用invalidate,在onpaint里面为了防止图像出现重叠,总是会调用类似g.Clear功能的操作。这时候如果你再clear后的一段时间内没有完成绘制操作,用户会感觉到明显的闪屏。

2.如果你用了缓存画布,所有的clear、计算和绘制操作是在缓存画布上操作的,并不呈现给用户,只在最后时间绘制到界面上,绘制过程耗时可以忽略,用户完全察觉不到。

3.双缓存是一种思想方式,不存在具体要求,所以“vc里面使用内存copy的方式”是错误的。因为他的重点是“一次性绘制时间远远比便计算边绘制短”。



#49


还有一个很有意思的现象:

当用户直接重写form_paint调用e.graphic,或者调用form的graphic.fromhandle(this.handle)直接绘图时候会发现闪屏。当用户在form上覆盖一个picturebox并且设置其背景透明后,会发现一个很奇怪的现象,form重绘时候不会闪屏了,为什么呢?

------------------

其实form的cleint区域充当了缓存画布,picturebox最总呈现给用户显示。在form没有重绘完成前,picturebox用旧的图像忽悠了用户的眼球。

#50


引用 48 楼  的回复:
46楼还有几个误区,那就是:

1.不是只有绘制大图的时候才用到双缓存,而是在绘制过程中,进行了耗费时间的计算导致绘制区域出现会明显的延迟,尤其是在绘制开始后进行invalidate操作的,有时候清屏invalidate是必须的。即使没有调用invalidate,在onpaint里面为了防止图像出现重叠,总是会调用类似g.Clear功能的操作。这时候如果你再clear后的一段时间内没有完成绘……

你的意思我明白。
控件类都双缓冲这个style。只是不清楚的是,你的这种把内容画在一个临时的bmp上。是不是重复了。我的理解如果设置了这个style 系统内部应该也是用了这样的一个机制。自己不甚清楚我的理解是否正确?

#1


该回复于2012-04-13 09:56:02被版主删除

#2


呵呵 支持!

#3


很漂亮 ...

#4


不错不错

#5


呵呵 支持!

#6


下载还要积分呀。。。

#7


楼主把积分给去了吧

#8


2分?!!!!!!!!楼主把积分给去了吧

#9


骗子! 大家别下。 只是一张张图片拼接  擦了

#10


我看错了,额,当我没说 

#11


不地道下载要积分

#12


#13


引用 9 楼  的回复:
骗子! 大家别下。 只是一张张图片拼接 擦了
= =   没什么效果啊  的确是一张张图片拼出来的

#14


很好,2分值得,说是拼接的请自己下载了看看

#15


引用 7 楼  的回复:
楼主把积分给去了吧


怎么把积分去掉呢?指点下

#16


引用 9 楼  的回复:
骗子! 大家别下。 只是一张张图片拼接  擦了


哎,你如果了解双缓存的话,就不会这么说了

#17


引用 13 楼  的回复:
引用 9 楼  的回复:
骗子! 大家别下。 只是一张张图片拼接 擦了
= =   没什么效果啊  的确是一张张图片拼出来的


无语了~~~,里面的Image是为了双缓存而存在的,并不是拼接的,如果你学过用C/C++开发过Form程序的话就不会有这种理解了,哎

#18


对待lz这样的高人,我只能仰望, C#版一棵开花的树(艺术与技术的结合)[附源码下载]

#19


鼠标点击下,可以随机生成一棵新的开花树

#20


昨天看到C++版的,今天马上就看到了C#版 楼主强大!

#21


该回复于2016-12-31 23:58:15被版主删除

#22


C#版一棵开花的树(艺术与技术的结合)[附源码下载]

#23


我也想写的。被楼主抢了。

#24


这个应该推荐。

#25


楼主写的不错哦,感谢分享。

#26


http://topic.csdn.net/u/20120411/12/792B7B0C-FB57-4E5C-9CAB-0A1595679D40.html

#27


不管怎样,还是觉得美得没话说。

#28


树挺漂亮的,赞!!

#29


verygood

#30


C#?  那我把她改装下  嘿嘿

#31


做的不错呀,求代码

#32


C#版一棵开花的树(艺术与技术的结合)[附源码下载]

#33


想起了9年前我的女朋友给我演奏的《玉树后庭花》

#34


呵。。我不懂C#,不懂双缓存,看不出来,不过不知道这算不算一个BUG,先用显示桌面功能把所小桌面最小化后,再通过任务栏的那个form1激活这个窗口的话,激活出现的窗口会出现白屏,不知道是不是窗口重绘的部会出了问题还是做这一步的时候没有窗口更新的数据发送到窗口,呵。。。不懂。。。
用的是C#版FlowerTree\FlowerTree\obj\Debug目录中的那个EXE文件。。

#35


引用 34 楼  的回复:
呵。。我不懂C#,不懂双缓存,看不出来,不过不知道这算不算一个BUG,先用显示桌面功能把所小桌面最小化后,再通过任务栏的那个form1激活这个窗口的话,激活出现的窗口会出现白屏,不知道是不是窗口重绘的部会出了问题还是做这一步的时候没有窗口更新的数据发送到窗口,呵。。。不懂。。。
用的是C#版FlowerTree\FlowerTree\obj\Debug目录中的那个EXE文件。。

忘了说了,系统是XP-sp3的!嘿。。。

#36


引用 34 楼  的回复:
呵。。我不懂C#,不懂双缓存,看不出来,不过不知道这算不算一个BUG,先用显示桌面功能把所小桌面最小化后,再通过任务栏的那个form1激活这个窗口的话,激活出现的窗口会出现白屏,不知道是不是窗口重绘的部会出了问题还是做这一步的时候没有窗口更新的数据发送到窗口,呵。。。不懂。。。
用的是C#版FlowerTree\FlowerTree\obj\Debug目录中的那个EXE文件。。


这的的确是一个bug,不过可以小小修改下:

        private void pictureBox1_Resize(object sender, EventArgs e)
        {
            if (this.WindowState != FormWindowState.Minimized)//加上这个判断
            {
                if (img != null)
                {
                    Image img2 = new Bitmap(this.Width, this.Height);
                    Graphics g = Graphics.FromImage(img2);
                    g.FillRectangle(Brushes.White, 0, 0, img2.Width, img2.Height);
                    g.DrawImage(img, new Point(0, 0));
                    g.Dispose();

                    img.Dispose();

                    img = img2;
                }
            }
        }

#37


进来学习下~

#38


这个应该推荐。

#39


支持一下

#40


MARK。。正好学习重绘

#41


该回复于2016-01-31 23:18:04被版主删除

#42


每天回帖即可获得10分可用分

#43


还有C#版本 ^_^

#44


呵呵  下了 学习了

#45


不错,谢谢分享

#46


引用 36 楼  的回复:
引用 34 楼  的回复:

呵。。我不懂C#,不懂双缓存,看不出来,不过不知道这算不算一个BUG,先用显示桌面功能把所小桌面最小化后,再通过任务栏的那个form1激活这个窗口的话,激活出现的窗口会出现白屏,不知道是不是窗口重绘的部会出了问题还是做这一步的时候没有窗口更新的数据发送到窗口,呵。。。不懂。。。
用的是C#版FlowerTree\FlowerTree\obj\Debug目录中的……


有个地方不明白。vc里讲双缓冲。是绘制大图时,会绘制的比较慢。而使用内存copy的方式。
虽然都是把一些信息临时绘制到一个bitmap。
但不是使用drawimage再画一次。
drawimage与内存copy还是相差很多的。


#47


1.那楼上可以调用bitblt了,如果你不绘制到缓存画布上,当我没有要求重新生成这棵树,但是每次刷新都会重新把旧的树重新绘制一次,然后再重新调用窗体或者picturebox的graphic重新绘制到窗体上,是不是浪费计算时间。
2.如果有了缓存画布,刷新时候只需要直接把布上已经有的东直接西画到窗体上面,是不是省掉了绘制时间?
3.如果这棵树我要生成的枝叶很多,很茂盛,不缓存画布,等绘制完成是不是要很多时间,容易闪屏

#48


46楼还有几个误区,那就是:

1.不是只有绘制大图的时候才用到双缓存,而是在绘制过程中,进行了耗费时间的计算导致绘制区域出现会明显的延迟,尤其是在绘制开始后进行invalidate操作的,有时候清屏invalidate是必须的。即使没有调用invalidate,在onpaint里面为了防止图像出现重叠,总是会调用类似g.Clear功能的操作。这时候如果你再clear后的一段时间内没有完成绘制操作,用户会感觉到明显的闪屏。

2.如果你用了缓存画布,所有的clear、计算和绘制操作是在缓存画布上操作的,并不呈现给用户,只在最后时间绘制到界面上,绘制过程耗时可以忽略,用户完全察觉不到。

3.双缓存是一种思想方式,不存在具体要求,所以“vc里面使用内存copy的方式”是错误的。因为他的重点是“一次性绘制时间远远比便计算边绘制短”。



#49


还有一个很有意思的现象:

当用户直接重写form_paint调用e.graphic,或者调用form的graphic.fromhandle(this.handle)直接绘图时候会发现闪屏。当用户在form上覆盖一个picturebox并且设置其背景透明后,会发现一个很奇怪的现象,form重绘时候不会闪屏了,为什么呢?

------------------

其实form的cleint区域充当了缓存画布,picturebox最总呈现给用户显示。在form没有重绘完成前,picturebox用旧的图像忽悠了用户的眼球。

#50


引用 48 楼  的回复:
46楼还有几个误区,那就是:

1.不是只有绘制大图的时候才用到双缓存,而是在绘制过程中,进行了耗费时间的计算导致绘制区域出现会明显的延迟,尤其是在绘制开始后进行invalidate操作的,有时候清屏invalidate是必须的。即使没有调用invalidate,在onpaint里面为了防止图像出现重叠,总是会调用类似g.Clear功能的操作。这时候如果你再clear后的一段时间内没有完成绘……

你的意思我明白。
控件类都双缓冲这个style。只是不清楚的是,你的这种把内容画在一个临时的bmp上。是不是重复了。我的理解如果设置了这个style 系统内部应该也是用了这样的一个机制。自己不甚清楚我的理解是否正确?