DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ダイアログ画面が最前面にならない

環境/言語:[ Framework1.1 WindowsXP SP2 C#]
分類:[.NET]

いつもお世話になります。

先日の質問後からも設計をしているのですが、テストアプリを作成中に
ラインを引く為に、カラーダイアログを表示させました。
ところがコード上は実行されているのですが、ダイアログが表示され
ないのです。不思議に思いALT+TABで切り替えてみた所
ダイアログが表示されました。

何故なのか原因が分からないのですが、ダイアログがアプリの背後に表示
されてしまっています。
ダイアログはモーダル表示なので、必ず最前面表示だと思っていたのですが
.netでは動作が変わるのでしょうか?
この様な現象をご存じでしたら、解決法をご教授願えないでしょうか?
> 何故なのか原因が分からないのですが、ダイアログがアプリの背後に表示
> されてしまっています。
> ダイアログはモーダル表示なので、必ず最前面表示だと思っていたのですが

必ずという保証はありません。
表示の前後で他のウィンドウを制御するようなことをしていませんか?
■No15442に返信(まどかさんの記事)
> 必ずという保証はありません。
> 表示の前後で他のウィンドウを制御するようなことをしていませんか?
アプリのPictureBoxではGDIでラインの描画を行っていますが
GDI描画が原因でしょうか?
ダイアログを表示するトリガーから表示が完了するまでの間に
ウィンドウの状態にかかわるような処理が無いですか?
ボタンのクリックであればそのイベントハンドラ内でです。
その一連の処理でダイアログの表示以外をコメントアウトするとどうなるでしょうか?
■No15444に返信(まどかさんの記事)
> ダイアログを表示するトリガーから表示が完了するまでの間に
> ウィンドウの状態にかかわるような処理が無いですか?
> ボタンのクリックであればそのイベントハンドラ内でです。
> その一連の処理でダイアログの表示以外をコメントアウトするとどうなるでしょうか?
>
コメントアウトして見ましたが、状況は変わりませんでした。
mdi親画面->mdi親画面内ユーザコントロール->カラーダイアログ
の順で表示しているだけなのですが、一体何が原因なのでしょう?
> mdi親画面->mdi親画面内ユーザコントロール->カラーダイアログ
> の順で表示しているだけなのですが、一体何が原因なのでしょう?

「順」とは一連の流れですか?
ダイアログ表示のトリガー(きっかけとなるアクション)は次とは異なるのでしょうか?
>>>>>>
ユーザーの入力待ちの状態(アプリケーションが何もしていない)で
何らかのアクション(ボタンクリックなど)を起こし、
その中でダイアログを表示する。
<<<<<<
■No15465に返信(まどかさんの記事)
> 「順」とは一連の流れですか?
> ダイアログ表示のトリガー(きっかけとなるアクション)は次とは異なるのでしょうか?
> >>>>>>
> ユーザーの入力待ちの状態(アプリケーションが何もしていない)で
> 何らかのアクション(ボタンクリックなど)を起こし、
> その中でダイアログを表示する。
> <<<<<<
>
はい、まどかさんのご指摘の順番であっています。
@ユーザコントロール内のボタンを押下する
Aカラーダイアログを表示する。
B「OK」が押下されたなら、選択された色を反映させる。
以上の手順で処理をおこなっています。
> @ユーザコントロール内のボタンを押下する

公開可能な範囲で1内のソースを書いてみてください。

しつこいですが
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim x As New ColorDialog
With x
.ShowDialog(Me.FindForm)
End With
x.Dispose()
End Sub
これで正常に動作しますか?
あ、VBで書いてしまった。。。m(_ _)m
■No15470に返信(まどかさんの記事)
まどかさん、返事が遅くなり申し訳ありません。

あれから以外な事で問題が解決しました。
ダイアログ表示するボタンのあるフォームにあるPictureBoxの
Paintイベントでラインを引いているのですが、ダイアログ表示前に
ライン描画を中止するようにしてみたところ
ダイアログ表示が背後に隠れる現象が発生しなくなりました。

どんな理由でこの様な事になったのか、理由は分かりませんが
GDI描画を止める事で解決できました。
そこで問題が解決方法から、何故こうなったかになるのですが・・・
> ダイアログ表示するボタンのあるフォームにあるPictureBoxの
> Paintイベントでラインを引いているのですが、ダイアログ表示前に
> ライン描画を中止するようにしてみたところ
> ダイアログ表示が背後に隠れる現象が発生しなくなりました。

表示直前でApplication.DoEventsを入れたらうまくいくかな?
あ、ダイアログのせいで再描画要求されてるのか。。。でもZOrderと何の関係があるのかな?
返事が遅れ申し訳ありません。

あれからApplication.DoEvents()等試してみましたが、ダイアログ
表示を行う時は、全てOnPaintイベントでのGDI描画を停止させ
ないと、ダイアログ画面が背後に隠れてしまう事が分かりました。

なんとか解決方法は見つかりはしましたが、根本的原因が分からないと
上司に対して説明できないのでもう少し調べてみるつもりです。
これだと原因が特定できましたので、書き込みます。

原因ですが、Paintイベント内の最後で
picturebox1.Invalidate(picturebox1.ClientRectangle)

があったのが原因でした。Invalidateを実行すると
ダイアログのメッセージが無視されてしまうようです。

とりあえず、原因が判明しましたのでこれで
解決済みのチェックを付けます。
解決済み!
■No15469に返信(まどかさんの記事)
> .ShowDialog(Me.FindForm)
どうでもいいことかもしれませんが。
FindFormって・・・普通にMeでいいでしやう。
>> .ShowDialog(Me.FindForm)
> FindFormって・・・普通にMeでいいでしやう。

おっと、UserControlということでそう書いたんですが、Handleプロパティがありますねぇ。
VB6の頭で書いちゃいました。

DOBON.NET | プログラミング道 | プログラミング掲示板