ماذا أفعل الخطأ في سيطرة بلدي "HorizontalRule" المخصصة؟

StackOverflow https://stackoverflow.com/questions/757131

سؤال

لقد كتبت التحكم التالية (بسيطة للغاية) للاستخدام في تطبيق (تمت إزالة التعليقات للإيجاز):

public partial class HorizontalRule : Control
{
    public HorizontalRule()
    {
        InitializeComponent();
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        var g = e.Graphics;

        var rect = new Rectangle(
            this.ClientRectangle.Left,
            this.ClientRectangle.Height / 2 + 1, 
            this.ClientRectangle.Width,
            1);

        ControlPaint.DrawBorder3D(g, rect, Border3DStyle.Etched);

        return;
    }
}

إخلاء المسئولية: أنا مبتدئ في رسم عناصر التحكم الخاصة بي.

اخترت رسم الخط بهذه الطريقة بناء على توصية في إرشادات نظام التشغيل Vista UX التي تشير إلى مستطيل محفور من الارتفاع 1 للفواصل.

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

ما الخطأ الذي افعله؟

تحديث:

حسب الاقتراح، حاولت الاتصال Base.onpaint بدلا من الأول. لا أعرف ما الذي كان قد تغير، ولا يبدو أنه قد تغير أي شيء أيضا.

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

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

المحلول 2

يمكنني اختراق حل لا ينتج عنه تضمين من خلال تجاوز OnResize () لإبطال التحكم بالكامل:

protected override void OnResize(EventArgs e)
{
    base.OnResize(e);

    this.Invalidate();
}

لست متأكدا من أن هذا هو الحل "الصحيح".

نصائح أخرى

لا تتصل base.OnPaint, أو الاتصال به الأخير (لا أستطيع التذكير الآن).

أيضا، حاول تجاوز طريقة الطلاء الخلفية، لذلك لا يسمي القاعدة.

أود أن أرسم هذا على صورة نقطية ثم رسم الصورة النقطية بدلا من القلق بشأن طلاءها في كل مرة.

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