Как исправить мерцание ListBox (только после того, как я свернул форму)? - PullRequest
0 голосов
/ 26 мая 2019

После того, как я свернул форму и поднял ее обратно, listBox (который является OwnerDrawned, так что я могу настроить цвета и поведение по своему вкусу) начинает мерцать при наведении курсора на элементы.

Как это исправить?

Я уже пробовал несколько решений, таких как https://www.codeproject.com/Answers/473893/FlickeringplusinplusaplusWindowsplusFormplusapplic и https://www.codeproject.com/Answers/728560/Remove-flickering-due-to-TableLayoutPanel-Panel-2, но также https://stackoverflow.com/a/3718648/10012792, но ни одно из них не устраняет мерцание ПОСЛЕ того, как я свернул приложение и вынул его резервное копирование.

    {
        private int _MouseIndex = -1;

        public Form1()
        {
            InitializeComponent();

            ResizeRedraw = true;
            DoubleBuffered = true;
        }
        public static void SetDoubleBuffered(System.Windows.Forms.Control c)
        {
            if (System.Windows.Forms.SystemInformation.TerminalServerSession)
                return;
            System.Reflection.PropertyInfo aProp = typeof(System.Windows.Forms.Control).GetProperty("DoubleBuffered", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
            aProp.SetValue(c, true, null);
        }
        protected override CreateParams CreateParams
        {
            get
            {
                // Activate double buffering at the form level.  All child controls will be double buffered as well.
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x02000000;  // Turn on WS_EX_COMPOSITED
                return cp;
            }
        }
        {
            DoubleBuffered = true; 

            if (e.Index < 0) return; 

            //e.DrawBackground();
            Color borderColor = Color.FromArgb(255, 42, 42, 42); 

            bool isItemSelected = ((e.State & DrawItemState.Selected) == DrawItemState.Selected);
            using (SolidBrush bgBrush = new SolidBrush(isItemSelected ? Color.FromArgb(255, 52, 52, 52) : Color.FromArgb(255, 29, 29, 29)))
            using (SolidBrush overlay = new SolidBrush(isItemSelected ? Color.FromArgb(255, 42, 42, 42) : Color.FromArgb(255, 42, 42, 42)))
            using (SolidBrush itemBrush = isItemSelected ? new SolidBrush(Color.FromArgb(255, 68, 201, 94)) : new SolidBrush(Color.FromArgb(255, 243, 243, 243)))
            {
                string itemText = listBoxTracks.GetItemText(listBoxTracks.Items[e.Index]); 

                e.Graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit; 
                SizeF size = e.Graphics.MeasureString(listBoxTracks.ToString(), e.Font); 
                e.Graphics.FillRectangle(bgBrush, e.Bounds); 
                e.Graphics.DrawRectangle(new Pen(borderColor), e.Bounds); 
                e.Graphics.DrawString(itemText, e.Font, itemBrush, e.Bounds.Left + (e.Bounds.Width / 22 - size.Width / 44), e.Bounds.Top + (e.Bounds.Height / 2 - size.Height / 2)); 

                if (e.Index == _MouseIndex)
                {
                    e.Graphics.FillRectangle(overlay, e.Bounds);
                    e.Graphics.DrawString(itemText, e.Font, itemBrush, e.Bounds.Left + (e.Bounds.Width / 22 - size.Width / 44), e.Bounds.Top + (e.Bounds.Height / 2 - size.Height / 2));
                }

            }
        }
        {
            int index = listBoxTracks.IndexFromPoint(e.Location);
            if (index != _MouseIndex)
            {
                _MouseIndex = index;
                listBoxTracks.Invalidate();
            }
        }
        {
            if (_MouseIndex > -1)
            {
                _MouseIndex = -1;
                listBoxTracks.Invalidate();
            }
        }

Я ожидаю, что вывод будет не мерцающим, поскольку методы, которые я использовал, должны это предотвратить.

Мне было трудно зарегистрировать его для показа, поскольку внутренняя запись с использованием Camtasia, оверлея Nvidia или моего iPhone SE не могла показать его впоследствии в записи. Мирилис Боевик! однако сделал на 144fps, см .: https://imgur.com/a/M1c0c6D

Исходный код здесь: https://mega.nz/#!kIJlAQ5S!l9hTXxYE0lcg4iNH3TUcIly3TaDCrtWlPs1xKttS7ws

...