Tôi đã gặp vấn đề tương tự mặc dù với một chủ sở hữu rút ra ListBox. chủ sở hữu được rút ra, nhưng có thể nó sẽ cung cấp cho bạn một số nguồn cảm hứng
Tôi thấy rằng TextRenderer gặp khó khăn khi hiển thị vị trí chính xác trừ khi tôi nhét TextFormatFlags.Prese rveGraphicsTranslateTransform. Cách khác là sử dụng P/Invoke để gọi BitBlt để sao chép trực tiếp các pixel giữa các bối cảnh đồ họa. Tôi đã chọn điều này là ít hơn của hai tệ nạn.
/// <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
}
Tôi chỉ thực hiện điều này và nó hoạt động hoàn hảo. – test
@Eric: Bạn lấy GDI từ đâu? Nó là một tham chiếu? Ví dụ, tôi đã cố gắng thêm 'Graphics GDI = this.CreateGraphics();' nhưng nó không có phương thức CopyGraphics. Hay bạn đã nhập Gdi32.dll trước đây? – Matt
Ok - đang hoạt động. Tôi đã thêm 'GDI32.dll' với phương thức' BitBlt', bọc nó thành 'GDI.CopyGraphics (...)' và bây giờ nó hoạt động ... điều duy nhất là nhấp nháy giống như ListBox gốc. làm thế nào để khắc phục các ý tưởng đó? – Matt