【发布时间】:2011-03-30 18:19:57
【问题描述】:
我希望能够在 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 键,但只有立即对接按预期工作。是否需要进行一些重绘或其他调用才能使其正常工作?
【问题讨论】:
标签: c++ user-interface mfc docking