Bổ trợ ArcGIS 10: Đưa cửa sổ có thể gắn vào phía trước


8

Tôi có một bổ trợ ArcGIS 10 ArcMap được viết bằng C # .NET 3.5, thực hiện một ESRI.ArcGIS.Desktop.AddIns.DockableWindow(cũng thừa hưởng từ UserControl) và một ESRI.ArcGIS.Desktop.AddIns.Toolkhi được nhấp vào trong bản đồ sẽ cập nhật cửa sổ có thể gắn được.

Tôi muốn đưa cửa sổ có thể gắn vào phía trước thứ tự Z trong OnMouseDown()phương thức của Công cụ (khi ở chế độ không khóa). Hiện tại, nếu người dùng mở một cửa sổ có thể gắn khác, đặt nó lên trên cửa sổ của tôi và nhấp vào bằng công cụ, cửa sổ sẽ cập nhật nhưng nó không được đưa ra phía trước. Tôi đã gọi IDockableWindow.Show(true)để đảm bảo cửa sổ hiển thị sau khi nhấp bằng công cụ. Tôi cũng đã thử UserControl.BringToFront()nhưng nó không có tác dụng gì.

Cách giải quyết tốt nhất mà tôi hiện có là gọi IDockableWindow.Show(false)theo sau IDockableWindow.Show(true), tuy nhiên điều này không lý tưởng vì nó bị giật khi cửa sổ biến mất và xuất hiện lại, cũng như phải sơn lại hoàn toàn mất một khoảng thời gian đáng kể.

Cửa sổ Xác định tích hợp không có vấn đề này và được đưa lên đầu mỗi lần sử dụng công cụ Xác định, vì vậy rõ ràng có một cách để làm điều đó.

Có ai biết một giải pháp tốt hơn cho điều này? Cảm ơn!

Chỉnh sửa: Đây là mã tôi đã sử dụng để giải quyết vấn đề này. Cảm ơn Kirk và 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);

bạn có thể gửi / gửi cho tôi mẫu cho dockwindow thêm vào không?

Câu trả lời:


6

Hãy thử sử dụng lệnh gọi winapi SetWindowPos với hWnd của điều khiển cửa sổ có thể gắn được (hoặc có thể là điều khiển thùng chứa cha mẹ hoặc ông bà) với cờ HWND_TOP.


Cảm ơn Kirk, tôi thực sự chỉ thử chính xác nhưng không có kết quả. Cửa sổ có thể gắn được không có điều khiển cha, nhưng thuộc tính Trái và Trên của nó là 0, vì vậy tôi cho rằng điều đó có nghĩa là nó thực sự có cửa sổ cha (không phải là ứng dụng ArcMap). Tôi thực sự ghét rằng không có cách nào dễ dàng hơn để làm điều này hơn là tìm hiểu về API Windows. Bạn đã có may mắn với điều này?
blah238

Cũng lạ, nhưng các thuộc tính Trái và Trên của lớp đồng lớp IWindowPocation là chính xác, nhưng phương thức Di chuyển của nó không có hiệu lực.
blah238

2
Sử dụng gián điệp ++ và nhìn vào một cửa sổ không bị khóa, tôi thấy rằng ông bà tuyệt vời của nó là arcmap. Vì vậy, tôi cho rằng zorder sẽ được thiết lập bởi ông bà của cửa sổ có thể gắn được. Bạn nói đúng - có vẻ như có một cách dễ dàng hơn.
Kirk Kuykendall

2
Nó thực sự là cửa sổ ông bà. Dựa vào cấu trúc này là không lý tưởng, vì nó có thể dễ dàng phá vỡ trong các phiên bản ArcMap trong tương lai. ESRI thực sự nên cung cấp một số giao diện để làm điều này.
Petr Krebs

Cảm ơn các bạn, đó là một chút của một khẩu hiệu nhưng tôi đã có thể làm cho nó hoạt động. Chỉnh sửa câu hỏi với giải pháp được mã hóa.
blah238
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.