Я хочу иметь возможность переключаться между немедленной и интеллектуальной стыковкой в клиентском приложении 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, однако только немедленная стыковка работает, как и ожидалось. Есть ли какие-то перерисовки или какие-то другие звонки, которые мне нужно сделать, чтобы заставить это работать?