سؤال

أقوم بإنشاء عنصر تحكم 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 في السؤال!

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