- - PR -
モーダルのダイアログを表示するときに、同時に別画面を表示する
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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(); } } | ||||
|
投稿日時: 2007-01-26 16:47
初回の WM_PAINT 以降です。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 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 ] | ||||
|
投稿日時: 2007-01-26 17:26
別に WndProc オーバーライドしなくても
Form3のOnPaintイベントに書けばいいのでは? | ||||
|
投稿日時: 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(); } } | ||||
|
投稿日時: 2007-01-26 17:53
ただ、個人的には、
この方が、Form2 と Form3 の関係からして適切だと思います。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2007-01-26 18:40
じゃんぬさん、回答ありがとうございます。
ご指摘のとおり元フォーム(Form1)のEnabledをfalseにすると意図している動作にもなるのですが、その場合は元フォームのコントロールのすべてが使用不可状態(Enabled=false)の状態になります。 実際に製造しているプログラムでは元フォームにはアイコンを設定したボタンや、データの一覧が表示されているのですが、アイコンがグレースケールになり、文字色もグレーになってしまいました。 意味合い的に使用不可なのは正しかったのですが、少し見づらいかなと感じましたので、Enabledの使用は見送りました。 文字色のグレーの回避策として、Enabledの使用をせずに、Form2が表示されているときに、Form1がActiveになったら強制的にForm1にフォーカスを移すということも考えてみたのですが、意図が違ってしまうように(またコード的に安全ではないような・・・)思われて見送りました。 |
1