ArcObjects kullanarak ArcMap'te yalnızca kayan (sabitlenemez) pencere mi oluşturuyorsunuz?


9

ArcMap'te kayan bir pencere oluşturmanın bir yolunu arıyorum. Bir örnek vermek için, Tanımlama aracının penceresine bakın.

Kayan, her zaman harita belgesinin önünde kaldığı ve kullanıcının ArcMap ile çalışmaya devam edebileceği anlamına gelir. Arabirim IDockableWindowDef, aynı zamanda yüzebilen yerleştirilebilir pencereler oluşturmak için kullanılabileceğini biliyorum, ancak onları yerleştirmek istemiyorum . Bildiğim kadarıyla, IDockableWindowManager tarafından oluşturulan formların örneğin kullanıcı ArcMap penceresinin kenarlığına doğru itmesi durumunda kenetlenmesini önlemek mümkün değildir.

Herhangi bir fikir?


Çözüm, alt pencere ve MDI gibi anahtar kelimeleri aramaktı. HTH

Sorunun çözümü @ llcf'nin cevabı kadar kolay görünüyor :

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

Bu NativeWindow yolunu seviyorum - çok temiz.
Vidar

Yanıtlar:


7

Eğer .net içinde gördüğüm örnekler aşağıdaki gibi bir yardımcı sınıf kullanır düşünüyorum:

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

Evet! Sarıcı yerine NativeWindow.FromHandle () kullandım. Bana göre, çalışıyor ve user32.dll ile çözüm daha zarif görünüyor. Teşekkürler.
AndOne

3

Bu sorunun cevabını eski ESRI forumlarının yardımıyla buldum. Şimdiye kadar yanlış anahtar kelimeleri kullanmıştım: / Çözüm SetWindowLong () dizininde yatmaktadır:

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

SetWindowLongPtr () SetWindowLong () yerine gerekiyordu çünkü 64bit uyumluluk doğru uygulandığından emin değilim ama 64bit makinemde çalışmak için alamadım. Her zaman bir EntryPointNotFoundException var. Ama en azından bu geliştirici kurulumumla çalışıyor.


0

.NET kullanıyorsanız, modelsiz bir Windows Formu oluşturmak ve TopMost özelliğini true olarak ayarlamak en iyi seçenektir. Ayrıca Form'un Üst özelliğini ArcMap uygulamasına ayarlamak istersiniz.

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
Teşekkürler, ama ne yazık ki bu talep edildiği gibi davranmıyor. TopMost doğru olduğunda, ArcMap küçültüldüğünde bile form diğer tüm pencerelerin önünde kalır. False değerine ayarlanırsa, form ArcMap penceresinin arkasına gizlenir.
AndOne
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.