การสร้างหน้าต่างแบบลอยเท่านั้น (ไม่สามารถเทียบท่าได้) ใน ArcMap โดยใช้ ArcObjects?


9

ฉันกำลังมองหาวิธีสร้างหน้าต่างลอยใน ArcMap เพื่อให้ตัวอย่างเพียงแค่ดูที่หน้าต่างของเครื่องมือระบุ

Floating หมายถึงมันอยู่ข้างหน้าเอกสารแผนที่ตลอดเวลาและผู้ใช้สามารถทำงานกับ ArcMap ได้ ฉันรู้ว่าอินเทอร์เฟซ IDockableWindowDef สามารถใช้เพื่อสร้าง windows dockable ซึ่งสามารถลอยได้แต่ฉันไม่ต้องการให้เชื่อมต่อ จากความรู้ของฉันมันเป็นไปไม่ได้ที่จะป้องกันไม่ให้ฟอร์มที่สร้างขึ้นโดย 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);
    }
}

ฉันไม่แน่ใจว่าการใช้งานร่วมกับ 64 บิตนั้นถูกต้องหรือไม่เพราะ SetWindowLongPtr () ควรจะแทนที่ SetWindowLong () แต่ฉันไม่สามารถทำให้มันทำงานบนเครื่อง 64 บิตของฉันได้ รับ EntryPointNotFoundException เสมอ แต่อย่างน้อยก็ใช้ได้กับการตั้งค่า dev ของฉัน


0

หากคุณกำลังใช้. NET การสร้างแบบฟอร์ม Windows ที่สร้างเองและการตั้งค่าคุณสมบัติ TopMost เป็น True นั้นเป็นวิธีที่ดีที่สุด คุณจะต้องตั้งค่าคุณสมบัติหลักของแบบฟอร์มเป็นแอปพลิเคชัน 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 จริงแบบฟอร์มอยู่ด้านหน้าของหน้าต่างอื่น ๆ ทั้งหมดแม้ว่า ArcMap จะลดลง ถ้าตั้งค่าเป็นเท็จฟอร์มจะถูกซ่อนอยู่หลังหน้าต่าง ArcMap
AndOne
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.