J'avais des problèmes similaires avec une liste déroulante de propriétaires, mais ma solution était d'utiliser des objets BufferedGraphics. le propriétaire a dessiné, mais peut-être cela vous donnera-t-il un peu d'inspiration
J'ai trouvé que TextRenderer avait du mal à restituer l'emplacement correct à moins que je fournisse TextFormatFlags.Prese rveGraphicsTranslateTransform. L'alternative à ceci était d'utiliser P/Invoke pour appeler BitBlt pour copier directement les pixels entre les contextes graphiques. J'ai choisi cela comme le moindre de deux maux.
/// <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
}
Je viens de mettre en œuvre cela et cela fonctionne parfaitement. – test
@Eric: D'où obtenez-vous le GDI? Est-ce une référence? Par exemple, j'ai essayé d'ajouter 'Graphics GDI = this.CreateGraphics();' mais il n'a pas la méthode CopyGraphics. Ou avez-vous d'abord importer Gdi32.dll? – Matt
Ok - fonctionne maintenant. J'ai ajouté 'GDI32.dll' avec la méthode' BitBlt', l'ai enveloppé comme 'GDI.CopyGraphics (...)' et maintenant cela fonctionne ... la seule chose est que scintille exactement la même chose que la ListBox d'origine. Des idées comment résoudre ce problème? – Matt