Во время прокрутки в Windows 7 дисплей поля со списком владельца не работает - PullRequest
1 голос
/ 28 ноября 2010

Когда комбо содержит много элементов, комбо выпадает и вы прокручиваете выпадающий список вверх и вниз, все элементы в выпадающем списке перепутаны - похоже, они перезаписывают друг друга.Я работаю на 64-битной Windows 7 с deve Studio 2008. У меня не было этой проблемы на Windows XP.Сократил код до простого примера, который воспроизводит проблему.

 public class ODComboBox : ComboBox
 {
    protected override void OnDrawItem(
        DrawItemEventArgs e)
    {
        if (e.Index == -1)  {
            e.DrawBackground();
            e.DrawFocusRectangle();
            return;
        }

        string text = Items[e.Index].ToString();       
        e.Graphics.SetClip(e.Bounds);
        e.DrawBackground();
        e.Graphics.DrawString(text, Font, new SolidBrush(ForeColor), e.Bounds);
        e.DrawFocusRectangle();          
    }
}

Для режима отрисовки комбинированного объекта установлено значение OwnerDrawFixed, а вот метод OnLoad с хоста из.

private void Form1_Load(object sender, EventArgs e)
{
    for (int i = 0; i < 50; ++i) {
       cobmob1.Items.Add("AAAAAAAAAAAAAAAAAAAAAAAA");
       cobmob1.Items.Add("BBBBBBBBBBBBBBBBBBBBBBBB");
    }

    cobmob1.DropDownWidth = 500;
}

combo screenshot

Ответы [ 3 ]

2 голосов
/ 28 сентября 2011

Это решение здесь: https://connect.microsoft.com/VisualStudio/feedback/details/524617/listbox-ownerdraw-windows-7 поместите этот код в OnDrawItem вместо e.DrawBackground Автор: Николай Ковальчук, 1/2/2010 в 9:01 µμ Я нашел рабочее решение - специальная двойная очисткафона (требуются обе строки и именно в этом порядке):

//e.Graphics.FillRectangle(new SolidBrush(e.BackColor), e.Bounds);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(0, e.BackColor.R, e.BackColor.G, e.BackColor.B)), e.Bounds);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(255, e.BackColor.R, e.BackColor.G, e.BackColor.B)), e.Bounds);

Я думаю, что ListBox в Windows 7 закрашивает себя прозрачными цветами, а при прокрутке не очищает часть, которую нужно перекрасить, что приводит кпокраска артефактов.Также e.BackColor называется color "Window", и он не равен генерируемому FromArgb, даже если все компоненты ARGB одинаковы.

2 голосов
/ 29 ноября 2010

Я не могу воспроизвести поведение, описанное вами, с использованием приведенного выше кода в Windows Server 2008 R2, 64-разрядная версия.Прокрутка кажется мне плавной, хотя это немного необычный эффект, когда одни и те же элементы повторяются в списке снова и снова. Я очень сомневаюсь, что причина в том, что присутствует в Windows 7, но не проявляетсяв серверном варианте тоже самое;это по сути идентичные операционные системы.

Я думаю, это связано с драйверами вашей видеокарты и новой моделью дисплея ( WDDM ), представленной в Windows Vista.Возможно, какая-то проблема перерисовки?Сколько лет вашей видеокарте?Вы обновляли его одновременно с Windows XP?

Это также может быть связано с новой темой Aero.Вы пытались запустить приложение под темами Aero Basic или Classic?Если вы не хотите менять тему ОС, попробуйте следующее:

  1. Щелкните правой кнопкой мыши файл .EXE вашего приложения и выберите «Свойства» в раскрывающемся меню.
  2. Откройте вкладку «Совместимость».
  3. Установите флажки «Отключить визуальные темы» и «Отключить композицию рабочего стола».
  4. Нажмите кнопку ОК, а затем снова запустите приложение.
0 голосов
/ 17 марта 2011

У меня была такая же проблема, после обновления видео драйвера, которая была исправлена.

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