C#のShowDialog()の挙動
モーダルのウィンドウを表示、非表示を複数のフォームに対して行ったときに、
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
System.Runtime.InteropServices.SEHException' のハンドルされていない例外が system.windows.forms.dll で発生しました。
追加情報 : 外部コンポーネントが例外をスローしました。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
というようなエラーが表示された。
この現象に対して
記述していた
Application.EnableVisualStyles();
をコメントアウトするだけで解消した。
このコードはフォームのスタイルをXPのスタイルで表示させるだけのはずだけれど。
このコードが実際のところどのような挙動をしているのかを確認しておこう。
じゃんぬねっとさんからの指摘で
Application.EnableVisualStyles();
の後に
Application.DoEvents();
と追記することで解決した。
クラスライブラリを確認すると
・Application.EnableVisualStyles メソッド
http://msdn.microsoft.com/library/ja/cpref/html/frlrfSystemWindowsFormsApplicationClassEnableVisualStylesTopic.asp
・Application.DoEvents メソッド
http://msdn.microsoft.com/library/ja/cpref/html/frlrfSystemWindowsFormsApplicationClassDoEventsTopic.asp
通常はMainの1行目、フォームを生成する前に、EnableVisualStylesを記述するとあるが、DoEventsによりメッセージキューの吐き出しまでの記載はなかった。
サンプルコード
・コントロールを XP スタイル (視覚テーマ) で表示する
http://jeanne.wankuma.com/tips/control/xpstyle.html
・WindowsアプリケーションをWindows XPスタイルの外観にするには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/234winxpstyle/winxpstyle.html
ここには
EnableVisualStyles()
はバグが発生する場合があるため、マニフェストを使用するほうがベターとある。
・フォーム上のコントロールで Windows XP のビジュアル スタイルを使用する方法
http://www.microsoft.com/japan/msdn/vs/client/vbtchUsingWindowsXPVisualStylesWithControlsOnWindowsForms.aspWindows