ArcObjectsを使用して、ArcMapにフローティング専用(ドッキング不可)ウィンドウを作成しますか?


9

ArcMapでフローティングウィンドウを作成する方法を探しています。例として、Identifyツールのウィンドウを見てください。

フローティングとは、常にマップドキュメントの前面にあり、ユーザーがArcMapを引き続き使用できることを意味します。インターフェイスIDockableWindowDefを使用して、フローティングも可能なドッキング可能ウィンドウを作成できることは知っていますが、ドッキングさせたくありません。私の知る限り、IDockableWindowManagerによって作成されたフォームがドッキングされないようにすることはできません。たとえば、ユーザーがフォームをArcMapウィンドウの境界にプッシュした場合。

何か案は?


解決策は、子ウィンドウやMDIなどのキーワードを検索することでした。HTH

問題の解決策は@llcfの答えと同じくらい簡単なようです:

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

私はこのNativeWindowの方法が好きです-とてもきれいです。
Vidar

回答:


7

.netの場合、私が見た例ではヘルパークラスを次のように使用していると思います:

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

はい!ラッパーの代わりに、まったく同じことをするNativeWindow.FromHandle()を使用しました。私の考えでは、それは機能し、user32.dllを使用したソリューションよりもエレガントに見えます。ありがとう。
AndOne

3

以前のESRIフォーラムの助けを借りて、この問題に対する答えを見つけました。今まで間違ったキーワードを使用していた:/解決策は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);
    }
}

SetWindowLongPtr()がSetWindowLong()に取って代わるはずなので、64ビットの互換性が正しく実装されているかどうかはよくわかりませんが、64ビットマシンで動作させることができませんでした。常にEntryPointNotFoundExceptionが発生しました。しかし、少なくともこれは私の開発セットアップで動作します。


0

.NETを使用している場合は、モードレスWindowsフォームを作成し、TopMostプロパティをtrueに設定することをお勧めします。また、フォームのParentプロパティを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
おかげで、残念ながらこれは要求されたように動作しません。TopMostがtrueの場合、ArcMapが最小化されているときでも、フォームは他のすべてのウィンドウの前面に表示されます。falseに設定すると、フォームはArcMapウィンドウの背後に隠されます。
AndOne
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.