التخزين المؤقت المزدوج مشكلة مشتقة مالك مرسومة TabControl?

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

سؤال

لقد استمدت TabControl بغرض تمكين التخزين المؤقت المزدوج ، باستثناء شيء يعمل كما هو متوقع.هنا هو TabControl كود:

class DoubleBufferedTabControl : TabControl
{
    public DoubleBufferedTabControl() : base()
    {
        this.DoubleBuffered = true;
        this.SetStyle
            (
                ControlStyles.UserPaint |
                ControlStyles.AllPaintingInWmPaint |
                ControlStyles.ResizeRedraw |
                ControlStyles.OptimizedDoubleBuffer |
                ControlStyles.SupportsTransparentBackColor,
                false
            );
    }
}

هذا Tabcontrol ثم يتم تعيين مع انها رسم وضع 'OwnerDrawnFixed' لذلك أنا يمكن أن تغير الألوان.هنا هو العرف طريقة الرسم:

    private void Navigation_PageContent_DrawItem(object sender, DrawItemEventArgs e)
    {
        //Structure.
        Graphics g = e.Graphics;
        TabControl t = (TabControl)sender;
        TabPage CurrentPage = t.TabPages[e.Index];

        //Get the current tab
        Rectangle CurrentTabRect = t.GetTabRect(e.Index);

        //Get the last tab.
        Rectangle LastTab = t.GetTabRect(t.TabPages.Count - 1);

        //Main background rectangle.
        Rectangle BackgroundRect = new Rectangle(LastTab.Width, t.Bounds.Y - 4, t.Width - (LastTab.Width), t.Height);

        //Tab background rectangle.
        Rectangle TabBackgroundRect = new Rectangle(0, LastTab.Y + LastTab.Height, LastTab.Width, t.Bounds.Height - (LastTab.Y + LastTab.Height));

        //Set anitialiasing for the text.
        e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;

        //String format for the text.
        StringFormat StringFormat = new StringFormat();
        StringFormat.Alignment = StringAlignment.Center;
        StringFormat.LineAlignment = StringAlignment.Center;

        //Fill the background.
        g.FillRectangle(Brushes.LightGray, BackgroundRect);
        g.FillRectangle(Brushes.Bisque, TabBackgroundRect);

        //Draw the selected tab.
        if(e.State == DrawItemState.Selected)
        {
            g.FillRectangle(Brushes.White, e.Bounds);
            Rectangle SelectedTabOutline = new Rectangle(e.Bounds.X + 2, e.Bounds.Y + 2, e.Bounds.Width, e.Bounds.Height - 4);
            g.DrawRectangle(new Pen(Brushes.LightGray, 4f), SelectedTabOutline);
            g.DrawString(CurrentPage.Text, new Font("Arial", 12f, FontStyle.Bold, GraphicsUnit.Point), new SolidBrush(Color.FromArgb(70, 70, 70)), CurrentTabRect, StringFormat);
        }
        else
        {
            g.FillRectangle(new SolidBrush(Color.FromArgb(230, 230, 230)), e.Bounds);
            g.DrawString(CurrentPage.Text, new Font("Arial", 12f, FontStyle.Regular, GraphicsUnit.Point), Brushes.Gray, CurrentTabRect, StringFormat);
        }

    }

ولكن دون جدوى ومع ذلك ، كما أن هذه السيطرة ليست مزدوجة مخزنة و لا تزال تومض عند تغيير حجمها.

أي أفكار ؟

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

المحلول

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

نصائح أخرى

أولا, يمكنك التخلص من الخاص بك TabControl كود تشغيل التخزين المؤقت, ثم على الفور إيقاف تشغيله ، حتى أنها لا تفعل في الواقع أي شيء مفيد.

جزء من المشكلة هو أن تحاول أن ترسم فقط جزء من TabControl.

أسهل حل أن يعطي حوالي 90% الحل (لا يزال من الممكن الحصول على وميض) إضافة هذا إلى النموذج الخاص بك الدرجة:

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        cp.ExStyle |= 0x02000000;
        return cp;
    }
}

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

تحرير:لاحظ أن هذا سوف تعمل فقط في XP وما بعدها.

كانت لدي مشاكل مع التخزين المؤقت المزدوج على يتحكم في الماضي الطريقة الوحيدة لوقف وميض ضمان ورثت OnPaintBackground الأسلوب لم يطلق.(انظر التعليمات البرمجية أدناه) سوف تحتاج أيضا إلى ضمان كامل باكغوند هي التي رسمت خلال الطلاء الخاص بك الاتصال.

protected override void OnPaintBackground( PaintEventArgs pevent )
{
    //do not call base - I don't want the background re-painted!
}

لست متأكدا ولكن قد حاول التخزين المؤقت المزدوج التحكم الذي يحتوي على عنصر تحكم علامة التبويب.

بحثت قليلا جدا ، حاولت التعليمات البرمجية الخاصة بك وكل ما كنت أفكر فيه, ولكن أنا لا أرى وسيلة للتخلص من وميض.للأسف في بلدي التجارب حتى العادية (غير المالك-تعادل) عنصر تحكم علامة التبويب ومضات خلال تغيير حجم.

من أجل ما يستحق إيقاف "إظهار محتويات الإطار أثناء السحب" سوف إصلاحه ، ولكن أنا أدرك أنه قد لا يكون مفيدا.

أعتقد أنه لا يعمل لأنه يمكنك تعطيل التخزين المؤقت المزدوج!

كل this.DoubleBuffered = true لا يتم تعيين ControlStyles.OptimizedDoubleBuffer إلى true.منذ كنت تعطيل هذا العلم في السطر التالي من البرنامج الخاص بك, أنت حقا لا تفعل شيئا.إزالة ControlStyles.OptimizedDoubleBuffer (وربما ControlStyles.AllPaintingInWmPaint) وينبغي أن تعمل من أجلك.

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