如何即时更改CDockingManager对接模式?

时间:2011-03-30 18:19:58

标签: c++ user-interface mfc docking

我希望能够在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_SMARTDT_IMMEDIATE之间切换,但只有立即停靠才能正常工作。是否需要重新绘制或进行其他一些调用以使其正常工作?

2 个答案:

答案 0 :(得分:1)

只是为了确定:你把钥匙按下了一段时间了吗? 当您按下并释放按键时,它将触发两次(向下和向上),导致模式被重置为DT_IMMEDIATE(当您释放按键时)。 或者,我建议只在按下键时才让模式在DT_IMMEDIATE和DT_SMART之间切换。

答案 1 :(得分:0)

我知道这个话题很老。但是......我注意到了那个叫

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

似乎修复了丢失的位图,至少对于当前的Windows会话来说。即使您以后使用不同的VisualManager。至于它为什么这样做仍然是一个完全神秘的...

[编辑] CMFCVisualManagerVS2005构造函数中的这一行似乎可以解决问题。

CDockingManager::EnableDockSiteMenu();