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

質問
-
スプラッシュウィンドウを表示しようとしています。
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つのどれもが窓が開いたように白く抜けてしまいます。
このことについての対策がわからないでいます。どの様な対策が必要なのでしょうか。
すべての返信
-
諸農です。
zen73 さんからの引用 けれど,なぜApplication.DoEvents()が必要なのか理解できていません。
Form.Show / Control.Show はコントロールのVisibleをTrueに変更します。その後Windowsからのメッセージを受け取ってコントロールの再描画が行われるのですが、投稿されていたコードではShow()呼び出しの後にThread.Sleepに突入してしまうのでWindowsからのメッセージを受け取るタイミングを失う、描画のタイミングを失うと言うことになります。Application.DoEventはWindowsからのメッセージをディスパッチするので描画処理が行われることになります。フォームだけに特化するのであればApplication.DoEventの代わりにShow呼び出しの後にUpdateを呼び出しても良いかと思います。
Hongliang さんからの引用 表示するだけ表示して、後ろで起動処理を続けることをしないってのは、スプラッシュウィンドウの意味がないような気がします
ここでは,単にスプラッシュウィンドウを表示するテストをしているだけですので・・・・。投稿されているコードだけを見る限りでは、単にサブフォーム呼び出しのテストにしか見えないからです。スプラッシュフォームの表示テストと受け取るにはちょっとよいしょがいるかも(^^;
-
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ときいても,データベースの更新のことしか頭に思い浮かばず,まったく手をつけることができません。ご面倒でも,ご助言をよろしくお願いいたします。
-
諸農です。
zen73 さんからの引用 Updateときいても,データベースの更新のことしか頭に思い浮かばず,まったく手をつけることができません。
RefreshはInvalidateしてUpdateするのと同じだと言うことですので、じゃんぬねっとさんが示された方法が良いですね。
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.control.update.aspxzen73 さんからの引用 じゃんぬねっと さんからの引用 # でも、それ以外の、メッセージ キューも吐き出さないと Busy になってしまうw
fs.Dispose();でしょうか?いえ、キュー待ちのメッセージをディスパッチするのがDoEventsです。