Как изменить режим стыковки CDockingManager на лету? - PullRequest
3 голосов
/ 30 марта 2011

Я хочу иметь возможность переключаться между немедленной и интеллектуальной стыковкой в ​​клиентском приложении 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 ]

1 голос
/ 16 июня 2011

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

0 голосов
/ 17 мая 2017

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

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

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

[Edit] Эта строка в конструкторе CMFCVisualManagerVS2005, похоже, помогает.

CDockingManager::EnableDockSiteMenu();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...