Avevo problemi simili anche se con una listbox disegnata dal proprietario La mia soluzione era utilizzare gli oggetti BufferedGraphics. Il tuo chilometraggio può variare con questa soluzione se il tuo elenco non è proprietario disegnato, ma forse vi darà qualche ispirazione
Ho trovato che TextRenderer ha avuto difficoltà a eseguire il rendering nella posizione corretta a meno che non ho supposto TextFormatFlags.Prese rveGraphicsTranslateTransform. L'alternativa a questo era usare P/Invoke per chiamare BitBlt per copiare direttamente i pixel tra i contesti grafici. Ho scelto questo come il minore dei due mali.
/// <summary>
/// This class is a double-buffered ListBox for owner drawing.
/// The double-buffering is accomplished by creating a custom,
/// off-screen buffer during painting.
/// </summary>
public sealed class DoubleBufferedListBox : ListBox
{
#region Method Overrides
/// <summary>
/// Override OnTemplateListDrawItem to supply an off-screen buffer to event
/// handlers.
/// </summary>
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
base.OnDrawItem(newArgs);
// Wrapper around BitBlt
GDI.CopyGraphics(e.Graphics, e.Bounds, bufferedGraphics.Graphics, new Point(0, 0));
}
}
#endregion
}
Ho appena implementato questo e funziona perfettamente. – test
@Eric: Da dove viene GDI? È un riferimento? Ad esempio, ho provato ad aggiungere 'Graphics GDI = this.CreateGraphics();' ma non ha il metodo CopyGraphics. O hai importato Gdi32.dll in precedenza? – Matt
Ok: funziona ora. Ho aggiunto 'GDI32.dll' con il metodo' BitBlt', l'ho avvolto come 'GDI.CopyGraphics (...)' e ora funziona ... l'unica cosa è che è lo sfarfallio proprio come il ListBox originale. Qualche idea su come aggiustarlo? – Matt