On Fri, 01 Feb 2008 11:43:03 -0800, Brian Ward <brian.ward@zetnet.co.uk>=
=
[quoted text, click to view] wrote:
> I have a moving bitmap graphic, driven by a timer, on a form that has =
a
> background image.
> I want to clear the image after each movement to avoid a trail being
> left behind. I can do this with a simple background colour by using
> g.Clear() with the relevant colour .. but I'm not clear(sorry!) about
> how to do it when there is a background image.
> Some relevant code in the tick method is :
> Size s1 =3D new Size(150,120);
> Bitmap im1 =3D new Bitmap("myPic.gif" ,s1);
> Graphics g =3D CreateGraphics();
> g.DrawImage(im1, x,y);
> g.Clear(this.BackgroundImage); // no .. not this!
> g.CopyFromScreen(x,y,x,y,s1); // is this perhaps nearl=
y =
[quoted text, click to view] > right?
> The last line gives a partial solution .. is this the right way?
This is entirely wrong. The only thing your Tick handler should do is =
update whatever data structure controls the location of the image, and =
then invalidate the area of the control in which you want to draw. Then=
=
you should have a Paint handler (or override OnPaint(), if you've =
sub-classed the control) where you use the location information to draw =
=
the image in the appropriate spot.
Ironically, doing it correctly the issue of "clearing the image" between=
=
updates is trivial. It just happens for you without any additional =
effort. The only reason you ran into the problem in the first place was=
=
that you're misusing the .NET paint mechanism.
As for your question about WMF images, I don't know. I've found that =
..NET's support for Metafiles is somewhat lacking elsewhere, so it's =
possible it's also just poorly tested in this particular scenario as =
well. I suppose it's possible that you're doing something wrong, but I =
=
doubt it. A WMF should behave just like a Bitmap when used with any API=
=
that requires only an Image. The fact that you can get correct behavior=
=
just by converting the WMF to a Bitmap suggests that the API is broken.