MFC强制CMultiDocTemplate中的CFormView始终保持最佳状态

时间:2016-05-04 04:20:21

标签: c++ mfc modal-dialog z-order modeless

我知道如何强制CDialog始终保持在程序中所有其他窗口的顶部...非模态。如下面的测试方法(代码)所示,您不能使用* .DoModal创建。我理解这一点。

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继承的东西,我一直没有成功

问题:有没有一种方法可以将CFormView保存在顶部的CMultiDocTemplate中(在前景中......就像非模态CDialog一样),即使该窗口不是具有焦点的窗口。换句话说,我希望继承自CFormView的classX始终位于继承自CView的classY之前。

部分成功:我能够取得部分成功。当classY的OnActivateView方法被击中时(这是应该在后台的类/窗口),然后,在它的OnActivateView中,我将循环遍历所有classX对象(我想要的那些)并带来它们使用classx-> bringToTop();这确实有效,然而,有一个荒谬的闪烁发生...我猜是因为(1)按时间类Y的调用OnActivateView,classY已经被带到了所有classX对象的前面因为(2)OnActivateView不会被调用一次但是大约六次(不知道为什么这么多次)...每个对象的OnActivateView随时被调用任何其他窗口被激活(不仅仅是在窗口时你关心被激活)。

问题:有没有更好的方法来实现这个我想念或不知道的事情?我已经尝试过测试classx-> SetWindowPos(& classx-> wndTop,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE),但这没有影响。我猜我在错误的地方使用它,或者它在代码的另一部分被撤消。

2 个答案:

答案 0 :(得分:1)

尝试在对话框中添加WM_ACTIVATETOPLEVEL消息,并在chach 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 :(得分:1)

尝试

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

我可以肯定它在我的案例中使一些工具栏成为最重要的。但是当工具栏包含在我必须做的CMiniFrame对象中时

CWnd* pWnd= pUserToolbar->GetParentMiniFrame();
if(pWnd)
    pWnd->SetWindowPos(&pWnd->wndTopMost, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE);