Membuat jendela hanya-mengambang (non-dockable) di ArcMap menggunakan ArcObjects?


9

Saya mencari cara untuk membuat jendela apung di ArcMap. Untuk memberikan contoh, lihat saja jendela alat Identifikasi.

Mengambang berarti tetap di depan dokumen peta setiap saat dan pengguna dapat terus bekerja dengan ArcMap. Saya tahu bahwa antarmuka IDockableWindowDef dapat digunakan untuk membuat windows dockable yang juga dapat mengambang, tetapi saya tidak ingin mereka merapat . Setahu saya itu tidak mungkin untuk mencegah formulir yang dibuat oleh IDockableWindowManager dari docking jika misalnya pengguna mendorong mereka ke perbatasan jendela ArcMap.

Ada ide?


Solusinya adalah mencari kata kunci seperti child window dan MDI. HTH

Solusi masalahnya tampaknya semudah jawaban @ llcf :

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

Saya suka cara NativeWindow ini - sangat bersih.
Vidar

Jawaban:


7

Jika dalam .net saya pikir contoh yang saya lihat menggunakan kelas pembantu seperti di bawah ini:

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;
  }

Iya! Alih-alih pembungkus Anda, saya menggunakan NativeWindow.FromHandle () yang tidak persis sama. Ini berfungsi dan tampaknya lebih elegan daripada solusi dengan user32.dll, dalam pandangan saya. Terima kasih.
AndOne

3

Saya menemukan jawaban untuk masalah ini dengan bantuan dari forum ESRI yang lebih lama. Baru saja menggunakan kata kunci yang salah sampai sekarang: / Solusinya terletak pada 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);
    }
}

Saya tidak begitu yakin apakah kompatibilitas 64bit diimplementasikan dengan benar karena SetWindowLongPtr () seharusnya menggantikan SetWindowLong () tapi saya tidak bisa membuatnya bekerja di mesin 64bit saya. Selalu mendapat EntryPointNotFoundException. Tapi setidaknya ini berfungsi dengan pengaturan dev saya.


0

Jika Anda menggunakan .NET, membuat Windows Form modeless dan mengatur properti TopMost menjadi true adalah yang terbaik. Anda juga ingin mengatur properti Form's Parent ke aplikasi 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
Terima kasih, tapi sayangnya ini tidak berlaku seperti yang diminta. Dengan TopMost yang benar, formulir tetap berada di depan semua jendela lain bahkan ketika ArcMap diperkecil. Jika disetel ke false, formulir akan disembunyikan di balik jendela ArcMap.
AndOne
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.