MessageBox

で、.NET Compact Framework では MessageBox.Show() メソッドに owner を指定することができないのですが、メッセージボックス表示中に呼び出し元のフォームをタップすると呼び出し元のフォームが前面に出てしまい、メッセージボックスが背後に回ってしまうという困った動作をします。

考えた末「タップされたくなければ Disable にすればいいじゃない」という結論に達し、以下のようなメソッドを実装しました。

    ///  
    ///  指定したフォームの前に、指定したテキスト、ボタン、アイコ
    ///  ンおよび規定のボタンを表示するメッセージボックスを表示す
    ///  る。
    ///

    ///
    /// 
    ///   キャプションはを表示
    ///   する。
    /// 

    /// 
    ///   タップ操作によって、メッセージボックスが<i>owner</i>の
    ///   背後にまわる場合があるので、メッセージボックスの表示中
    ///   は<i>owner</i>がユーザーとの対話に応答しないようにす
    ///   る。
    /// 

    ///

    ///
    ///  メッセージボックスがその前に表示される
    /// 
    ///
    ///
    ///  メッセージボックスに表示するテキスト。
    ///
    ///
    ///  メッセージボックスに表示されるボタンを指定する
    ///  値の1つ。
    ///
    ///
    ///  メッセージボックスに表示されるアイコンを指定する
    ///  値の1つ。
    ///
    ///
    ///  メッセージボックスの既定のボタンを指定する
    ///  値の1つ。
    ///
    /// 値の1つ。
    public static DialogResult
    MsgBox
      (Form owner,
       string message,
       MessageBoxButtons button,
       MessageBoxIcon icon,
       MessageBoxDefaultButton defaultButton)
    {
      bool ownerEnabledSave = owner.Enabled;
      owner.Enabled = false;

      DialogResult result
        = MessageBox.Show
         (message, ApplicationInfo.Name, button, icon,
          defaultButton);

      owner.Enabled = ownerEnabledSave;

      return result;
    }

これを使うと、メッセージボックス表示中に owner が Disable になり、色が灰色になりますが、まあ、それはどーでもいいや、とゆーことにしました。