1

Visual Studio 2010 で既定のフォームを作成しましたが、フォームのデザインは何も変更していません。に次のコードのみを追加しましたForm1.cs

using System;
using System.Windows.Forms;

namespace WinFormTest1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.TopMost = true;
            this.ShowInTaskbar = true;
            this.Load += new EventHandler(Form1_Load);
            this.Shown += new EventHandler(Form1_Shown);
        }

        void Form1_Load(object sender, EventArgs e)
        {
            this.Opacity = 0;
        }

        void Form1_Shown(object sender, EventArgs e)
        {
            this.Opacity = 1;
        }
    }
}

このプログラムを起動すると、タスクバーにフォームが表示されません。他のウィンドウをアクティブにしてから、このフォームをアクティブにしたときにのみ、タスク バーに表示されます。

そのような行動の理由は何ですか?

編集: ハンドラー Form1_Load で不透明度を設定する必要があるのはなぜですか? FormAppearingEffect以下のコードを持つクラスを作成しました:

using System;
using System.Diagnostics;
using System.Threading;
using System.Windows.Forms;

namespace AG.FormAdditions
{
    public class FormAppearingEffect
    {
        private Form form;
        double originalOpacity;

        public FormAppearingEffect(Form form)
        {
            this.form = form;
            form.Load += form_Load;
            form.Shown += form_Shown;
        }

        void form_Load(object sender, EventArgs e)
        {
            originalOpacity = form.Opacity;
            form.Opacity = 0;
        }

        private void form_Shown(object sender, EventArgs e)
        {
            try
            {
                double currentOpacity = 0;
                form.Opacity = currentOpacity;
                Stopwatch stopwatch = new Stopwatch();
                stopwatch.Start();
                for (int i = 1; currentOpacity < originalOpacity; i++)
                {
                    currentOpacity = 0.1 * i;
                    form.Opacity = currentOpacity;
                    Application.DoEvents();

                    //if processor loaded and does not have enough time for drawing form, then skip certain count of steps
                    int waitMiliseconds = (int)(50 * i - stopwatch.ElapsedMilliseconds);
                    if (waitMiliseconds >= 0)
                        Thread.Sleep(waitMiliseconds);
                    else
                        i -= waitMiliseconds / 50 - 1;
                }
                stopwatch.Stop();
                form.Opacity = originalOpacity;
            }
            catch (ObjectDisposedException) { }
        }
    }
}

どの形式のプログラムでも、このクラスを次のように使用します。

using System;
using System.Windows.Forms;
using AG.FormAdditions;

namespace WinFormTest1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            FormAppearingEffect frmEffects = new FormAppearingEffect(this);
        }
    }
}

したがって、私のフォームは「徐々に」画面に表示されます。

これは、私がこのトピックにいるバグを見つけた場所です。イベント ハンドラで不透明度を設定する必要があるのはこのためです。

4

0 に答える 0