ArcGIS 10アドイン:ドッキング可能なウィンドウを前面に


8

C#.NET 3.5で記述されたArcGIS 10 ArcMapアドインがありESRI.ArcGIS.Desktop.AddIns.DockableWindow(これもから継承UserControlESRI.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);

dockwindow add inのサンプルを私に送信/投稿できますか?

回答:


6

使用してみてくださいSetWindowPosが HWND_TOPフラグとドッキング可能なウィンドウコントロール(または多分それの親や祖父母コンテナコントロール)のhWndをと呼んでWINAPI。


Kirkに感謝します。実際に試してみたのですが、効果はありませんでした。ドッキング可能なウィンドウには親コントロールはありませんが、LeftプロパティとTopプロパティは0であるため、実際には親ウィンドウ(ArcMapアプリケーション以外)があることを想定しています。これを行うには、Windows APIをいじくるよりも簡単な方法はないのが本当に嫌いです。自分でこれで運はありましたか?
blah238

また奇妙ですが、IWindowPositionコクラスのLeftプロパティとTopプロパティは正しいですが、そのMoveメソッドは効果がありません。
blah238

2
spy ++を使用して、ドッキングされていないウィンドウを見ると、祖父母がアークマップであることがわかります。だから私はzorderがドッキング可能なウィンドウの祖父母によって設定されると思います。あなたは正しい-確かにもっと簡単な方法があるようだ。
カークカイケンダル、

2
それは確かに祖父母の窓です。ただし、この構造に依存することは理想的ではありません。これは、将来のバージョンのArcMapで簡単に壊れる可能性があるためです。ESRIはこれを行うためのインターフェースを実際に提供する必要があります。
Petr Krebs、

みんなありがとう、それはちょっとしたスローガンでしたが、私はそれを機能させることができました。コード化されたソリューションで質問を編集しました。
blah238
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.