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