2016-05-04 16 views
0

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)をテストしようとしましたが、これは影響しませんでした。私は間違った場所でこれを使用しているか、コードの別の部分で元に戻すことになっていると推測しています。

+1

方法をしなければなりませんでしたか? – cha

+1

複数のドキュメントとビューを持つMDIインターフェイスを持ち、フォームの1つを強制的に上に置くことは意味がありません。どうして?たぶんあなたの建設は間違っているので、ここではビューを使用すべきではありません。 – xMRi

+0

xMRi:フォームはダイアログオブジェクトのようなものなので、一番上に置いておかなければならないフォームは、動作するはずのものでCDialogの目的は同じです...メインフォーム/ CDocumentのヘルパーUI ...何らかの理由でCformViewとしてコード化されていました。 – Fractal

答えて

1

ダイアログにWM_ACTIVATETOPLEVELメッセージを追加し、WA_INACTIVEイベントが発生したときにSetWindowPos()を使用してください。このような

void CMFCTestAApp::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 
{ 
    CDialogEx::OnActivate(nState, pWndOther, bMinimized); 

    // TODO: Add your message handler code here 

    if (nState == WA_INACTIVE) 
    { 
     ::SetWindowPos(this->m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE); 
    } 
} 
1

は、私はそれはいくつかのツールバー私の場合は最上位を作るために働いていたと断言できる

SetWindowPos(&test_dialog->wndTopMost, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE); 

を試してみてください。ツールバーがCMiniFrameのオブジェクトにラップされているようしかし、私は、ウィンドウを作成するときに `WS_EX_TOPMOST`拡張ウィンドウスタイルの設定について

CWnd* pWnd= pUserToolbar->GetParentMiniFrame(); 
if(pWnd) 
    pWnd->SetWindowPos(&pWnd->wndTopMost, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE); 
関連する問題