Erstellen eines Nur-Floating-Fensters (nicht andockbar) in ArcMap mit ArcObjects?

9

Ich suche nach einer Möglichkeit, ein schwebendes Fenster in ArcMap zu erstellen. Um ein Beispiel zu geben, schauen Sie einfach in das Fenster des Identifizierungswerkzeugs.

Floating bedeutet, dass es jederzeit vor dem Kartendokument bleibt und der Benutzer weiterhin mit ArcMap arbeiten kann. Ich weiß, dass die Schnittstelle IDockableWindowDef verwendet werden kann, um andockbare Fenster zu erstellen, die auch schweben können, aber ich möchte nicht, dass sie andocken . Meines Wissens ist es nicht möglich, das Andocken von von IDockableWindowManager erstellten Formularen zu verhindern, wenn der Benutzer sie beispielsweise an den Rand des ArcMap-Fensters schiebt.

Irgendwelche Ideen?


Die Lösung bestand darin, nach Schlüsselwörtern wie untergeordnetem Fenster und MDI zu suchen. HTH

Die Lösung des Problems scheint so einfach zu sein wie die Antwort von @ llcf :

MyForm form = new MyForm();
form.Show(NativeWindow.FromHandle(new IntPtr(m_application.hWnd)));
Und ein
quelle
Ich mag diesen NativeWindow-Weg - sehr sauber.
Vidar

Antworten:

7

Wenn ich denke, dass in .net die Beispiele, die ich gesehen habe, eine Hilfsklasse wie folgt verwenden:

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

quelle
Ja! Anstelle Ihres Wrappers habe ich NativeWindow.FromHandle () verwendet, das genau das Gleiche tut. Es funktioniert und wirkt meiner Ansicht nach eleganter als die Lösung mit user32.dll. Vielen Dank.
AndOne
3

Die Antwort auf dieses Problem habe ich mit Hilfe der älteren ESRI-Foren gefunden. Hatte gerade die falschen Schlüsselwörter verwendet: / Die Lösung liegt in 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);
    }
}

Ich bin mir nicht ganz sicher, ob die 64-Bit-Kompatibilität richtig implementiert ist, da SetWindowLongPtr () SetWindowLong () ersetzen soll, aber ich konnte es auf meinem 64-Bit-Computer nicht zum Laufen bringen. Ich habe immer eine EntryPointNotFoundException erhalten. Aber zumindest funktioniert das mit meinem Entwickler-Setup.

Und ein
quelle
0

Wenn Sie .NET verwenden, ist es am besten, ein modellloses Windows Form zu erstellen und die TopMost-Eigenschaft auf true zu setzen. Sie möchten auch die übergeordnete Eigenschaft des Formulars für die ArcMap-Anwendung festlegen.

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;
    }
}
Jim B.
quelle
1
Danke, aber leider verhält sich das nicht wie gewünscht. Wenn TopMost true ist, bleibt das Formular vor allen anderen Fenstern, auch wenn ArcMap minimiert ist. Wenn der Wert auf false gesetzt ist, wird das Formular hinter dem ArcMap-Fenster ausgeblendet.
AndOne