【问题标题】:How to change CDockingManager docking mode on-the-fly?如何即时更改 CDockingManager 对接模式?
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 是的各种测试,但还没有任何效果,这实际上是重复位检查的来源,因为最初按住 ctrl 多次设置 DT_SMART。我很好奇这是否是一个合理的更改而不删除然后重新添加停靠窗格到管理器。
    • 显式调用 RedrawWindow() 并没有什么不同,而且最好还是可以避免的。
    【解决方案2】:

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

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

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

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

    CDockingManager::EnableDockSiteMenu();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      相关资源
      最近更新 更多