Переопределение DrawItem для ListBox - невыбранные элементы не перерисовываются - PullRequest
4 голосов
/ 18 июля 2010

Это настольное приложение на C #.Свойство DrawStyle моего ListBox установлено на OwnerDrawFixed.

Проблема: Я перезаписываю DrawItem для рисования текста в разных шрифтах, и это работает.Но когда я начинаю изменять размер формы во время выполнения, выбранный элемент отображается правильно, но остальные элементы не перерисовываются, что приводит к искажению текста для невыбранных элементов.*

Кроме того, правильно отображаемый элемент (выбранный) мигает при изменении размера формы.Не важно, но если кто-нибудь знает почему .... tnx

Ответы [ 2 ]

5 голосов
/ 18 июля 2010

Вставьте следующий код в событие Resize:

private void listDevices_Resize(object sender, EventArgs e) {
    listDevices.Invalidate();
}

Это должно привести к перерисовке всего.

Чтобы остановить мерцание, вам нужна двойная буферизация.

Для этого создайте новый класс, производный от ListBox, и поместите в конструктор следующее:

this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

Или просто вставьте это в файл кода:

using System.Windows.Forms;

namespace Whatever {
    public class DBListBox : ListBox {
        public DBListBox(): base() {
            this.DoubleBuffered = true;
            // OR
            // this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        }
    }
}

Заменить«Независимо от того» с пространством имен, используемым вашим проектом, или сделайте его более полезным.После компиляции вы сможете добавить DBListBox в конструктор форм.

4 голосов
/ 18 июля 2010

Я повторяю проблему. В коде есть несколько ошибок, имя шрифта «Arial», вы не должны корректировать rect.Width, вы забыли вызвать Dispose () для шрифтов, кистей и областей. Но они не объясняют поведение. Что-то не так с областью отсечения, которая препятствует правильному обновлению текста. Я не вижу, где это происходит, состояние объекта Graphics в порядке.

Graphics.DrawString () - очень проблемный метод, вам следует избегать его. Все элементы управления Windows Forms, включая ListBox, используют TextRenderer.DrawText (). Это решает проблему, когда я его использую. Я знаю, что измерение труднее, вы можете обойти это, отображая IP-адрес с фиксированным смещением. Выглядит лучше, они выстроятся в столбец таким образом.

Мерцает, потому что вы используете e.DrawBackground (). Это стирает существующий текст, вы рисуете текст обратно на нем. Я не думаю, что двойная буферизация это исправит, вам нужно нарисовать весь элемент, чтобы не рисовать фон. Сложно, если вы не можете получить точный размер текста крупным шрифтом, обходной путь - сначала нарисовать растровое изображение.

...