Как изменить режим стыковки CDockingManager на лету?

Я хочу иметь возможность переключаться между немедленной и умной стыковкой в ​​клиентском приложении MFC. По умолчанию DT_IMMEDIATE будет установлен таким образом, чтобы панели док-станции работали аналогично Visio. Однако, когда пользователь нажимает и удерживает клавишу Ctrl, я хочу переключиться на DT_SMART и отображать смарт-маркеры при перетаскивании или перемещении панелей док-станции, чтобы они могли видеть различные места стыковки, аналогичные Visual Studio.

Я попытался применить это с обработчиком ключа вниз, но он не срабатывает. Я тогда прибегнул к использованию PreTranslateMessage и хотя он ловит ввод и успешно устанавливает режим стыковки, он не отображает и не включает интеллектуальную стыковку, как ожидалось.

BOOL CMainFrame::PreTranslateMessage(MSG *pMsg)
{
    // everything fires and gets set correctly when holding down or pressing Ctrl
    // it doesn't ever turn smart docking back on or doesn't display smart markers
    // does mouse input interrupt so it doesn't take effect?
    if (pMsg->message == WM_KEYDOWN)
    {
            // also checks that repeating bit is not set in lParam
        if (pMsg->wParam == VK_CONTROL && ((pMsg->lParam & (1 << 30)) == 0))
        {
            CDockingManager::SetDockingMode(DT_SMART);
            LOG_DEBUG("DT_SMART");
            return TRUE;
        }
    }
    else if (pMsg->message == WM_KEYUP)
    {
        if (pMsg->wParam == VK_CONTROL)
        {
            CDockingManager::SetDockingMode(DT_IMMEDIATE);
            LOG_DEBUG("DT_IMMEDIATE");
            return TRUE;
        }
    }

    return CMDIFrameWndEx::PreTranslateMessage(pMsg);
}

В файле журнала я вижу, что он чередуется между настройками DT_SMART а также DT_IMMEDIATE при нажатии и отпускании клавиши Ctrl, однако, только немедленная стыковка работает должным образом. Есть ли какие-то перерисовки или какие-то другие звонки, которые мне нужно сделать, чтобы заставить это работать?

2 ответа

Просто чтобы быть уверенным: ты какое-то время держал ключ нажатым? Когда вы нажимаете и отпускаете клавишу, она срабатывает дважды (вниз и вверх), в результате чего режим сбрасывается на DT_IMMEDIATE (когда вы отпускаете клавишу). В качестве альтернативы я бы предложил переключать режим между DT_IMMEDIATE и DT_SMART только тогда, когда нажата клавиша.

Я знаю, что эта тема старая. Но... я заметил это призвание

CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2005));
CDockingManager::SetDockingMode(DT_SMART);

Кажется, чтобы исправить недостающие растровые изображения, по крайней мере, для текущего сеанса Windows. Даже если вы позже используете другой VisualManager. Относительно того, почему он это делает, все еще остается загадкой...

[Edit] Эта строка в конструкторе CMFCVisualManagerVS2005, кажется, делает свое дело.

CDockingManager::EnableDockSiteMenu();
Другие вопросы по тегам