CDialogを常にプログラムの他のウィンドウの上に置くように強制する方法を知っています...非モーダルです。以下のテストメソッド(コード)に見られるように、* .DoModalを使用して作成することはありません。これは分かります。MFCは常にCMultiDocTemplateのCFormViewを常に先頭に置くようにします。
void CMFCTestAApp::OnOpenNonModalDialog()
{
//dialogTest new_dialog;
//new_dialog.DoModal();
dialogTest* test_dialog = NULL;
test_dialog = new dialogTest();
if(test_dialog != NULL)
{
if(test_dialog->Create(IDD_TestA_DIALOG))
test_dialog->ShowWindow(SW_SHOWNORMAL);
}
}
しかし、私はのCMultiDocTemplate/CFormViewの
質問から継承した何かで同じことをやってで成功していない:一番上のCMultiDocTemplate(に詰め込まれているのCFormViewを維持する方法がありますフォアグラウンドでは...非モーダルCDialogのように動作します)、そのウィンドウがフォーカスを持っているウィンドウではない場合でも。つまり、私はCViewから継承するclassXをCViewを継承するclassYの前に常に置いておきたいと思います。
部分的な成功:私は部分的な成功を収めました。 classYのOnActivateViewメソッドがヒットしたとき(これはバックグラウンドにあるべきクラス/ウィンドウです)、そのOnActivateView内で、私はすべてのclassXオブジェクト(前に必要なオブジェクト)をループして、 classx-> bringToTop(); (1)classYのOnActivateViewが呼び出され、classYはすでにすべてのclassXオブジェクトの前面に持ち込まれているため、(2) OnActivateViewは一度だけ呼び出されるのではなく、約6時間(理由は分かりません)...各オブジェクトのOnActivateViewはいつでも呼び出されます。他のウィンドウはアクティブになります。
質問:私が行方不明または分からないことを実装するためのより良い方法は誰にでもできますか?私はすでにclassx-> SetWindowPos(& classx-> wndTop、0,0,0,0、SWP_NOMOVE | SWP_NOSIZE)をテストしようとしましたが、これは影響しませんでした。私は間違った場所でこれを使用しているか、コードの別の部分で元に戻すことになっていると推測しています。
方法をしなければなりませんでしたか? – cha
複数のドキュメントとビューを持つMDIインターフェイスを持ち、フォームの1つを強制的に上に置くことは意味がありません。どうして?たぶんあなたの建設は間違っているので、ここではビューを使用すべきではありません。 – xMRi
xMRi:フォームはダイアログオブジェクトのようなものなので、一番上に置いておかなければならないフォームは、動作するはずのものでCDialogの目的は同じです...メインフォーム/ CDocumentのヘルパーUI ...何らかの理由でCformViewとしてコード化されていました。 – Fractal