ArcObjects का उपयोग करके ArcMap में फ्लोटिंग-ओनली (नॉन-डॉकेबल) विंडो बनाना?


9

मैं ArcMap में एक फ्लोटिंग विंडो बनाने का एक तरीका ढूंढ रहा हूं। एक उदाहरण देने के लिए बस आइडेंटिफाई टूल की विंडो को देखें।

फ्लोटिंग का अर्थ है कि यह हर समय मानचित्र दस्तावेज़ के सामने रहता है और उपयोगकर्ता आर्कपैक के साथ काम करना जारी रख सकता है। मुझे पता है कि इंटरफ़ेस IDockableWindowDef का उपयोग डॉक करने योग्य विंडो बनाने के लिए किया जा सकता है जो फ्लोट भी कर सकते हैं, लेकिन मैं उन्हें डॉक नहीं करना चाहता । मेरे ज्ञान के लिए यह संभव नहीं है कि IDockableWindowManager द्वारा बनाए गए प्रपत्रों को डॉकिंग से रोका जाए, जैसे कि उपयोगकर्ता उन्हें ArcMap विंडो की सीमा पर धकेलता है।

कोई विचार?


इसका समाधान बाल खिड़की और एमडीआई जैसे कीवर्ड की खोज करना था। HTH

समस्या का समाधान @ llcf के उत्तर जितना आसान लगता है :

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

मुझे यह NativeWindow तरीका पसंद है - बहुत साफ।
विदर्भ

जवाबों:


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 के साथ समाधान की तुलना में अधिक सुरुचिपूर्ण लगता है। धन्यवाद।
एंडऑन

3

मुझे इस समस्या का उत्तर पुराने ईएसआरआई मंचों की मदद से मिला। अभी तक गलत कीवर्ड का उपयोग किया था: / समाधान 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 का उपयोग कर रहे हैं, तो एक मॉडल रहित विंडोज फॉर्म बनाना और टॉपमोस्ट संपत्ति को सही पर सेट करना सबसे अच्छा दांव है। आप आर्कप्लिकेशन एप्लिकेशन को फॉर्म की पैरेंट प्रॉपर्टी सेट करना चाहते हैं।

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 को छोटा किया जाता है। यदि इसे गलत पर सेट किया गया है, तो फॉर्म आर्कपॉपर विंडो के पीछे छिपा होगा।
एंडो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.