【发布时间】:2011-11-08 01:52:51
【问题描述】:
我有一个无边框表单,其中包含以下代码:
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 机器上运行良好。
知道为什么会发生这种情况吗?
解决办法:
在bool painted = false; 行之后添加Bitmap b;,并将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();
}
【问题讨论】:
-
只是一种预感,但尝试注释掉“if (painted) return;”行
-
@MerickOWA 如果我注释掉那一行,那么它将一遍又一遍地
CopyFromScreen,并且 alpha 混合将从所有图层中完全消失。 -
在 If 块中处理完图形对象后,不要忘记调用 g.Dispose()。否则你会泄露一个图形句柄。在这种情况下可能不是一个大问题,因为它只发生一次,但这是一个好习惯。
标签: c# winforms splash-screen