2012-02-28 41 views
4

我遷移了我的MFC MDI應用程序以使用新的MFC Feature Pack。我有很多工具欄和可停靠的窗格。據我瞭解,當關閉應用程序時,它們的位置和大小都保存在註冊表中,並在加載主框架時加載。CWinAppEx CleanState - 重置佈局

我想在我的應用程序中添加一個功能,將工具欄/窗格的佈局重置爲原始佈局。

我加入他們命令我CWinAppEx派生類的處理如下菜單項:

CleanState(); 
LoadState((CMDIFrameWndEx*)m_pMainWnd); 

但它似乎並沒有正常工作。

但是,如果我在調用LoadMainFrame()之前先調用CleanState()函數,應用程序將使用默認佈局(我想要的那個)加載。

有沒有一種方法來真正重置我的應用程序的佈局後,它已被加載?

非常感謝。

回答

0

我沒有一個簡單的答案給你。我在Visual Studio 2017中使用了MFC Feature Pack的3個對接窗口。我調用了CleanSlate,然後定位了對接窗格,以確保它們可見。我嘗試了主框架窗口和對接窗口的大小,使其看起來正確。

void CMainFrame::OnButtonWindowResetLayout() 
{ 
    theApp.CleanSlate(); 

    CRect rcInputsOutputs(0, 0, 400, 50); 
    m_wndPaneInputsOutputs.DockToFrameWindow(CBRS_ALIGN_RIGHT, rcInputsOutputs, DT_DOCK_LAST, NULL, -1, FALSE); 
    m_wndPaneInputsOutputs.ShowPane(TRUE); 

    CRect rcDeviceStatus(0, 0, 600, 180); 
    m_wndPaneDeviceStatus.DockToFrameWindow(CBRS_ALIGN_BOTTOM, rcDeviceStatus, DT_DOCK_LAST, NULL, -1, TRUE); 
    m_wndPaneDeviceStatus.ShowPane(TRUE); 

    CRect rcOutput(0, 0, 600, 70); 
    m_wndOutput.DockToFrameWindow(CBRS_ALIGN_BOTTOM, rcOutput, DT_DOCK_LAST, NULL, -1, TRUE); 
    m_wndOutput.ShowPane(TRUE); 

    AdjustDockingLayout(); 
    SetWindowPos(&CWnd::wndTop, 0, 0, 900, 680, SWP_NOMOVE | SWP_NOACTIVATE | SWP_SHOWWINDOW); 
} 

每個窗格類有以下功能:

void CPaneDialogEx::ShowPane(BOOL showPane) 
{ 
    if (showPane != IsVisible()) { 

     CMainFrame* pMainFrame = DYNAMIC_DOWNCAST(CMainFrame, GetTopLevelFrame()); 

     if (pMainFrame != NULL) { 
      pMainFrame->SetFocus(); 
      pMainFrame->ShowPane(this, showPane, FALSE, FALSE); 
      pMainFrame->RecalcLayout(); 
     } 
    } 
}