لا يتم استدعاء Windows Forms UserControl
-
02-07-2019 - |
سؤال
أقوم بإنشاء عنصر تحكم Windows Forms مشتق من UserControl ليتم تضمينه في تطبيق WPF.لقد اتبعت بشكل عام الإجراءات الواردة في هذا الرابط.
public ref class CTiledImgViewControl : public UserControl
{
...
virtual void OnPaint( PaintEventArgs^ e ) override;
...
};
وفي ملف CPP الخاص بي:
void CTiledImgViewControl::OnPaint( PaintEventArgs^ e )
{
UserControl::OnPaint(e);
// do something interesting...
}
يتم تجميع كل شيء وتشغيله، ولكن لا يتم استدعاء طريقة OnPaint مطلقًا.
أي أفكار للأشياء التي يجب البحث عنها؟لقد فعلت الكثير باستخدام لغة C++، ولكنني جديد تمامًا على WinForms وWPF، لذا قد يكون الأمر واضحًا...
المحلول
ال OnPaint
لن يتم استدعاؤهم عادةً في ملف UserControl
إلا إذا قمت بتعيين النمط المناسب عند إنشائه باستخدام SetStyle
طريقة.تحتاج إلى تعيين UserPaint
أسلوب صحيح ل OnPaint
ليتم الاتصال بك.
SetStyle(ControlStyles::UserPaint, true);
تحديث
لقد واجهت هذه المشكلة مؤخرًا بنفسي وذهبت للبحث عن إجابة.كنت أرغب في إجراء بعض الحسابات أثناء الطلاء (للاستفادة من المعالجة الفريدة لرسائل الطلاء) ولكن لم أتلقى دائمًا اتصالاً بذلك OnPaint
.
بعد البحث مع العاكس، اكتشفت ذلك OnPaint
يسمى فقط إذا كان مستطيل القطع المقابل WM_PAINT
الرسالة ليست فارغة.لي UserControl
يحتوي المثيل على عنصر تحكم فرعي يملأ منطقة العميل بالكامل وبالتالي يقوم بقصها كلها.وهذا يعني أن مستطيل القطع كان فارغًا، وبالتالي لا OnPaint
يتصل.
لقد عملت حول هذا عن طريق التجاوز WndProc
وإضافة معالج ل WM_PAINT
مباشرة لأنني لم أجد طريقة أخرى لتحقيق ما أردت.
نصائح أخرى
لقد قمت بحل المشكلة، في حال كان أي شخص مهتمًا.كان ذلك بسبب تضمين عنصر التحكم WinForms الخاص بي في ViewBox.لقد غيرتها إلى شبكة وبدأت على الفور في الحصول على أحداث الطلاء.أعتقد أنه عند طرح أسئلة حول WPF، يجب عليك دائمًا تضمين XAML في السؤال!