2016-12-12 15 views
-3

非常に奇妙なウィンドウモード設定を持つMFCプロジェクトを使用しています。私は、このセットアップは、所有されているメッセージボックスが表示されている方法を台無しにしていると思う。メッセージボックスが表示されないのはなぜですか?

何かが起こっているのは、メッセージボックスがAltキーが押されるまで表示されないことです。

私はまだ彼らが使用しているウィンドウの設定の周りに私の頭を包んでしようとしていますが、誰かが私に何を探すかの手がかりを与えることができるでしょうか?

オーナーウィンドウとメッセージボックスのタイトルを、すべてのウィンドウを通過するスレッドを生成するクラスに渡して、指定された所有者が所有するメッセージボックスダイアログをタイトルで見つけて回避策を書いた指定された。しかし、これをシステム全体で動作させるには、1000以上のインスタンスを検索して置き換える必要があります。

より良い選択肢は、根本原因を見つけることです。しかし、この複雑さは非常に困難です。この行動を引き起こす可能性のあるものを探し出すための手掛かりがあれば、大いに感謝します。

+0

これはペイント/再描画の問題である可能性があります。 – 1201ProgramAlarm

+0

@ 1201ProgramAlarmは、これが一般的なウィンドウのMessageBoxであるため、私はそれがどうなるかわかりません。 – Adrian

+0

マルチモニタの設定を使用していますか?メッセージボックスを切断したモニタに表示できますか? – sergiol

答えて

2

これはMFC CDialog DoModal can't show window if parent window message queue is 'busy' '機能'によって発生します。メッセージキューにメッセージが含まれている場合、システムメッセージボックスは表示されません。 (。。投票またはそのバグにコメントしてください動作は非常に予想外である)

私はこれを使用して、キュー内のすべてのメッセージを読ましようとすることで、これを見つけ出し:

MSG msg = { 0 }; 
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
{ 
    TRACE(_T(R"--(,"% *.*s",PEEK,0x%08x,"%s",0x%08x,0x%08x,0x%08x)--" "\n"), 
       0, 0, _T(""), msg.hwnd, "Window HAS msg", 
       msg.message, msg.wParam, msg.lParam); 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 

これでしょうキュー内のすべてのメッセージを出力し、どのウィンドウおよびどのメッセージ(この場合はWM_PAINT)が違反者であるかを表示しました。

これで、どのクラスオブジェクトが接続されていたかを追跡し、それがOnPaint()ハンドラであることを確認しました。

前のプログラマーはCPaintDCオブジェクトを作成する前にif x次にreturnの条件を入れました。コンストラクタはBeginPaint()を呼び出し、無効領域を検証します。無効領域を検証せずに、無効領域が空になるまで、メッセージはWM_PAINTのメッセージを生成し続けます。これにより、メッセージキューが空になることはありません。

これが問題ではあるが、問題のウィンドウとダイアログボックスとの関係がルートアプリケーションウィンドウの同じスレッドにあったということはわかりません。

-ROOT       -ROOT 
+-CHILD       +-MESSAGE BOX 
    +-MESSAGE BOX     +-CHILD 
    +-CHILD       +-CHILD 
    +-CHILD       +-CHILD < Offender 
    +-CHILD < Offender    +-CHILD 
    +-CHILD      
+0

これはおそらく将来のvisitoあなたが間違っているウィンドウとダイアログボックスの関係をすぐに記述した場合、それは表示されませんでした。 – IInspectable

関連する問題