Draw to a buffer to avoid tearing

This commit is contained in:
Robin Perris 2020-01-10 09:57:32 +00:00
parent 7e80b71546
commit 766c4292a9

View File

@ -4,24 +4,11 @@ using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using DarkUI.Extensions;
namespace DarkUI.Controls
{
public class DarkComboBox : ComboBox
{
public DarkComboBox() : base()
{
SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.ResizeRedraw |
ControlStyles.UserPaint, true);
DrawMode = DrawMode.OwnerDrawVariable;
base.FlatStyle = FlatStyle.Flat;
base.DropDownStyle = ComboBoxStyle.DropDownList;
}
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public new Color ForeColor { get; set; }
@ -38,79 +25,83 @@ namespace DarkUI.Controls
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public new ComboBoxStyle DropDownStyle { get; set; }
public new void Invalidate()
private Bitmap _buffer;
public DarkComboBox() : base()
{
base.Invalidate();
SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.ResizeRedraw |
ControlStyles.UserPaint, true);
DrawMode = DrawMode.OwnerDrawVariable;
base.FlatStyle = FlatStyle.Flat;
base.DropDownStyle = ComboBoxStyle.DropDownList;
}
protected override void Dispose(bool disposing)
{
if (disposing)
_buffer = null;
base.Dispose(disposing);
}
protected override void OnTabStopChanged(EventArgs e)
{
base.OnTabStopChanged(e);
Invalidate();
}
protected override void OnTabIndexChanged(EventArgs e)
{
base.OnTabIndexChanged(e);
Invalidate();
}
protected override void OnGotFocus(EventArgs e)
{
base.OnGotFocus(e);
Invalidate();
}
protected override void OnLostFocus(EventArgs e)
{
base.OnLostFocus(e);
Invalidate();
}
protected override void OnTextChanged(EventArgs e)
{
Invalidate();
base.OnTextChanged(e);
Invalidate();
}
protected override void OnTextUpdate(EventArgs e)
{
Invalidate();
base.OnTextUpdate(e);
Invalidate();
}
protected override void OnSelectedValueChanged(EventArgs e)
{
Invalidate();
base.OnSelectedValueChanged(e);
Invalidate();
}
protected override void OnDrawItem(DrawItemEventArgs e)
protected override void OnInvalidated(InvalidateEventArgs e)
{
var g = e.Graphics;
var rect = e.Bounds;
var textColor = Colors.LightText;
var fillColor = Colors.LightBackground;
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected ||
(e.State & DrawItemState.Focus) == DrawItemState.Focus ||
(e.State & DrawItemState.NoFocusRect) != DrawItemState.NoFocusRect)
fillColor = Colors.BlueSelection;
using (var b = new SolidBrush(fillColor))
{
g.FillRectangle(b, rect);
base.OnInvalidated(e);
PaintCombobox();
}
if (e.Index >= 0 && e.Index < Items.Count)
private void PaintCombobox()
{
var text = Items[e.Index].ToString();
if (_buffer == null)
_buffer = new Bitmap(ClientRectangle.Width, ClientRectangle.Height);
using (var b = new SolidBrush(textColor))
using (var g = Graphics.FromImage(_buffer))
{
var padding = 2;
var modRect = new Rectangle(rect.Left + padding,
rect.Top + padding,
rect.Width - (padding * 2),
rect.Height - (padding * 2));
var stringFormat = new StringFormat
{
LineAlignment = StringAlignment.Center,
Alignment = StringAlignment.Near,
FormatFlags = StringFormatFlags.NoWrap,
Trimming = StringTrimming.EllipsisCharacter
};
g.DrawString(text, Font, b, modRect, stringFormat);
}
}
}
protected override void OnPaint(PaintEventArgs e)
{
var g = e.Graphics;
var rect = new Rectangle(0, 0, ClientSize.Width, ClientSize.Height);
var textColor = Colors.LightText;
@ -159,4 +150,58 @@ namespace DarkUI.Controls
}
}
}
protected override void OnPaint(PaintEventArgs e)
{
if (_buffer == null)
PaintCombobox();
var g = e.Graphics;
g.DrawImageUnscaled(_buffer, Point.Empty);
}
protected override void OnDrawItem(DrawItemEventArgs e)
{
var g = e.Graphics;
var rect = e.Bounds;
var textColor = Colors.LightText;
var fillColor = Colors.LightBackground;
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected ||
(e.State & DrawItemState.Focus) == DrawItemState.Focus ||
(e.State & DrawItemState.NoFocusRect) != DrawItemState.NoFocusRect)
fillColor = Colors.BlueSelection;
using (var b = new SolidBrush(fillColor))
{
g.FillRectangle(b, rect);
}
if (e.Index >= 0 && e.Index < Items.Count)
{
var text = Items[e.Index].ToString();
using (var b = new SolidBrush(textColor))
{
var padding = 2;
var modRect = new Rectangle(rect.Left + padding,
rect.Top + padding,
rect.Width - (padding * 2),
rect.Height - (padding * 2));
var stringFormat = new StringFormat
{
LineAlignment = StringAlignment.Center,
Alignment = StringAlignment.Near,
FormatFlags = StringFormatFlags.NoWrap,
Trimming = StringTrimming.EllipsisCharacter
};
g.DrawString(text, Font, b, modRect, stringFormat);
}
}
}
}
}