使用ArcObjects在ArcMap中创建仅浮动(不可停靠)窗口?


9

我正在寻找一种在ArcMap中创建浮动窗口的方法。举个例子,看看“识别”工具的窗口。

浮动表示它始终处于地图文档的前面,并且用户可以继续使用ArcMap。我知道IDockableWindowDef接口可用于创建也可以浮动的可停靠窗口,但是我不希望它们停靠。据我所知,如果用户将其推到ArcMap窗口的边界,则无法阻止IDockableWindowManager创建的表单停靠。

有任何想法吗?


解决方案是搜索子窗口和MDI之类的关键字。高温超导

问题的解决方案似乎就像@llcf的答案一样简单:

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

我喜欢这种NativeWindow方式-非常干净。
维达尔

Answers:


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 2010年

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

我不太确定是否正确实现了64位兼容性,因为SetWindowLongPtr()应该取代了SetWindowLong(),但是我无法使其在我的64位计算机上正常工作。总是有一个EntryPointNotFoundException。但这至少与我的开发设置兼容。


0

如果您使用的是.NET,最好的选择是创建无模式的Windows窗体并将TopMost属性设置为true。您还需要将Form的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窗口的后面。
2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.