Tạo cửa sổ chỉ nổi (không thể neo) trong ArcMap bằng ArcObjects?


9

Tôi đang tìm cách tạo một cửa sổ nổi trong ArcMap. Để đưa ra một ví dụ chỉ cần nhìn vào cửa sổ của công cụ Xác định.

Nổi có nghĩa là nó luôn ở phía trước tài liệu bản đồ mọi lúc và người dùng có thể tiếp tục làm việc với ArcMap. Tôi biết rằng giao diện IDockableWindowDef có thể được sử dụng để tạo các cửa sổ có thể gắn được, cũng có thể nổi, nhưng tôi không muốn chúng cập bến . Theo hiểu biết của tôi, không thể ngăn các biểu mẫu được tạo bởi IDockableWindowManager khỏi việc kết nối nếu ví dụ: người dùng đẩy chúng vào viền của cửa sổ ArcMap.

Có ý kiến ​​gì không?


Giải pháp là tìm kiếm các từ khóa như cửa sổ con và MDI. HTH

Giải pháp của vấn đề dường như dễ dàng như câu trả lời của @ llcf :

MyForm form = new MyForm();
form.Show(NativeWindow.FromHandle(new IntPtr(m_application.hWnd)));

Tôi thích cách này của NativeWindow - rất sạch sẽ.
Vidar

Câu trả lời:


7

Nếu trong .net tôi nghĩ các ví dụ tôi đã thấy sử dụng lớp trình trợ giúp như sau:

var form = new Form1();
form.Show(new WindowWrapper(_mxDocument.ActiveView.ScreenDisplay.hWnd));

public class WindowWrapper : System.Windows.Forms.IWin32Window
  {
    public WindowWrapper(IntPtr handle)
    {
      m_hwnd = handle;
    }
    public WindowWrapper(int handle)
    {
      m_hwnd = (IntPtr)handle;
    }
    public IntPtr Handle
    {
      get
      {
        return m_hwnd;
      }
    }
    private IntPtr m_hwnd;
  }

Đúng! Thay vì trình bao bọc của bạn, tôi đã sử dụng NativeWindow.FromHandle () hoàn toàn giống nhau. Nó hoạt động và có vẻ thanh lịch hơn so với giải pháp với user32.dll, theo quan điểm của tôi. Cảm ơn.
AndOne

3

Tôi đã tìm thấy câu trả lời cho vấn đề này với sự giúp đỡ của các diễn đàn ESRI cũ. Chỉ sử dụng các từ khóa sai cho đến bây giờ: / Giải pháp nằm trong SetWindowLong ():

// import external methods
[DllImport("user32.dll")]
static extern IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
[DllImport("user32.dll")]
static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
private int GWL_HWNDPARENT = -8;

public TestForm()
{
    InitializeComponent();

    IntPtr mxPtr = new IntPtr(GetApplicationReference().hWnd);
    if(IntPtr.Size == 8) { // needed for 64bit compatibility?
        SetWindowLongPtr(this.Handle, GWL_HWNDPARENT, mxPtr);
    } else {
        SetWindowLong(this.Handle, GWL_HWNDPARENT, mxPtr);
    }
}

Tôi không chắc chắn liệu khả năng tương thích 64 bit có được thực hiện đúng hay không vì SetWindowLongPtr () được cho là thay thế SetWindowLong () nhưng tôi không thể làm cho nó hoạt động trên máy 64 bit của mình. Luôn có một EntryPointNotFoundException. Nhưng ít nhất điều này hoạt động với thiết lập dev của tôi.


0

Nếu bạn đang sử dụng .NET, tạo Biểu mẫu Windows không mod và đặt thuộc tính TopMost thành true là cách tốt nhất. Bạn cũng sẽ muốn đặt thuộc tính Parent của Form cho ứng dụng ArcMap.

sealed class MyForm : Form
{
    // ... other impl ...

    public void SetMxParent(IApplication app)
    {
        IntPtr mxPtr = new IntPtr(app.hWnd);
        this.Parent = Control.FromHandle(mxPtr);

        // optionally
        this.TopMost = true;
    }
}

1
Cảm ơn, nhưng thật không may, điều này không hoạt động như yêu cầu. Với TopMost là đúng, biểu mẫu vẫn ở phía trước tất cả các cửa sổ khác ngay cả khi ArcMap được thu nhỏ. Nếu nó được đặt thành false, biểu mẫu sẽ bị ẩn đằng sau cửa sổ ArcMap.
AndOne
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.