আরকোবজেক্টস ব্যবহার করে আর্কম্যাপে কেবলমাত্র ভাসমান (নন-ডকএবল) উইন্ডো তৈরি করছেন?


9

আমি আর্কম্যাপে ভাসমান উইন্ডো তৈরির জন্য একটি উপায় খুঁজছি। একটি উদাহরণ দিতে কেবল সনাক্তকরণ সরঞ্জামটির উইন্ডোটি দেখুন।

ভাসমান মানে হ'ল এটি সর্বদা মানচিত্রের নথির সামনে থাকে এবং ব্যবহারকারী আর্কম্যাপের সাথে কাজ চালিয়ে যেতে পারে। আমি জানি যে IDockableWindowDef ইন্টারফেসটি ডকেটেবল উইন্ডো তৈরি করতে ব্যবহার করা যেতে পারে যা ভাসতে পারে, তবে আমি তাদের ডক করতে চাই না । আমার জানা মতে আইডকএবল উইন্ডো ম্যানেজারের তৈরি ফর্মগুলি ডকিং থেকে আটকাতে পারবেন না যদি উদাহরণস্বরূপ ব্যবহারকারী তাদের আর্কম্যাপ উইন্ডোর সীমানায় ঠেলে দেয় p

কোন ধারনা?


সমাধানটি ছিল উইন্ডো এবং এমডিআই-এর মতো কীওয়ার্ডগুলি অনুসন্ধান করা। আছে HTH

সমস্যার সমাধান @ এলএলসিএফ এর উত্তরের মতোই সহজ বলে মনে হচ্ছে :

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

আমি এই নেটিভ উইন্ডো উপায় পছন্দ করি - খুব পরিষ্কার।
ভিদার

উত্তর:


7

নেট। যদি আমি মনে করি যে উদাহরণগুলি আমি দেখেছি সেগুলি নীচের মতো একটি সহায়ক শ্রেণি ব্যবহার করে:

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

হ্যাঁ! আপনার মোড়কের পরিবর্তে আমি নেটিভ উইন্ডো ব্যবহার করেছি rom এটি আমার বিবেচনায় ব্যবহারকারীর সাথে .৩.dll সমাধানের চেয়ে কাজ করে এবং আরও মার্জিত বলে মনে হয়। ধন্যবাদ।
AndOne

3

পুরানো ইএসআরআই ফোরামের সাহায্যে আমি এই সমস্যার উত্তর খুঁজে পেয়েছি। এখনও অবধি ভুল কীওয়ার্ড ব্যবহার করেছিলেন: / সমাধানটি সেটউইনডলং () এ রয়েছে:

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

আমি 647 বেটের সামঞ্জস্যতা সঠিকভাবে প্রয়োগ করা হয়েছে কিনা তা সম্পর্কে আমি নিশ্চিত নই কারণ সেট উইন্ডোলংপ্রিট () সেটউইন্ডোলং () কে ছাড়িয়ে গেছে বলে মনে করা হচ্ছে তবে আমি এটি আমার 64 বিট মেশিনে কাজ করতে সক্ষম হইনি। সর্বদা একটি এন্ট্রিপয়েন্ট নটফাউন্ডএক্সসেপশন পেয়েছে। তবে কমপক্ষে এটি আমার ডেভ সেটআপের সাথে কাজ করে।


0

আপনি যদি নেট ব্যবহার করে থাকেন তবে একটি মোডলেস উইন্ডোজ ফর্ম তৈরি করা এবং টপমস্টের সম্পত্তিটিকে সত্যে সেট করা সেরা বেট। আপনি ফর্মের পিতামাতার সম্পত্তিটি আরকম্যাপ অ্যাপ্লিকেশনেও সেট করতে চাইবেন।

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
ধন্যবাদ, তবে দুর্ভাগ্যক্রমে এটি অনুরোধের মতো আচরণ করে না। টপমোস্টটি সত্য হওয়ার সাথে সাথে ফর্মটি অন্য সমস্ত উইন্ডোগুলির সামনে থাকে এমনকি আর্কম্যাপটি ছোট করা হলেও। যদি এটি মিথ্যাতে সেট করা থাকে তবে ফর্মটি আর্কম্যাপ উইন্ডোর পিছনে লুকানো থাকবে।
AndOne
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.