CWinAppEx CleanState - сброс макета - PullRequest
       11

CWinAppEx CleanState - сброс макета

5 голосов
/ 28 февраля 2012

Я перенес приложение MFC MDI для использования нового пакета функций MFC.У меня много панелей инструментов и закрепляемых панелей.Насколько я понимаю, расположение и размер каждого из них сохраняется в реестре при закрытии приложения и загружается при загрузке основного фрейма.

Я хочу добавить функцию в моем приложении для сбросамакет панелей инструментов / панелей к исходному макету.

Я добавил пункт меню, команда которого обрабатывается в моем CWinAppEx производном классе, следующим образом:

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

Но это не похожедля правильной работы.

Однако, если я поставлю вызов функции CleanState() перед вызовом LoadMainFrame(), приложение загрузится с макетом по умолчанию (тот, который я хочу).

Есть ли способ сбросить макет моего приложения после его загрузки?

Большое вам спасибо.

Ответы [ 2 ]

0 голосов
/ 02 августа 2018

Да, просто удалите запись реестра, назначенную с сохранением макета.

0 голосов
/ 15 июля 2017

У меня нет простого ответа для вас.У меня было 3 окна стыковки с использованием MFC Feature Pack в Visual Studio 2017. Я позвонил в 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();
       }
    }
}
...