سؤال

أقوم بإضافة مربعات حوار C# WPF إلى تطبيق C++ MFC موجود، باستخدام طبقة واجهة C++/CLI.لدي أشياء تعمل، باستثناء أنني أواجه مشكلة في الطريقة.على سبيل المثال:

  1. يعرض تطبيق MFC مربع حوار WPF باستخدام ShowDialog.يعمل كما هو متوقع.
  2. يعرض مربع حوار WPF مربع حوار MFC باستخدام DoModal.يتم إخفاء مربع حوار WPF خلف تطبيق C++ الأساسي، ولا يتم تعطيله إلا إذا قمت بتغيير IsEnabled يدويًا.ليس مثاليا، لكنه يعمل.
  3. الآن، تم إغلاق مربع حوار MFC.الآن لسبب ما، تم تمكين تطبيق MFC الأساسي، في حين أنه لا يزال من المفترض أن يكون معطلاً بسبب عدم إغلاق مربع حوار WPF.وهذا أمر سيء، لأنه يسمح الآن للمستخدم بالقيام بأشياء مجنونة بينما لا يزال مربع حوار WPF مفتوحًا.

لدي شعور بأنه سيكون من الأفضل أن أتمكن من ضبط مربعات حوار الوالدين بشكل صحيح.لكن حتى الآن لم أتمكن من تعيين أصل مربع حوار MFC كمربع حوار WPF، أو العكس.وأنا لا أعرف حتى إذا كان هذا سيصلح الأمر.

أيه أفكار؟

هل كانت مفيدة؟

المحلول

عند فتح CDialog، الحيلة هي استخدام WindowsInteropHelper للحصول على HWND لمربع حوار WPF الأصلي.بعد ذلك، يمكنك استخدام CWnd::Attach لالتفاف HWND في فئة CWnd لتمريرها إلى مُنشئ CDialog.

كانت المشكلة التي واجهتني هي أنني قمت بالفعل بإنشاء CDialog، ولكن لم يتم عرضه بعد.لا يمكن استخدام الإصدارات المختلفة من SetParent إلا إذا كانت النافذة الفرعية المستهدفة لديك تحتوي بالفعل على مؤشر صالح.اضطررت إلى كتابة وظيفة جديدة في فئة CDialog الخاصة بي لتعيين m_wndParent، وهو ما تستخدمه كأصل عندما تقوم في النهاية بإنشاء مربع الحوار.ثم كل شيء يعمل بشكل رائع!

بطريقة ما، فإن إنشاء مربعات حوار WPF من مربعات حوار MFC "يعمل فقط".انه سحر.

نصائح أخرى

عند عرض مربع حوار WPF، هل تستخدم ملف فئة HwndSource لتغليف نافذة WPF؟إذا كان الأمر كذلك، قد تكون قادرا على ::SetParent نافذة WPF بالإضافة إلى استخدام خاصية HwndSource.Handle لتعيين أصل الطفل الفرعي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top