ListBox мерцает при выборе элементов


        private void listBoxEx1_MeasureItem(object sender, MeasureItemEventArgs e)
        {
            e.ItemHeight = 15;
        }

        private void listBoxEx1_DrawItem(object sender, DrawItemEventArgs e)
        {
            if (e.Index >= 0)
            {
                bool isSelected = (e.State & DrawItemState.Selected) == DrawItemState.Selected;
                string t = listBoxEx1.Items[e.Index].ToString();
                e.Graphics.DrawString(t, listBoxEx1.Font, Brushes.Lime, new PointF(0.0f, e.Bounds.Y));
                if (isSelected)
                {
                    e.Graphics.DrawRectangle(Pens.White, e.Bounds);
                }
            }
        }

        private void listBoxEx1_DragEnter(object sender, DragEventArgs e)
        {
            e.Effect = DragDropEffects.Copy;
        }

        private void listBoxEx1_DragDrop(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                string[] strings = (string[])e.Data.GetData(DataFormats.FileDrop);
                listBoxEx1.Items.AddRange(strings);
            }
        }

        private void listBoxEx1_SelectedIndexChanged(object sender, EventArgs e)
        {
            listBoxEx1.Refresh();
        }

Мерцает при переключении элементов мышью или клавиатурой.
Перепробовал разные способы из интернета. Один из них помогает, но после ресайза формы мерцания возобновляются.
А вот так

        private void listBoxEx1_DrawItem(object sender, DrawItemEventArgs e)
        {
            if (e.Index >= 0)
            {
                Bitmap bitmap = new Bitmap(e.Bounds.Width, e.Bounds.Height);
                Graphics g = Graphics.FromImage(bitmap);
                g.DrawIcon(Resources.someIcon, bitmap.Width, bitmap.Height);
                e.Graphics.DrawImage(bitmap, 0, 0);
                g.Dispose();
                bitmap.Dispose();
            }
        }

вообще ничего не выводится. Хотя ведь должно? :thinking:

Это всё из-за того, что прямоугольник накладыввался на соседнюю строчку и приходилось перерисовывать весь ListBox.
Обе проблемы решил товарищ @WorldMaster в этой теме

за что ему респект и уважуха.

А, нет, нифига

Оно всё-равно мерцает

А если в классе формы нет этого

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams result = base.CreateParams;
                int WS_EX_COMPOSITED = 0x02000000;
                result.ExStyle |= WS_EX_COMPOSITED;
                return result;
            }
        }

то ListBox не очищается перед перерисовкой.

Ну, с перерисовкой винапи контролов всё сложно. :kolobokcrossing:
Поэтому если нужно не стандартное поведение, то лучше брать что-то типа WPF, Qt.
Или искать сторонние компоненты с нужными фичами, в которых большинство проблем скорее всего уже решены упорным трудом авторов.

Что то не особо заметил каких либо мерцаний.

class MyListBox : ListBox
    {
        private const UInt32 SRCCOPY = 0x00CC0020;

        [DllImport("gdi32.dll", CallingConvention = CallingConvention.StdCall)]
        private static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, UInt32 dwRop);

        public static void CopyGraphics(Graphics g, Rectangle bounds, Graphics bufferedGraphics, Point p)
        {
            IntPtr hdc1 = g.GetHdc();
            IntPtr hdc2 = bufferedGraphics.GetHdc();

            BitBlt(hdc1, bounds.X, bounds.Y,
                bounds.Width, bounds.Height, hdc2, p.X, p.Y, SRCCOPY);

            g.ReleaseHdc(hdc1);
            bufferedGraphics.ReleaseHdc(hdc2);
        }

        public MyListBox() : base()
        {
            BackColor = Color.Black;

            DoubleBuffered = true;
            DrawMode = DrawMode.OwnerDrawFixed;
        }


        void LocalDrawItem(DrawItemEventArgs e)
        {
            bool isSelected = (e.State & DrawItemState.Selected) == DrawItemState.Selected;

            if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
                e = new DrawItemEventArgs(e.Graphics,
                                          e.Font,
                                          e.Bounds,
                                          e.Index,
                                          e.State ^ DrawItemState.Selected,
                                          e.ForeColor,
                                          Color.Transparent);//Choose the color


            e.DrawBackground();
            if (e.Index >= 0)
            {
                Brush brush = Brushes.Lime;
                string t = Items[e.Index].ToString();
                e.Graphics.DrawString(t, Font, brush, new PointF(0.0f, e.Bounds.Y));
                if (isSelected)
                {
                    var bnd = e.Bounds;
                    bnd.Width--;
                    bnd.Height--;
                    e.Graphics.DrawRectangle(Pens.White, bnd);
                }
            }
            e.DrawFocusRectangle();
        }

        protected override void OnDrawItem(DrawItemEventArgs e)
        {
            BufferedGraphicsContext currentContext = BufferedGraphicsManager.Current;

            Rectangle newBounds = new Rectangle(0, 0, e.Bounds.Width, e.Bounds.Height);
            using (BufferedGraphics bufferedGraphics = currentContext.Allocate(e.Graphics, newBounds))
            {
                DrawItemEventArgs newArgs = new DrawItemEventArgs(
                    bufferedGraphics.Graphics, e.Font, newBounds, e.Index, e.State, e.ForeColor, e.BackColor);

                // Supply the real OnTemplateListDrawItem with the off-screen graphics context
                LocalDrawItem(newArgs);

                // Wrapper around BitBlt
                CopyGraphics(e.Graphics, e.Bounds, bufferedGraphics.Graphics, new Point(0, 0));
            }
        }

    }

Мерцания-то ладно. Их почти не стало. Тут теперь другая проблема.
Если держать вверх или вниз или влево или вправо, то при достижении крайней строчки предкрайняя не перерисовывается. Надо сильно постараться, чтобы этого не заметить.

Возьмите WPF и будет вам счастье.

не будет