Add-in ArcGIS 10: Bawa jendela dockable ke depan

8

Saya memiliki add-in ArcGIS 10 ArcMap yang ditulis dalam C # .NET 3.5 yang mengimplementasikan ESRI.ArcGIS.Desktop.AddIns.DockableWindow(yang juga mewarisi dari UserControl) dan ESRI.ArcGIS.Desktop.AddIns.Toolyang ketika diklik di peta memperbarui jendela dockable.

Saya ingin membawa jendela dockable ke depan Z-order dalam metode Tool OnMouseDown()(saat dalam mode undocked). Saat ini, jika pengguna membuka jendela dockable lainnya, meletakkannya di atas tambang, dan mengklik dengan alat, pembaruan jendela tetapi tidak dibawa ke depan. Saya sudah menelepon IDockableWindow.Show(true)untuk memastikan jendela terlihat setelah mengklik dengan alat ini. Saya juga sudah mencoba UserControl.BringToFront()tetapi tidak berpengaruh.

Solusi terbaik yang saya miliki saat ini adalah menelepon IDockableWindow.Show(false)diikuti IDockableWindow.Show(true), namun ini tidak ideal karena menggelincir untuk memiliki jendela menghilang dan muncul kembali, serta harus sepenuhnya mengecat ulang yang membutuhkan banyak waktu.

Jendela Identifikasi bawaan tidak memiliki masalah ini dan dibawa ke atas setiap kali alat Identify digunakan, jadi jelas ada cara untuk melakukannya.

Adakah yang tahu solusi yang lebih baik untuk ini? Terima kasih!

Sunting: Ini adalah kode yang saya gunakan untuk menyelesaikan ini. Terima kasih Kirk dan Petr!

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);
blah238
sumber
dapatkah Anda mengirim / memposting saya sampel untuk dockwindow tambahkan?

Jawaban:

6

Coba gunakan panggilan winapi SetWindowPos dengan hWnd kontrol jendela dockable (atau mungkin kontrol induk atau kakek-nenek) dengan bendera HWND_TOP.

Kirk Kuykendall
sumber
Terima kasih Kirk, saya sebenarnya baru saja mencoba itu, tetapi itu tidak berpengaruh. Jendela dockable tidak memiliki kontrol induk, tetapi properti Kiri dan Atas adalah 0, jadi saya berasumsi bahwa itu berarti memang memiliki jendela induk (selain aplikasi ArcMap). Saya benar-benar benci bahwa tidak ada cara yang lebih mudah untuk melakukan ini selain mucking dengan Windows API. Apakah Anda beruntung dengan ini sendiri?
blah238
Juga aneh, tetapi properti Kiri dan Atas IWindowPosition co-class sudah benar, tetapi metode Pindahkannya tidak berpengaruh.
blah238
2
Menggunakan spy ++, dan melihat jendela yang tidak terkunci, saya melihat bahwa kakek buyutnya adalah arcmap. Jadi saya pikir zorder akan ditetapkan oleh kakek-nenek dari jendela dockable. Anda benar - sepertinya memang ada cara yang lebih mudah.
Kirk Kuykendall
2
Itu memang jendela kakek-nenek. Mengandalkan struktur ini tidak ideal, karena mungkin mudah pecah di versi ArcMap yang akan datang. ESRI harus benar-benar menyediakan beberapa antarmuka untuk melakukan ini.
Petr Krebs
Terima kasih teman-teman, itu sedikit keras tapi saya bisa membuatnya bekerja. Mengedit pertanyaan dengan solusi kode.
blah238