Как изменить режим стыковки 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();