Eu estava com o problema de flicker em toda a atualização de um listbox, depois de pesquisar achei essa solução que além de remover o flicker, foi possível escrever em diferentes cores em cada linha dependendo do que está escrito.

Segue o código:

[sections] [section title=”Código Fonte C#”]

internal sealed class ListBoxNoFlicker : ListBox
{
public ListBoxNoFlicker()
{
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
//SetStyle(ControlStyles.UserPaint, true);
DrawMode = DrawMode.OwnerDrawVariable;
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
DoubleBuffered = true;
//Enable the OnNotifyMessage event so we get a chance to filter out
// Windows messages before they get to the form’s WndProc
SetStyle(ControlStyles.EnableNotifyMessage, true);
}

protected override void OnNotifyMessage(Message m)
{
//Filter out the WM_ERASEBKGND message
if (m.Msg != 0x14)
{
base.OnNotifyMessage(m);
}
}

protected override void OnDrawItem(DrawItemEventArgs e)
{
if (Items.Count <1) return;

Graphics g = e.Graphics;

Color color = Items[e.Index].ToString().Contains("V")
? Color.DarkGreen
: Items[e.Index].ToString().Contains("ΣA")
? Color.DarkBlue
: Items[e.Index].ToString().Contains("A")
? Color.DarkRed
: Color.Gray;

g.DrawString(Items[e.Index].ToString(), e.Font, new SolidBrush(color), e.Bounds.X,
e.Bounds.Y);

}

protected override void OnPaint(PaintEventArgs e)
{
var iRegion = new Region(e.ClipRectangle);
e.Graphics.FillRegion(new SolidBrush(BackColor), iRegion);
if (Items.Count > 0)
{
for (int i = 0; i < Items.Count; ++i)
{
Rectangle irect = GetItemRectangle(i);
if (e.ClipRectangle.IntersectsWith(irect))
{
if ((SelectionMode == SelectionMode.One && SelectedIndex == i)
|| (SelectionMode == SelectionMode.MultiSimple && SelectedIndices.Contains(i))
|| (SelectionMode == SelectionMode.MultiExtended && SelectedIndices.Contains(i)))
{
OnDrawItem(new DrawItemEventArgs(e.Graphics, Font,
irect, i,
DrawItemState.Selected, ForeColor,
BackColor));
}
else
{
OnDrawItem(new DrawItemEventArgs(e.Graphics, Font,
irect, i,
DrawItemState.Default, ForeColor,
BackColor));
}
iRegion.Complement(irect);
}
}
}
base.OnPaint(e);
}
}

Depois de colar essa classe é só recompilar o código e o componente estará na barra de ferramentas.

[/section] [/sections]
Obrigado e até o próximo post.

DATEK Tecnologia Eletrônica
[C#] Listbox sem flicker
Tags:                     

Deixe uma resposta

%d blogueiros gostam disto: