У меня есть форма без полей со следующим кодом:
public partial class Splash : Form
{
bool painted = false;
public Splash()
{
InitializeComponent();
Opacity = 0;
}
protected override void OnPaint(PaintEventArgs e)
{
//
}
protected override void OnPaintBackground(PaintEventArgs e)
{
if (painted)
return;
Graphics gfx = e.Graphics;
gfx.CopyFromScreen(new Point(Bounds.Left, Bounds.Top),
Point.Empty, Bounds.Size);
gfx.DrawImage(Properties.Resources.Splash, e.ClipRectangle);
Opacity = 100;
painted = true;
}
}
На моем компьютере с Windows 7 это работает довольно хорошо, но в Windows XP вместо заставки появляется мусор (предположительно, любой не выровненный материал в буфере кадров). Иногда я могу различить сильно искаженные остатки старых окон проводника и т. Д. Внутри мусора.
Странно то, что я запускаю идентичный код в другой программе, которая имеет такой же тип 24-битного PNG и которая отлично работает на компьютере с XP.
Есть идеи, почему это может происходить?
Решение:
Добавьте Bitmap b;
после строки bool painted = false;
и измените OnPaintBackground
на:
protected override void OnPaintBackground(PaintEventArgs e)
{
if (!painted)
{
b = new Bitmap(Width, Height);
Graphics g = Graphics.FromImage(b);
g.CopyFromScreen(new Point(Bounds.Left, Bounds.Top),
Point.Empty, Bounds.Size);
g.DrawImage(Properties.Resources.Splash, e.ClipRectangle);
Opacity = 100;
painted = true;
g.Dispose();
}
Graphics gfx = e.Graphics;
gfx.DrawImage(b, new Point(0, 0));
gfx.Dispose();
}