После того, как я свернул форму и поднял ее обратно, listBox (который является OwnerDrawned, так что я могу настроить цвета и поведение по своему вкусу) начинает мерцать при наведении курсора на элементы.
Как это исправить?
Я уже пробовал несколько решений, таких как https://www.codeproject.com/Answers/473893/FlickeringplusinplusaplusWindowsplusFormplusapplic и https://www.codeproject.com/Answers/728560/Remove-flickering-due-to-TableLayoutPanel-Panel-2, но также https://stackoverflow.com/a/3718648/10012792, но ни одно из них не устраняет мерцание ПОСЛЕ того, как я свернул приложение и вынул его резервное копирование.
{
private int _MouseIndex = -1;
public Form1()
{
InitializeComponent();
ResizeRedraw = true;
DoubleBuffered = true;
}
public static void SetDoubleBuffered(System.Windows.Forms.Control c)
{
if (System.Windows.Forms.SystemInformation.TerminalServerSession)
return;
System.Reflection.PropertyInfo aProp = typeof(System.Windows.Forms.Control).GetProperty("DoubleBuffered", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
aProp.SetValue(c, true, null);
}
protected override CreateParams CreateParams
{
get
{
// Activate double buffering at the form level. All child controls will be double buffered as well.
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
{
DoubleBuffered = true;
if (e.Index < 0) return;
//e.DrawBackground();
Color borderColor = Color.FromArgb(255, 42, 42, 42);
bool isItemSelected = ((e.State & DrawItemState.Selected) == DrawItemState.Selected);
using (SolidBrush bgBrush = new SolidBrush(isItemSelected ? Color.FromArgb(255, 52, 52, 52) : Color.FromArgb(255, 29, 29, 29)))
using (SolidBrush overlay = new SolidBrush(isItemSelected ? Color.FromArgb(255, 42, 42, 42) : Color.FromArgb(255, 42, 42, 42)))
using (SolidBrush itemBrush = isItemSelected ? new SolidBrush(Color.FromArgb(255, 68, 201, 94)) : new SolidBrush(Color.FromArgb(255, 243, 243, 243)))
{
string itemText = listBoxTracks.GetItemText(listBoxTracks.Items[e.Index]);
e.Graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
SizeF size = e.Graphics.MeasureString(listBoxTracks.ToString(), e.Font);
e.Graphics.FillRectangle(bgBrush, e.Bounds);
e.Graphics.DrawRectangle(new Pen(borderColor), e.Bounds);
e.Graphics.DrawString(itemText, e.Font, itemBrush, e.Bounds.Left + (e.Bounds.Width / 22 - size.Width / 44), e.Bounds.Top + (e.Bounds.Height / 2 - size.Height / 2));
if (e.Index == _MouseIndex)
{
e.Graphics.FillRectangle(overlay, e.Bounds);
e.Graphics.DrawString(itemText, e.Font, itemBrush, e.Bounds.Left + (e.Bounds.Width / 22 - size.Width / 44), e.Bounds.Top + (e.Bounds.Height / 2 - size.Height / 2));
}
}
}
{
int index = listBoxTracks.IndexFromPoint(e.Location);
if (index != _MouseIndex)
{
_MouseIndex = index;
listBoxTracks.Invalidate();
}
}
{
if (_MouseIndex > -1)
{
_MouseIndex = -1;
listBoxTracks.Invalidate();
}
}
Я ожидаю, что вывод будет не мерцающим, поскольку методы, которые я использовал, должны это предотвратить.
Мне было трудно зарегистрировать его для показа, поскольку внутренняя запись с использованием Camtasia, оверлея Nvidia или моего iPhone SE не могла показать его впоследствии в записи. Мирилис Боевик! однако сделал на 144fps, см .: https://imgur.com/a/M1c0c6D
Исходный код здесь: https://mega.nz/#!kIJlAQ5S!l9hTXxYE0lcg4iNH3TUcIly3TaDCrtWlPs1xKttS7ws