C#对MDI容器的雪效果

时间:2016-12-22 16:25:40

标签: c# winforms

我将表单设置为IsMdiContainer的{​​{1}}属性。

我正试图让它在容器中“下雪”。

我正在尝试调整一个在普通true上运行良好但在WinForms容器上效果不佳的代码。这就是我设法做的事情:

MDI

public partial class SnowTest : Form { int num; int[] x; int[] y; int[] v; int[] s; Random random = new Random(); System.Drawing.Graphics graphics; Rectangle rectangle; private MdiClient MDIContainer; private Graphics asd; public SnowTest() { InitializeComponent(); } private void SnowTest_Load(object sender, EventArgs e) { SelectMdiContainer(); this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); this.UpdateStyles(); snow(); Timer1.Start(); } private void SelectMdiContainer() { foreach (Control control in this.Controls) { // #2 MdiClient client = control as MdiClient; if (!(client == null)) { MDIContainer = client; break; } } } private void snow() { num = 2000; x = new int[num]; y = new int[num]; v = new int[num]; s = new int[num]; int i = 0; for (i = 0; i <= num - 1; i++) { Insnow(i); } } private void Insnow(int i) { x[i] = random.Next(0, this.Width - 1); y[i] = random.Next(0, this.Height * 5 / 7); v[i] = random.Next(5, 20); s[i] = (random.Next(1, 3) * 100 + random.Next(50, 200)) / 100; } private void Timer1_Tick(object sender, EventArgs e) { for (int i = 0; i <= num - 1; i++) { y[i] = y[i] + v[i]; if (y[i] >= this.Height) { Insnow(i); } } Invalidate(); SnowOnContainer(); } private void SnowOnContainer() { graphics = MDIContainer.CreateGraphics();; int i = 0; for (i = 0; i <= num - 1; i++) { graphics.FillEllipse(Brushes.White, x[i], y[i], s[i], s[i]); } } private void SnowTest_Resize(object sender, EventArgs e) { rectangle = new Rectangle(0, 0, this.Width, this.Height); } } 设置为Timer1 Interval

脚本运行并生成“雪”,但一段时间后它不会删除它,整个表单也会创建滞后

实现目标的最佳方式是什么?

在普通形式中,几乎以相同的方式构造,它缺少选择容器(100),函数SelectMdiContainer()和全局变量SnowOnContainer()的函数。 / p>

然而,在表单中,存在MDIContainer事件,因此下面的结构为

paint

修改

我正在做一些测试。目前,我删除了函数private void SnowTest_Paint(object sender, PaintEventArgs e) { graphics = e.Graphics; int i = 0; for (i = 0; i <= num - 1; i++) { graphics.FillEllipse(Brushes.White, x[i], y[i], s[i], s[i]); } } ,并为容器添加了SnowOnContainer()事件。

Paint

事件的结构与普通表格相同,但应用于容器

private void SelectMdiContainer()
{
        foreach (Control control in this.Controls)
        {

            // #2
            MdiClient client = control as MdiClient;
            if (!(client == null))
            {
                MDIContainer = client;
                MDIContainer.Paint += OnMdiContainerPaint; //Added this Event
                break;
            }
        }
 }

最后我做了一些研究,并且我添加了这段代码以避免闪烁动画。如本主题How to fix the flickering in User controls

所示
private void OnMdiContainerPaint(object sender, PaintEventArgs e)
{
        graphics = MDIContainer.CreateGraphics();
        int i = 0;
        for (i = 0; i <= num - 1; i++)
        {
            graphics.FillEllipse(Brushes.White, x[i], y[i], s[i], s[i]);
        }
 }

这样做似乎可以正常使用流畅的动画,但只要我调整表单大小,或者缩小为图标就会返回延迟

0 个答案:

没有答案