C#.NET 3.5で記述されたArcGIS 10 ArcMapアドインがありESRI.ArcGIS.Desktop.AddIns.DockableWindow
(これもから継承UserControl
)ESRI.ArcGIS.Desktop.AddIns.Tool
、マップでクリックするとドッキング可能なウィンドウが更新されます。
OnMouseDown()
(ドッキング解除モードの場合)ツールのメソッドでドッキング可能ウィンドウをZオーダーの前面に移動したいのですが。現在、ユーザーが別のドッキング可能なウィンドウを開いて自分のウィンドウの上に置き、ツールでクリックすると、ウィンドウは更新されますが、前面には表示されません。IDockableWindow.Show(true)
ツールでクリックした後、ウィンドウが表示されることを確認するために、既に呼び出しています。私も試しましUserControl.BringToFront()
たが、効果はありません。
私が現在持っている最善の回避策は、にIDockableWindow.Show(false)
続けてを呼び出すIDockableWindow.Show(true)
ことですが、ウィンドウを非表示にして再表示するのは不快であり、完全に再描画する必要があるため、かなりの時間がかかります。
組み込みのIdentifyウィンドウにはこの問題はなく、Identifyツールを使用するたびに一番上に表示されるので、それを行う方法があることは明らかです。
誰かがこれに対するより良い解決策を知っていますか?ありがとう!
編集:これは私がこれを解決するために使用したコードです。カークとペトルに感謝!
public static void BringDockableWindowToFront(IDockableWindow dockableWindow, IntPtr dockableWindowControlHandle)
/// <summary>
/// Workaround for bringing a dockable window to the top of the Z order.
/// dockableWindowControlHandle is the Handle property of the UserControl implemented by the dockable window
/// </summary>
{
IWindowPosition windowPos = dockableWindow as IWindowPosition;
IntPtr parentHwnd = GetParent(dockableWindowControlHandle); // Get parent window handle
switch (windowPos.State)
{
case esriWindowState.esriWSFloating:
IntPtr grandParentHwnd = GetParent(parentHwnd); // Get grandparent window handle
SetActiveWindow(grandParentHwnd); // Activate grandparent window when in floating (undocked) mode
break;
//case esriWindowState.esriWSMaximize: // Mode not yet implemented in ArcGIS 10, check at 10.1
//case esriWindowState.esriWSMinimize: // Mode not yet implemented in ArcGIS 10, check at 10.1
case esriWindowState.esriWSNormal:
SetActiveWindow(parentHwnd); // Activate parent window when in normal (docked) mode
break;
}
SetFocus(dockableWindowControlHandle); // Set keyboard focus to the dockable window
}
// Retrieves a handle to the specified window's parent or owner.
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetParent(IntPtr hWnd);
// Sets the keyboard focus to the specified window.
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr SetFocus(IntPtr hWnd);
// Activates a window.
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr SetActiveWindow(IntPtr hWnd);