3

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_IMMEDIATECtrl キーを押して離したときが交互に表示されることがわかりますが、即時ドッキングのみが期待どおりに機能しています。これを機能させるために必要な再描画やその他の呼び出しはありますか?

4

2 に答える 2

1

念のため: キーをしばらく押し続けましたか? キーを押して離すと、2 回 (下と上) 起動し、モードが DT_IMMEDIATE にリセットされます (キーを離すと)。または、キーが押されたときにのみモードを DT_IMMEDIATE と DT_SMART の間で切り替えることを提案します。

于 2011-06-16T10:38:28.477 に答える