1

わかりました、これは以前に何百万回も質問されたことがあることを知っています(そして、人々はXDとまったく同じ方法でStackOverflowの質問を開始します)が、次のことを達成する方法を知りたいです:

  1. アプリケーションは最初にログインボックスを起動します
  2. ログインが成功した場合、スプラッシュ画面が(別のスレッドで)表示される必要があります。
  3. スプラッシュ画面が表示されている間、クラスオブジェクトは(シングルトンパターンに準拠して)DBからの大量のユーザー固有のデータで満たされ、ユーザーに何をしているかを表示する必要があります(例:初期化...読み込み中)データ...設定の読み込み...ワークスペースのレンダリング...完了!)
  4. また、スプラッシュスクリーンは、メインフォームがメインスレッドでの初期化を完了するのを待ってから、最終的に破棄する必要があります。

それがアプリケーションの欲求の流れです。メインフォームを閉じると、ユーザーはログインボックスに戻る必要があります。

私は多くのWinFormsに精通しているわけではないことを前もって述べなければなりませんが、この種の質問をすることで、私はゆっくりと学んでいます。私はスレッド化についていくらか読んでいますが、スプラッシュ画面は独自のスレッドで生成され、メインスレッドからのデリゲート(UIへのクロススレッド更新に対応するため)を使用してステータス更新をフィードする必要があることを学びました。これはすべて、Program.csの「Main()」サブルーチンで実行する必要があります。

ログインフォームを最初に表示する(そしてメインフォームを閉じたときに最後に表示する)という追加の要件があるため、どこから始めればよいかわからないため、ここで連絡を取ります。私は確かにこの点でどんな援助も評価します。

どうもありがとう!しゃ

4

1 に答える 1

2

これを行う方法の簡単な例を次に示します。秘訣は、ログインボックスが最初に開き、最後に閉じるため、メインフォームにすることです。

この例では、LoginScreenフォームには1つのボタンがあり、クリックするとOnOK()メソッドを呼び出す[OK]ボタンがあります。

public partial class LoginScreen : System.Windows.Forms.Form
{
    ApplicationWindow window;

    public LoginScreen()
    {
        InitializeComponent();
    }
    private void OnFormClosed( object sender, FormClosedEventArgs e )
    {
        this.Show();
    }
    private void OnOK( object sender, EventArgs e )
    {
        this.Hide();

        window = new ApplicationWindow();
        window.FormClosed += OnFormClosed;
        window.Show();
    }
}

ApplicationWindowフォームは、「メイン」フォームと呼ばれるものと同じです。これがSplashFormを起動するものです。

public partial class ApplicationWindow : System.Windows.Forms.Form
{
    public ApplicationWindow()
    {
        SplashForm.Show( 500 );

        InitializeComponent();
    }

    private void OnLoad( object sender, EventArgs e )
    {
        // Simulate doing a lot of work here.
        System.Threading.Thread.Sleep( 1000 );

        SplashForm.Hide();

        Show();
        Activate();
    }
}

これが私が使っているSplashFormのコピーです。静的なShow()メソッドで指定したミリ秒数に基づいて、フェードインおよびフェードアウトします。

public partial class SplashForm : Form
{
    #region Public Methods

    /// <summary>
    /// Shows the splash screen with no fading effects.
    /// </summary>
    public new static void Show()
    {
        Show( 0 );
    }

    /// <summary>
    /// Shows the splash screen.
    /// </summary>
    /// <param name="fadeTimeInMilliseconds">The time to fade
    /// in the splash screen in milliseconds.</param>
    public static void Show( int fadeTimeInMilliseconds )
    {
        // Only show the splash screen once.
        if ( _instance == null ) {
            _fadeTime = fadeTimeInMilliseconds;
            _instance = new SplashForm();

            // Hide the form initially to avoid any pre-paint flicker.
            _instance.Opacity = 0;
            ( ( Form ) _instance ).Show();

            // Process the initial paint events.
            Application.DoEvents();

            if ( _fadeTime > 0 ) {
                // Calculate the time interval that will be used to
                // provide a smooth fading effect.
                int fadeStep = ( int ) Math.Round( ( double ) _fadeTime / 20 );
                _instance.fadeTimer.Interval = fadeStep;

                // Perform the fade in.
                for ( int ii = 0; ii <= _fadeTime; ii += fadeStep ) {
                    Thread.Sleep( fadeStep );
                    _instance.Opacity += 0.05;
                }
            } else {
                // Use the Tag property as a flag to indicate that the
                // form is to be closed immediately when the user calls
                // Hide();
                _instance.fadeTimer.Tag = new object();
            }

            _instance.Opacity = 1;
        }
    }

    /// <summary>
    /// Closes the splash screen.
    /// </summary>
    public new static void Hide()
    {
        if ( _instance != null ) {
            // Invoke the Close() method on the form's thread.
            _instance.BeginInvoke( new MethodInvoker( _instance.Close ) );

            // Process the Close message on the form's thread.
            Application.DoEvents();
        }
    }

    #endregion Public Methods

    #region Constructors

    /// <summary>
    /// Initializes a new instance of the SplashForm class.
    /// </summary>
    public SplashForm()
    {
        InitializeComponent();

        Size = BackgroundImage.Size;

        // If transparency is ever needed, set the color of the desired
        // transparent portions of the bitmap to fuschia and then
        // uncomment this code.
        //Bitmap bitmap = new Bitmap(this.BackgroundImage);
        //bitmap.MakeTransparent( System.Drawing.Color.Fuchsia );
        //this.BackgroundImage = bitmap;
    }

    #endregion Constructors

    #region Protected Methods

    protected override void OnClosing( CancelEventArgs e )
    {
        base.OnClosing( e );

        // Check to see if the form should be closed immediately.
        if ( fadeTimer.Tag != null ) {
            e.Cancel = false;
            _instance = null;
            return;
        }

        // Only use the timer to fade if the form is running.
        // Otherwise, there will be no message pump.
        if ( Application.OpenForms.Count > 1 ) {
            if ( Opacity > 0 ) {
                e.Cancel = true; // prevent the form from closing
                Opacity -= 0.05;

                // Use the timer to iteratively call the Close method.
                fadeTimer.Start();
            } else {
                fadeTimer.Stop();

                e.Cancel = false;
                _instance = null;
            }
        } else {
            if ( Opacity > 0 ) {
                Thread.Sleep( fadeTimer.Interval );
                Opacity -= 0.05;
                Close();
            } else {
                e.Cancel = false;
                _instance = null;
            }
        }
    }

    #endregion Protected Methods

    #region Private Methods

    private void OnTick( object sender, EventArgs e )
    {
        Close();
    }

    #endregion Private Methods

    #region Private Fields

    private static SplashForm _instance = null;
    private static int _fadeTime = 0;

    #endregion Private Fields
}

SplashFormは、次のプロパティ値を持つ単なる空白のフォームです。

  • BackgroundImage =(選択した画像)
  • BackgroundImageLayout=中央
  • DoubleBuffered = true
  • FormBorderStyle=なし
  • ShowInTaskbar = False
  • StartPosition = CenterScreen
  • TopMost = true

また、デフォルトのプロパティを持つfadeTimerという名前のSystem.Windows.Forms.Timerコントロールも含まれています。Tickイベントは、OnTick()メソッドを呼び出すように構成されています。

これが行わないのは、ロードプロセスのステータスを更新することです。おそらく他の誰かがあなたのためにその部分を埋めることができます。

于 2009-09-01T19:59:00.197 に答える