2016-09-15 43 views
0

私はメインウィンドウを持っているので、メインウィンドウに含まれるのではなく浮かせるように、アプリケーションのフレームを "ポップアップ"できます。ある時点で3つのWS_POPUPウィンドウがあるように、ポップアップできる複数のフレームがあります。モーダルダイアログを表示するときにトップレベルウィンドウ(WS_POPUP)を無効にする

問題は、私がモーダルダイアログを表示するときに、私はDoModal関数のパラメータを使ってそれらのうちの1つだけを無効にすることができます。 DoModalを使ってすべてのトップレベルウィンドウを無効にする方法はありますか?モーダルを表示する前に単にウィンドウを無効にしてから、それを元に戻すことはできません。複数のモーダルダイアログを連鎖させることができます(1つのモーダルダイアログが別のモーダルダイアログを開きます)。

APIはこのようなことを行う方法を提供しましたか?私は2時間のためにこれをgoogledし、十分な解決策を見つけることができません。私はMFC、WTL、およびATLの組み合わせを使用しています。

ありがとうございます!

+1

これは、ダイアログの仕組みではありません。同様の効果を得るには、EnableWindow()を明示的に使用する必要があります。しかし、それはどのユーザーにとっても直感的ではありません。 –

+1

@ジャンス:モーダルダイアログは所有者によって**所有されています**。子/親の関係はありません。モーダルダイアログは兄弟を無効にしません。他の所有ウインドウ。 – IInspectable

+0

@HansPassantどの部分が直感的ではないと思いますか? 1つの現実世界の例は、ビジュアルスタジオです。ビジュアルスタジオは複数のポップアップウィンドウをサポートします。 VSでは、ファイルを開くときに、他のすべてのポップアップウィンドウは無効になります。とにかく、私は実装についてもっと心配しています。 – bysreg

答えて

1

私はこの問題を理解しているので、MFCフレームウィンドウのように動作します。

実際、MFCアプリケーションのCFrameWndのみ無効になります。 WM_ENABLEメッセージ(FALSE付き)からの到着時に、BeginModalStateが呼び出され、この関数はCFrameWndの "子ウィンドウ"をフローティングにするだけです。

また、EnableWindow(WM_ENABLEがTRUEになると)がCFrameWndに呼び出されたときと同じです。 EndModalStateが呼び出され、無効化されたすべての「子ウィンドウとフローティング」ウィンドウが再び有効になります。

ソースコードのCFrameWnd :: OnEnable、BeginModalState、EndModalSTateのMFC実装を参照してください。

メインウィンドウには、それ自身のポップアップが表示されます。真のモーダルダイアログを起動し、この親を無効にすると、フローティングポップアップが無効になります。

トリックは、CDialog :: DoModalが実際の親を必要とするということです。コンストラクタに与えられていないと、ほとんどの場合、正しいものが推測されます。あなたのケースでは、親ウィンドウとして "メインウィンドウ"を提供する必要があります...メッセージボックスと同じ...

+0

こんにちは、私はdomodal関数にメインウィンドウのハンドルを提供し、Create関数を使用して新しいポップウィンドウを作成するとき、私は親としてもメインウィンドウのハンドルを渡す必要がありますか?私はこれを試して、それは動作しません – bysreg

+0

私はメインウィンドウとポップアップのためにCFrameWindowImpl を使用しています、私はCWindowImplを使用しています bysreg

+1

これだけで動作しません。私は書きました:MFCの実装を見てください! CFrameWndはそれを行います。そして私はあなたに探す機能を教えました! – xMRi

関連する問題