سؤال

أنا أكتب بعض السلوكيات المخصصة لـ a ToolStripDropDown يتحكم.أود أيضًا تعديل ToolStripDropDownButton نفسه لعرض شكل ملون.

أرى أنني أستطيع التعامل مع Paint الحدث ورسم ما أحب.ومع ذلك، هل هناك أي طريقة لجعل الزر يرسم الخلفية الافتراضية قبل أن أرسم الشكل؟سيكون من الصعب الحصول على الخلفية الصحيحة تمامًا، خاصة مع الإصدارات المستقبلية من .NET وWindows.

في نظام التشغيل Windows العادي، يمكنني استدعاء معالج proc الافتراضي قبل أو بعد كود الطلاء الخاص بي.لا أرى أي طريقة لتحقيق ذلك في .NET.أو ربما هناك طريقة لإخبار الزر برسم الخلفية فقط؟

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

المحلول

عندما تتعامل مع Paint حدث (على عكس تجاوز OnPaint طريقة في فئة مشتقة) يتم بالفعل استدعاء الفئة الأساسية (معالج proc الافتراضي).يتم رسم كل شيء كالمعتاد، وبعد ذلك تقوم بالرسم بشكل أساسي علاوة على ذلك في ال Paint حدث.ويمكنك أن ترى ذلك بوضوح هنا:

     Lime rectangle drawn over part of the drop-down button, clearly showing the default contents underneath

الحيلة هي التأكد من ترك ما يكفي من مستطيل القطع الخاص بعنصر التحكم مكشوفًا يعرض الجزء الذي تريده.ال e.ClipRectangle الخاصية تسترد كامل منطقة عميل الزر، لذلك إذا كنت فقط
املأ ذلك بحامل لون، وستقوم بتغطية سهم القائمة المنسدلة والخلفية الافتراضية أيضًا.تم إنشاء العرض التوضيحي أعلاه باستخدام نموذج التعليمات البرمجية القبيح التالي:

private void ToolStripDropDownButton1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.FillRectangle(Brushes.Chartreuse,
                             e.ClipRectangle.X + 3, e.ClipRectangle.Y + 3,
                             e.ClipRectangle.Width - 12,
                             e.ClipRectangle.Height - 12);
}

بخلاف ذلك، لا أعتقد أن هناك طريقة لتخصيص ما يتم رسمه بواسطة الفئة الأساسية بالضبط.يميل رسم المالك (على الأقل في WinForms) إلى أن يكون مسألة كل شيء أو لا شيء.يمكنك الحصول على السيطرة الكاملة،
ولكن ذلك يأتي على حساب الاضطرار إلى تنفيذ كل شيء بنفسك.


بالطبع، إذا لم تكن قد لاحظت بالفعل، فإن ToolStrip يتحكم بالفعل لا يبدو وكأنه عنصر تحكم Windows الأصلي.والأسوأ من ذلك أنه كذلك دائماً سيبدو تمامًا كما هو الآن،
حتى في الإصدارات المستقبلية من Windows التي تعمل على إصلاح واجهة المستخدم بالكامل.(ال MenuStrip ابتليت بها
هذه الظاهرة نفسها، والفرق واضح جدًا في نظام التشغيل Windows Vista/7 حيث تغيرت قوائم API القياسية بشكل كبير).والسبب هو أن كلا عنصري التحكم مرسومان بالكامل في كود C# المكتوب في تطبيقات WinForms الخاصة بهما.أنا شخصياً أعتقد أنه يبدو مبتذلاً إلى حد يبعث على السخرية، ولن أستخدمه في أحد تطبيقاتي على الرهان.

أنت يستطيع قم بتعيين عارض مخصص يستخدم UxTheme API لرسم الأزرار، والتي سيتم الحصول عليها كثيراً أقرب إلى تقريب مظهر القوائم وأشرطة الأدوات الأصلية.تتوفر عينة شاملة جدًا هنا.لقد كتبت شيئًا مشابهًا جدًا لتطوير WinForms والذي قمت به والذي يتطلب الميزات الإضافية لـ ToolStrip فئة (مثل تضمين مربعات التحرير والسرد) لا يقدمها
مدرسة قديمة MainMenu و ToolBar عناصر التحكم التي تقوم ببساطة بتغليف مكافئات Windows API الخاصة بها.من خلال اختيار القيام بالأشياء بهذه الطريقة، لديك المزيد من التحكم في أجزاء عارض الفئة الأساسية التي ترغب في الاتصال بها بالضبط، حيث أنك كتبت التعليمات البرمجية بشكل صريح بنفسك.موصى به للغاية إذا كنت
النوع الذي يهتم على الإطلاق بواجهة المستخدم أو الشعور الأصلي أو تجربة المستخدم.

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