none
スプラッシュウィンドウの表示時にラベルなどが白く抜けるのはなぜ? RRS feed

  • 質問

  • スプラッシュウィンドウを表示しようとしています。
        private void Form1_Load(object sender, EventArgs e)
            {
                frmSplash fs = new frmSplash();
                fs.Show();
                Thread.Sleep(5000);  
                fs.Close();
            }
    スプラッシュウィンドウfrmSplashに,1つのlabel,2つのPictureBoxを配置していますが,3つのどれもが窓が開いたように白く抜けてしまいます。
    このことについての対策がわからないでいます。

    どの様な対策が必要なのでしょうか。

    2006年8月18日 15:53

回答

すべての返信

  • とりあえず DoEvents

    2006年8月18日 16:15
  • 表示するだけ表示して、後ろで起動処理を続けることをしないってのは、スプラッシュウィンドウの意味がないような気がします(w;
    2006年8月18日 16:28
  •  中博俊 さんからの引用
    とりあえず DoEvents

    ありがとうございます。Application.DoEvents()できちんと表示されるようになりました。
    けれど,なぜApplication.DoEvents()が必要なのか理解できていません。

     Hongliang さんからの引用
    表示するだけ表示して、後ろで起動処理を続けることをしないってのは、スプラッシュウィンドウの意味がないような気がします

    ここでは,単にスプラッシュウィンドウを表示するテストをしているだけですので・・・・。

    2006年8月18日 16:54
  • 諸農です。

     zen73 さんからの引用

    けれど,なぜApplication.DoEvents()が必要なのか理解できていません。

    Form.Show / Control.Show はコントロールのVisibleをTrueに変更します。その後Windowsからのメッセージを受け取ってコントロールの再描画が行われるのですが、投稿されていたコードではShow()呼び出しの後にThread.Sleepに突入してしまうのでWindowsからのメッセージを受け取るタイミングを失う、描画のタイミングを失うと言うことになります。Application.DoEventはWindowsからのメッセージをディスパッチするので描画処理が行われることになります。フォームだけに特化するのであればApplication.DoEventの代わりにShow呼び出しの後にUpdateを呼び出しても良いかと思います。

     

     Hongliang さんからの引用
    表示するだけ表示して、後ろで起動処理を続けることをしないってのは、スプラッシュウィンドウの意味がないような気がします

    ここでは,単にスプラッシュウィンドウを表示するテストをしているだけですので・・・・。

    投稿されているコードだけを見る限りでは、単にサブフォーム呼び出しのテストにしか見えないからです。スプラッシュフォームの表示テストと受け取るにはちょっとよいしょがいるかも(^^;

     

    2006年8月19日 0:02
  • 最初の描画だけであれば、Application.DoEvents メソッドというより、Form.Refresh メソッドで良いですけどね。
    Splash のテストらしいですし。

    # でも、それ以外の、メッセージ キューも吐き出さないと Busy になってしまうw

    2006年8月19日 5:24
  •  Hongliang さんからの引用
    表示するだけ表示して、後ろで起動処理を続けることをしないってのは、スプラッシュウィンドウの意味がないような気がします(w;

    Hongliangさん,折角のご助言の意味を理解使用ともせず,申し訳ありませんでした。
     Kazutaka Morono さんからの引用
    スプラッシュフォームの表示テストと受け取るにはちょっとよいしょがいるかも(^^;

     じゃんぬねっと さんからの引用
    Splash のテストらしいですし。

    うぅぅつぅ!!!。本当のスプラッシュウィンドウを作りたいのです。
     じゃんぬねっと さんからの引用
     # でも、それ以外の、メッセージ キューも吐き出さないと Busy になってしまうw
     

    fs.Dispose();でしょうか?
       private void Form1_Load(object sender, EventArgs e)
            {
                frmSplash fs = new frmSplash();
                fs.Show();
                fs.Refresh();
                //Application.DoEvents();
                Thread.Sleep(2500);  // 5000ms 一時停止
                fs.Close();
                fs.Dispose();

                this.Activate();
            }

     Kazutaka Morono さんからの引用
    Show()呼び出しの後にThread.Sleepに突入してしまうのでWindowsからのメッセージを受け取るタイミングを失う、描画のタイミングを失うと言うことになります。

    そういうことなのかと,なんとなく理解できます。
     Kazutaka Morono さんからの引用
    フォームだけに特化するのであればApplication.DoEventの代わりにShow呼び出しの後にUpdateを呼び出しても良いかと思います。

    Updateときいても,データベースの更新のことしか頭に思い浮かばず,まったく手をつけることができません。

    ご面倒でも,ご助言をよろしくお願いいたします。


     

    2006年8月19日 7:02
  • 諸農です。

     zen73 さんからの引用

    Updateときいても,データベースの更新のことしか頭に思い浮かばず,まったく手をつけることができません。 

     

    RefreshはInvalidateしてUpdateするのと同じだと言うことですので、じゃんぬねっとさんが示された方法が良いですね。
    http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.control.update.aspx

     zen73 さんからの引用

     じゃんぬねっと さんからの引用
     # でも、それ以外の、メッセージ キューも吐き出さないと Busy になってしまうw
     


    fs.Dispose();でしょうか?

    いえ、キュー待ちのメッセージをディスパッチするのがDoEventsです。

     

    2006年8月19日 8:06
  • 皆さんいろいろとありがとうございました。
    2006年8月19日 20:29