Плавность отрисовки в WinForms C#
Есть программа-тест. На ней панель размещена и она является задним фоном с разными фотографиями которые меняются по очереди. При обновлении фото на ней происходит не понятное мерцание. Вот что я пробовал
private const int WS_EX_COMPOSITED = 0x02000000;
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= WS_EX_COMPOSITED;
return cp;
}
}
Но это никак не повлияло. Очень благодарен, если кто-то поможет!
{
panel2.BackgroundImade = Properties.Resourses.MyRes1;
panel2.Visible = false;
panel1.Visible = true;
panel1.BackgroundImade = Properties.Resourses.MyRes;
}
{
panel2.Visible = true;
panel1.Visible = false;
panel1.BackgroundImade = Properties.Resourses.MyRes3;
Ответы (2 шт):
Автор решения: S.H.
→ Ссылка
У Вас есть два способа решить проблему мерцания:
- Рекомендуемый способ - использование атрибута double buffering
Фактически, это означает установку DoubleBuffered = true; для панели или для всей формы - надо попробовать и так, и так
- Если это не поможет - тогда есть "классический хак": у вас должно быть 2 панели. Одного размера и расположенные по одному и тому же Location. Одна видимая, вторая - невидимая. В невидимую загружается следующая фотка. Потом - меняем атрибуты видимости местами: делаем первую панель невидимой, вторую (в которую уже полностью загрузилась фотка) - видимой.
Автор решения: Blackmeser
→ Ссылка
class panell : Panel
{
protected override bool DoubleBuffered { get => true; }
}
Использовать panell вместо Panel. Если не поможет то через рефлексию:
using System.Reflection;
Type type = panel.GetType();
PropertyInfo propertyInfo = type.GetProperty("DoubleBuffered", BindingFlags.NonPublic | BindingFlags.Instance);
propertyInfo.SetValue(panel, true, null);
Сделал в интерактиве, ничего не мерцает даже без двойной буферизации:
#r "System.Windows.Forms"
using System.Windows.Forms;
Form f = new Form();
f.Show();
string s1 = @"..\18--w--1280.jpg";
string s2 = @"..\20--w--1280.jpg";
using System.Drawing;
f.BackgroundImage = Image.FromFile(s1);
Timer t = new Timer();
t.Interval = 500;
int i = 0;
t.Tick += (s, a) => f.BackgroundImage = Image.FromFile(i%2==0?s1:s2);
t.Tick += (s, a) => { f.BackgroundImage = Image.FromFile(i % 2 == 0 ? s1 : s2); i++; };
t.Enabled = true;
Button b = new Button();
f.Controls.Add(b);
Можете поделиться своим исходником с мерцанием?