- PR -

モーダルのダイアログを表示するときに、同時に別画面を表示する

1
投稿者投稿内容
tsuyori
常連さん
会議室デビュー日: 2002/06/18
投稿数: 23
投稿日時: 2007-01-26 16:07
いつもお世話になっております。
C#、.Net1.1の環境で、Form1からForm2をShowDialog(this)でモーダルのダイアログとして表示を行っています。
このときForm2を親としてForm3のダイアログをモーダレスで開きます。
この開くタイミングはForm2のActivatedのタイミングで1度だけ実行するようにしています。
意図としては、Form1からForm2のダイアログを開くと同時にForm3も開き、Form1だけは操作できないというのを想定しています。
しかし実行すると、Form3のダイアログの操作がまったくできず、ウィンドウの移動もできません。
Form1、Form3が操作不可の状態でForm2だけが操作できる状態になってしまいます。

Form3も操作可能の状態で開くにはどのようなタイミングでForm3をShowさせればよいのでしょうか。

Form1のコードは
private void button1_Click(object sender, System.EventArgs e)
{
Form2 form2 = new Form2();
form2.ShowDialog( this );
}

Form2のコードは
private void Form2_Activated(object sender, System.EventArgs e)
{
if( flagNew == true )
{
this.flagNew = false;
Form3 form3 = new Form3();
this.AddOwnedForm( form3 );
form3.Show();
}
}
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-26 16:47
引用:

tsuyoriさんの書き込み (2007-01-26 16:07) より:

Form3も操作可能の状態で開くにはどのようなタイミングでForm3をShowさせればよいのでしょうか。


初回の WM_PAINT 以降です。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
tsuyori
常連さん
会議室デビュー日: 2002/06/18
投稿数: 23
投稿日時: 2007-01-26 17:10
じゃんぬさん回答ありがとうごさいます。
Form2で
private const int WM_PAINT = 0x000f;
protected override void WndProc(ref Message m)
{
  if( m.Msg == WM_PAINT )
  {
    if( flagNew == true )
    {
      this.flagNew = false;
      Form3 form3 = new Form3();
      this.AddOwnedForm( form3 );
      form3.Show();
    }
  }
  base.WndProc (ref m);
}

とすることで意図した動作になりました。
ありがとうございました。


[ メッセージ編集済み 編集者: tsuyori 編集日時 2007-01-26 17:24 ]
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2007-01-26 17:26
別に WndProc オーバーライドしなくても
Form3のOnPaintイベントに書けばいいのでは?
tsuyori
常連さん
会議室デビュー日: 2002/06/18
投稿数: 23
投稿日時: 2007-01-26 17:42
Blueさん、回答ありがとうございます。
ご指摘どおり、再描画のタイミングと考えれば、Paintのタイミングで意図した動作になりました。
ありがとうございました。
private void Form2_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
  if( flagNew == true )
  {
    this.flagNew = false;
    Form3 form3 = new Form3();
    this.AddOwnedForm( form3 );
    form3.Show();
  }
}
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-26 17:53
ただ、個人的には、

コード:

    Form2 f2 = new Form2();
    Form3 f3 = new Form3();

    f2.Show();
    f3.Show();

    this.Enabled = false;


この方が、Form2 と Form3 の関係からして適切だと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
tsuyori
常連さん
会議室デビュー日: 2002/06/18
投稿数: 23
投稿日時: 2007-01-26 18:40
じゃんぬさん、回答ありがとうございます。
ご指摘のとおり元フォーム(Form1)のEnabledをfalseにすると意図している動作にもなるのですが、その場合は元フォームのコントロールのすべてが使用不可状態(Enabled=false)の状態になります。
実際に製造しているプログラムでは元フォームにはアイコンを設定したボタンや、データの一覧が表示されているのですが、アイコンがグレースケールになり、文字色もグレーになってしまいました。
意味合い的に使用不可なのは正しかったのですが、少し見づらいかなと感じましたので、Enabledの使用は見送りました。
文字色のグレーの回避策として、Enabledの使用をせずに、Form2が表示されているときに、Form1がActiveになったら強制的にForm1にフォーカスを移すということも考えてみたのですが、意図が違ってしまうように(またコード的に安全ではないような・・・)思われて見送りました。
1

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