ArcObject를 사용하여 ArcMap에서 부동 전용 (도킹 불가능) 창을 생성합니까?


9

ArcMap에서 부동 창을 만드는 방법을 찾고 있습니다. 예를 들어 확인 도구의 창을 살펴보십시오.

플로팅은 항상지도 문서 앞에 머무르고 사용자가 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이 발생했습니다. 그러나 적어도 이것은 내 dev 설정에서 작동합니다.


0

.NET을 사용하는 경우 모덜리스 Windows Form을 만들고 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 창 뒤에 숨겨집니다.
AndOne
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.