MFC Позволяет использовать для включения/выключения плавающей панели инструментов с помощью команды меню

#c #visual-studio-2017 #mfc #docking

Вопрос:

В моем приложении MFC панель меню, панель инструментов и строка состояния работают правильно. Я нахожусь на том этапе, когда добавляю функции существа…одно, что меня действительно раздражает, — это выбор: навсегда заблокировать их или позволить им всплывать во время выполнения…Я посмотрел вверх и вниз, и я еще не видел примера, когда пользователь может разрешить динамическое изменение этой функции после запуска и запуска приложения. Первая функция-это приложение, которое работает правильно. ПРИМЕЧАНИЕ: У меня есть элементы, разрешающие стыковку, закомментированные, так как это был мой тестовый код..Я знаю, что это строки, которые включают или отключают стыковку во время выполнения….-> // включить стыковку

     int CMainFrame::OnCreate(LPCREATESTRUCT pptCreate)
{
    CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2005));
    if ( -1 == CMDIFrameWndEx::OnCreate(pptCreate) )
        return -1;

    // create menu bar
    if ( !m_wndMenuBar.Create(this) )
        return -1;  
    m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY);
    
    // prevent the menu bar from taking the focus on activation
    CMFCPopupMenu::SetForceMenuFocus(FALSE);
    
    // set the visual manager and style based on persisted value
    theApp.m_nAppLook = theApp.GetInt(_T("ApplicationLook"), ID_VIEW_APPLOOK_VS_2008);
    OnApplicationLook(theApp.m_nAppLook);

    // create tool bar
    if ( !m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME) )
        return -1;

    // create status bar
    if ( !m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(miIndicators, sizeof(miIndicators)/sizeof(UINT)) )
        return -1;

    // enable docking
    //m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
    //m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    m_wndToolBar.EnableToolTips(TRUE);
    EnableDocking(CBRS_ALIGN_ANY);
    DockPane(amp;m_wndMenuBar);
    DockPane(amp;m_wndToolBar);

    // enable Visual Studio 2005 style docking window behavior
    CDockingManager::SetDockingMode(DT_SMART);
    // enable Visual Studio 2005 style docking window auto-hide behavior
    EnableAutoHidePanes(CBRS_ALIGN_ANY);

    // create docking windows
    if (!CreateDockingWindows())
    {
        TRACE0("Failed to create docking windowsn");
        return -1;
    }

    m_wndOutput.EnableDocking(CBRS_ALIGN_ANY);
    DockPane(amp;m_wndOutput);

    return 0;
}
 

Поэтому я создал пункт меню, который переключает флаг, чтобы включать и выключать «стыковку». Переменная переключается правильно.. но выполнение команды поворота док-станции «3 точки» в левой части меню и панели инструментов всегда остается…т. е. никогда не переходит из режима плавающей точки в режим док-станции и наоборот. Логика переключения работает, как я вижу в окне состояния отладки, точки входа TRUE и FALSE отображаются каждый раз, когда я нажимаю на меню. Поэтому я предполагаю, что вопрос в том, можно ли динамически переключать эти элементы с ПЛАВАЮЩЕЙ точки на ДОК-станцию, не разрушая окно и не пытаясь повторно его запустить, что было бы визуальной катастрофой?

 void CMainFrame::UserDockingBarsOption()
{
    CMainFrame* pMainFrame = (CMainFrame*)AfxGetMainWnd();
    pMainFrame->m_wndOutput.AddStringDebugTab(_T("Debug: MainFrame--CMainFrame::UserDockingBarsOption()"));

    if (UserDockingFlag == TRUE)

    {   
        m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
        m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
        EnableDocking(CBRS_ALIGN_ANY);
        UserDockingFlag = FALSE;
        pMainFrame->m_wndOutput.AddStringDebugTab(_T("Debug: MainFrame--Inside True"));
    }
    else
    {
        m_wndMenuBar.EnableDocking(FALSE);
        m_wndToolBar.EnableDocking(FALSE);
        EnableDocking(FALSE);
        UserDockingFlag = TRUE;
        pMainFrame->m_wndOutput.AddStringDebugTab(_T("Debug: MainFrame--Inside False"));
    }
}
 

Комментарии:

1. Не могли бы вы подробно описать свои потребности? Что значит «не разрушая окно»? Если бы вы могли привести минимальный пример, это помогло бы решить проблему.

2. Не уверен, что эта ссылка будет работать: codejock.com/assets/images/support/articles/mfc/commandbars/… но если вы посмотрите на каждую панель инструментов, слева будут 3 точки… это означает, что вы можете схватить их, переместить, отстыковать и т. Д. Я пытаюсь понять, как выбрать между блокировкой их или разрешением им перемещаться по выбору пользователей. Уничтожая окно, я имею в виду, если бы я попытался «перезапустить» загрузочный код с помощью переключателя с надписью «закреплено/не закреплено»… Мне пришлось бы уничтожить окно и перерисовать его с новыми настройками… Я «думаю», что это было бы визуально нехорошо.

3. Помогает ли эта статья? help.perforce.com/stingray/12.2/Stingray_Studio_HTML_User_Guide/…

4. Я видел это некоторое время назад, но если я правильно читаю, то это для того, чтобы скрыть и отобразить панель инструментов… Я просто хочу «заблокировать» или закрепить против плавающего элемента управления без необходимости его перерисовки.

5. Мне кажется, что стыковка и расстыковка уже возможны: docs.microsoft.com/en-us/cpp/mfc/…