- PR -

スプラッシュウィンドウ表示

投稿者投稿内容
モモ
会議室デビュー日: 2006/01/16
投稿数: 7
投稿日時: 2006-04-06 05:54
いつも勉強させていただいております。

WindowsFormの画面を表示する前にスプラッシュウィンドウを表示させたいのですが、
スプラッシュウィンドウが閉じられた後、肝心の画面が最前面に表示されません。

画面A (別プロセスの画面。画面B、Cの含まれるexeをキックして起動する。)
画面B (メインの画面)
画面C (スプラッシュウィンドウ)

1.画面Aから画面B、C側のexeを起動
2.スプラッシュウィンドウを表示

private formSp as SplashForm '画面C。スプラッシュ画面

Sub Main()

'スプラッシュウィンドウ表示
dispSplush()

'メインの画面を生成
createMain()

End Sub

private Sub dispSplush()

'スレッドの作成
thread1 = New System.Threading.Thread( _
New System.Threading.ThreadStart(AddressOf splushStart))
'スレッドの開始
thread1.Start()

End Sub

'スプラッシュ画面表示
Private Sub splushStart()
'スプラッシュの画面を作成
formSp = New SplashForm
'スプラッシュの画面をを表示する
Application.Run(formSp)
End Sub

Private Sub createMain()

  'メインの画面の作成
dim formMain as MainForm = New MainForm

'スプラッシュウィンドウを閉じる
  formSp.Close()
formSp.Dispose()

'スプラッシュの画面をを表示する
Application.Run(formMain)

End Sub

3.スプラッシュウィンドウがCloseされ、メイン画面(画面B)が表示されるが
起動元の画面(画面A)の背後にある。最前面ではない。



スプラッシュウィンドウのクローズするタイミングがおかしいのかと思い、
メイン画面(画面B)のActivatedイベントに記述してみたのですが、それでも
最前面とはなりませんでした。

どなたか原因がお分かりの方がいらっしゃいましたらご教授宜しくお願いいたします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-04-06 06:34
Application.Run がどのようなメソッドか、それを調べるのが先だと思う。

〆 written by Jitta@わんくま同盟 on 2006/04/06
□ Microsoft MVP for Visual Developer ASP/ASP.NET October, 2005 - September, 2006
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-06 09:04
http://dobon.net/vb/dotnet/form/splashwindow.html

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-06 09:18
スレッドを分けないで、単純に、スプラッシュウィンドウを消したら、メインウィ
ンドウを手前に持ってくるようにすれば良いと思うのですが。
モモ
会議室デビュー日: 2006/01/16
投稿数: 7
投稿日時: 2006-04-06 11:20
みなさま、ご返信ありがとうございました。

じゃんぬねっと様に質問があります。

リンクしていただいた先のコードを再現してみましたが、やはりメイン画面が後ろに隠れてしまいました。
Application.Runが2回発行されていますが、Threadが別ならば大丈夫なのでしょうか?
スプラッシュウィンドウのThreadが終わったときに、画面のフォーカスは表示したいメイン画面ではなく、外れて呼び出し元に戻ってしまうような印象を受けました。
ご指摘いただいた箇所を調べてみましたが、そのあたりがまだ理解できていません。
知識不足なので、質問自体はずしていたら申し訳ありません。
モモ
会議室デビュー日: 2006/01/16
投稿数: 7
投稿日時: 2006-04-06 11:30
すみません、やっぱり外してました。

Threadが別ならばそれぞれにApplication.Runが発行されるのは大丈夫なのですね。
そこで問題なのですが、メイン画面がスプラッシュウインドウのThreadが終了させたあと
メイン画面がアクティブになっていないのです。
意識的に変えることはできるのでしょうか?
※Activateイベントは動いています。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-06 11:34
引用:

モモさんの書き込み (2006-04-06 11:30) より:

メイン画面がアクティブになっていないのです。
意識的に変えることはできるのでしょうか?
※Activateイベントは動いています。


アクティブにはなっているけど、前面に出ていないということではないでしょうか?
BringToFront メソッドを実行してもダメだったでしょうか?

タイミングによってはこのあたりはうまく動かないことがあります。
Application.DoEvents メソッドなども呼び出す必要があるかもしれません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
モモ
会議室デビュー日: 2006/01/16
投稿数: 7
投稿日時: 2006-04-06 12:14
じゃんぬねっと様、ありがとうございました。

BringToFrontメソッドを使用してみましたが…ダメでした。

(ヘルプより)
「コントロールをトップレベル コントロールにするわけではありません。」とあるので、プロセスが違う起動元画面は対象外なのかもしれません。

SetForeGroundWindowなどのAPIを使用しないといけないのかなと思いました。

スキルアップ/キャリアアップ(JOB@IT)