كيف يمكنني المضيف WPF المحتوى في تطبيقات MFC?
-
06-07-2019 - |
سؤال
أنا ذاهب إلى الإجابة عن سؤالي هنا لأنني قضيت بضع ساعات التفكيك معا وأراد أن حصة ما وجدت في أمل أنني سوف ينقذ شخص آخر الحفر.
هناك MSDN تجول أن يحصل لك أكثر من وسيلة من هناك ، ولكن هناك عددا من القطع الرئيسية التي وجدت في أي مكان آخر.على سبيل المثال, تجول يقول لك على مكان الخط [System::STAThreadAttribute] قبل _tWinMain() التعريف ولكن إذا كنت تنفيذ معيار التطبيق MFC ثم لم يكن لديك _tWinMain() في التعليمات البرمجية المصدر.
إذا كان أي شيء هنا غير واضح لا تتردد في طرح الأسئلة و سوف تحرير الجواب لجعل الأمور أكثر وضوحا.
المحلول
الخطوة 1:تكوين التطبيق MFC تجميع مع CLR الدعم
أفضل طريقة لتحقيق التوافق بين الأم C++ مدارة .صافي رمز هو تجميع تطبيق C++ مدارة بدلا من مواليد C++.ويتم ذلك عن طريق الذهاب إلى خصائص تكوين المشروع.في إطار العامة هناك خيار "الشائعة لغة وقت التشغيل دعم".تعيين هذه القيمة إلى "الشائعة لغة وقت التشغيل دعم /clr".
الخطوة 2:إضافة WPF الجمعيات المشروع
انقر بزر الماوس الأيمن فوق المشروع في "مستكشف الحلول" ثم اختر "المراجع".انقر فوق "إضافة مرجع جديد".تحت .صافي علامة التبويب إضافة WindowsBase, PresentationCore, PresentationFramework النظام.تأكد من إعادة بناء كل شيء بعد إضافة أي إشارات من أجل الحصول على التقطت.
الخطوة 3:مجموعة STAThreadAttribute على التطبيق MFC
WPF يتطلب أن STAThreadAttribute على الرئيسية UI.تعيين هذا عن طريق الذهاب إلى خصائص تكوين المشروع.تحت رابط->خيارات متقدمة هناك خيار يسمى "CLR الموضوع السمة".تعيين هذه القيمة إلى "مؤشر الترابط STA سمة".
الخطوة 4:إنشاء مثيل من HwndSource التفاف WPF مكون
النظام:Windows::Interop::HwndSource هو .صافي الفئة التي يتعامل التفاعل بين MFC .صافي المكونات.إنشاء واحد باستخدام بناء الجملة التالي:
System::Windows::Interop::HwndSourceParameters^ sourceParams = gcnew System::Windows::Interop::HwndSourceParameters("MyWindowName");
sourceParams->PositionX = x;
sourceParams->PositionY = y;
sourceParams->ParentWindow = System::IntPtr(hWndParent);
sourceParams->WindowStyle = WS_VISIBLE | WS_CHILD;
System::Windows::Interop::HwndSource^ source = gcnew System::Windows::Interop::HwndSource(*sourceParams);
source->SizeToContent = System::Windows::SizeToContent::WidthAndHeight;
إضافة HWND الأعضاء متغير فئة الحوار ثم تعيين مثل هذا:m_hWnd = (HWND) المصدر->التعامل معها.ToPointer();
المصدر الكائن المرتبط WPF المحتوى ستظل موجودة حتى تتصل ::DestroyWindow(m_hWnd).
الخطوة 5:إضافة WPF السيطرة على المجمع HwndSource
System::Windows::Controls::WebBrowser^ browser = gcnew System::Windows::Controls::WebBrowser();
browser->Height = height;
browser->Width = width;
source->RootVisual = browser;
الخطوة 6:تبقى إشارة إلى WPF كائن
منذ المتصفح المتغير سوف تخرج من نطاق بعد الخروج من الوظيفة القيام إنشاء علينا بطريقة أو بأخرى عقد إشارة إلى ذلك.تمكنت الكائنات لا يمكن الأعضاء من غير المدارة الكائنات ولكن يمكنك استخدام المجمع قالب يسمى gcroot لانجاز هذه المهمة.
إضافة متغير عضو في فئة الحوار:
#include <vcclr.h>
gcroot<System::Windows::Controls::WebBrowser^> m_webBrowser;
ثم أضف السطر التالي إلى التعليمات البرمجية في الخطوة 5:
m_webBrowser = browser;
الآن يمكننا الوصول إلى الخصائص و الأساليب على WPF عنصرا من خلال m_webBrowser.