如何即时更改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);
}
在日志文件中,我可以看到它在按下并释放Ctrl键时在设置DT_SMART
和DT_IMMEDIATE
之间交替,但只有立即对接才能按预期工作。是否需要进行一些重绘或其他调用以使其工作?
没有找到相关结果
已邀请:
2 个回复
荤碗
脾萌
似乎修复了丢失的位图,至少对于当前的Windows会话而言。即使您以后使用不同的VisualManager。至于它为什么这样做仍然是一个完全神秘的... [编辑] CMFCVisualManagerVS2005构造函数中的这一行似乎可以解决问题。