中の技術日誌ブログ

C#とC++/CLIと
VBと.NETとWindowsで戯れる
 

目次

Blog 利用状況

ニュース

自己紹介

東京でソフトウェアエンジニアをやっています。
お仕事大募集中です。
記事執筆や、講師依頼とかでも何でもどうぞ(*^_^*)
似顔絵 MSMVPロゴ
MSMVP Visual C# Since 2004/04-2013/03

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

メッセージポンプ in WPF

WPFネタですよと

Applicationの作成方法には以下の3通りがある

  • Main関数のApplication.Run
  • <Application StartupUri="Window1"/>
  • <Application Startup="App_Startup"/>

Applicationの初期処理を行う場合には1か3を選ぶことになる。

1の書き方は

http://msdn2.microsoft.com/en-us/library/ms597011(VS.90).aspx

3の書き方は

http://msdn2.microsoft.com/en-us/library/system.windows.application.startup(VS.90).aspx

ただポイントはStartupはイベントだってこと。

このイベントの中でウィンドウを開かないと最初のウィンドウができない状態のためにメッセージポンプループに陥ります。

ダメな例1

private void App_Startup(object sender, StartupEventArgs e )
{
return;
}

もう1個ダメなパターンが2個ウィンドウを開く

ダメな例2

private void App_Startup(object sender, StartupEventArgs e )
{
LoginWindow lw = new LoginWindow();
if ( lw.ShowDialog() == false ) { return; }

MainWindow mw = new MainWindow();
mw.ShowDialog();

return;
}

このパターンだと、lwが閉じた段階でアプリケーションの終了ルーチンに流れてしまいます。

ということで、ログイン画面を挟む場合には

よい例1

private void App_Startup(object sender, StartupEventArgs e )
{
  LoginWindow lw = new LoginWindow();
  lw.ShowDialog();
}

LoginWindow.Login()
{
  if ( this.IsLogin() )
  {
    this.Hide();
    MainWindow mw = new MainWindow();
    mw.ShowDialog();
  }
}

またはアプリケーションの終了パターンを変更するShutdownModeを設定します。

http://msdn2.microsoft.com/en-us/library/system.windows.application.shutdownmode(VS.90).aspx

よい例2

private void App_Startup(object sender, StartupEventArgs e )
{
  this.ShutdownMode = ShutdownMode.OnExplicitShutdown;
  try
  {
    LoginWindow lw = new LoginWindow();
    if ( lw.ShowDialog() == false ) { return; }
    MainWindow mw = new MainWindow();
    mw.ShowDialog();
  }
  finally { this.Shutdown(); }
}

メッセージポンプは厳然としてそこに存在します。

Startupイベントで何もせずに抜けると無限ループになりますが、そのタイミングでブレークすると

WindowsBase.dll!System.Windows.Threading.Dispatcher.GetMessage(ref System.Windows.Interop.MSG msg, System.IntPtr hwnd, int minMessage, int maxMessage) + 0x4f バイト

こんなところで止まります。

あきらかにメッセージループです。

いままでのWindowsFormsと違うWPFですが、あきらかに同じところもあるわけです。

投稿日時 : 2007年12月12日 0:49

コメントを追加

No comments posted yet.
タイトル
名前
URL
コメント