Как избежать наложения строк в настраиваемой выпадающей панели комбинированного списка при прокрутке? - PullRequest
1 голос
/ 21 октября 2010

У меня странная проблема с улучшенным WinForms ComboBox, который я написал на C #.В этом поле отображается список цветов с самим цветом и именем цвета. Для него установлено ComboBoxStyle.DropDownList, двойная буферизация и DrawMode.OwnerDrawFixed.Элементы рисуются при возникновении события DrawItem.

Если я открою меню DropDown и прокручиваю колесиком мыши, поведение и внешний вид в порядке.Если я использую большой палец полосы прокрутки левой кнопкой мыши, текст на панели становится нечетким.Только если я снова наведу курсор мыши на показанные элементы, они будут перерисованы правильно.

http://i.stack.imgur.com/F99Zu.png

Помощь очень ценится!

Майкл

Редактировать: Код метода рисования:

    private void OnDrawItem(object sender, DrawItemEventArgs e)
    {
        if (e.Index == -1)
        {
            return;
        }

        e.DrawBackground();

        Graphics grfx = e.Graphics;
        grfx.FillRectangle(mWhiteBrush, e.Bounds);

        ColorInfo colorInfo = (ColorInfo)Items[e.Index];
        Color brushColor = colorInfo.Color;

        using (SolidBrush brush = new SolidBrush(brushColor))
        {
            Rectangle rectangleColor = e.Bounds;
            Rectangle rectangleText = e.Bounds;

            rectangleColor.Width = rectangleColor.Height;
            rectangleText.X += rectangleColor.Width;
            rectangleText.Width -= rectangleColor.Width;

            grfx.FillRectangle(brush, rectangleColor);
            grfx.DrawString(colorInfo.Name, e.Font, mBlackBrush, rectangleText);
        }    
    }

Ответы [ 2 ]

1 голос
/ 21 октября 2010

Не видя код, из вашего описания, похоже, что есть ошибка в вашем коде чертежа.Одна вещь, которую я видел в прошлом, это то, что свойство DrawItemEventArgs.State аргументов события может вызывать проблемы.Это требует тщательной проверки, так как это перечисление флага, в котором можно установить несколько состояний одновременно.

Разместите код чертежа / измерения для получения дополнительной информации.

Также я предполагаю, что вы дважды буферизировали этот элемент управления, верно?

Для быстрого исправления попробуйте установить следующее:

grfx.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;

В то время как более надежное решениеобработайте двойную буферизацию самостоятельно в коде следующим образом:

    private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
    {    
        if (e.Index == -1)
        {
            return;
        }

        using (Bitmap drawbuffer = new Bitmap(e.Bounds.Width, e.Bounds.Height))
        {
            using (Graphics grfx = Graphics.FromImage(drawbuffer))
            {
                grfx.FillRectangle(mWhiteBrush, 0, 0, e.Bounds.Width, e.Bounds.Height);

                ColorInfo colorInfo = (ColorInfo)Items[e.Index];
                Color brushColor = colorInfo.Color;

                using (SolidBrush brush = new SolidBrush(brushColor))
                {
                    Rectangle rectangleColor = new Rectangle();
                    Rectangle rectangleText = new Rectangle();

                    rectangleColor.Height = rectangleColor.Width = e.Bounds.Height;
                    rectangleText.X += rectangleColor.Width;
                    rectangleText.Width = e.Bounds.Width - e.Bounds.Height;

                    grfx.FillRectangle(brush, rectangleColor);
                    grfx.DrawString(colorInfo.Name, e.Font, mBlackBrush, rectangleText);
                }

                e.Graphics.DrawImageUnscaled(drawbuffer, e.Bounds);
            }
        }
    }
0 голосов
/ 21 октября 2010

Ну, перерисовывайте фон ТО текст каждый раз.Поскольку у вас двойной буфер, у вас не будет мерцания или каких-либо других проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...