MSDOTnet.org Forum Index
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister   ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

DrawString Graphics problem

 
Post new topic   Reply to topic    MSDOTnet.org Forum Index -> C Sharp
Author Message
Brian Ward



Joined: 28 Sep 2007
Posts: 2

PostPosted: Thu Jan 10, 2008 9:40 pm    Post subject: DrawString Graphics problem Reply with quote

I am trying to get to grips with some basic graphics, being new to C#.
I have this code (see below) in a simple project .. when I run it 6 text
strings are drawn, as I expected .. but this happens twice .. once with
a grey background and once with the white one.
Clearly I am missing something fundamental here.
Can anyone please explain.
TIA
===
Brian
=====
private void Form1_Paint(object sender, PaintEventArgs e)
{
this.BackColor = Color.White;
Graphics g = e.Graphics; // get a graphics object
Font ft = new Font("Arial", 30); // create a font ft
Brush br = new SolidBrush(Color.Tomato); // create a brush br
int y = 20;
for (int i = 0; i < 6; i++)
{
g.DrawString("Brian is texting a Window", ft, br, 30, y);
y += 50;
System.Threading.Thread.Sleep(1000); // pause for 1 sec
}
}

Archived from group: microsoft>public>dotnet>languages>csharp
Back to top
View user's profile Send private message
Peter Duniho



Joined: 08 Aug 2007
Posts: 45

PostPosted: Thu Jan 10, 2008 4:35 pm    Post subject: Re: DrawString Graphics problem Reply with quote

On Thu, 10 Jan 2008 08:40:42 -0800, Brian Ward
wrote:

> I am trying to get to grips with some basic graphics, being new to C#.
> I have this code (see below) in a simple project .. when I run it 6 text
> strings are drawn, as I expected .. but this happens twice .. once with
> a grey background and once with the white one.
> Clearly I am missing something fundamental here.

Your event handler is wrong.

First, you created a Font and a Brush, both of which need to be disposed
of when you're done with them.

Second, you _never_ ever want to do anything in a paint handler except
anything _directly_ related to drawing to the control. Calling
Thread.Sleep() is a _huge_ no-no. So is changing the background color for
the control.

I believe that what's going on in your case is that the change to the
background color won't take effect until you return from the paint
handler, because nothing else can happen to the control until the paint
handler is done. So you're stuck in the paint handler, drawing the string
six times using the old background color. Then you finally exit, which
allows the background color change to take effect, at which point another
redraw is signaled, causing you to draw the string six more times.

The basic .NET Forms painting outline is as follows:

* Write a paint handler (or override OnPaint()) that, given some state
for your control and/or data can always draw the complete state

* Write some code elsewhere that manages the state. For animation,
this usually involves some sort of timing mechanism that updates the state
at suitable intervals.

* Any time the state changes, call Control.Invalidate() to signal to
the framework that the display of that state needs to be updated. This
will result in your paint handler being called, at which time it will
completely draw the current state.

It is completely inappropriate to manage the state and/or timing of
animation from within the paint handler. Do not ever do this.

Pete
Back to top
View user's profile Send private message
Chris Dunaway



Joined: 09 Aug 2007
Posts: 6

PostPosted: Thu Jan 10, 2008 6:02 pm    Post subject: Re: DrawString Graphics problem Reply with quote

On Jan 10, 10:40 am, Brian Ward wrote:
> I am trying to get to grips with some basic graphics, being new to C#.
> I have this code (see below) in a simple project .. when I run it 6 text
> strings are drawn, as I expected .. but this happens twice .. once with
> a grey background and once with the white one.
> Clearly I am missing something fundamental here.
> Can anyone please explain.
> TIA
> ===
> Brian
> =====
> private void Form1_Paint(object sender, PaintEventArgs e)
> {
> this.BackColor = Color.White;
> Graphics g = e.Graphics; // get a graphics object
> Font ft = new Font("Arial", 30); // create a font ft
> Brush br = new SolidBrush(Color.Tomato); // create a brush br
> int y = 20;
> for (int i = 0; i < 6; i++)
> {
> g.DrawString("Brian is texting a Window", ft, br, 30, y);
> y += 50;
> System.Threading.Thread.Sleep(1000); // pause for 1 sec
> }
>
> }

To add to what Peter has said, here is a site that might help you:

http://www.bobpowell.net

Chris
Back to top
View user's profile Send private message
Bob Powell [MVP]



Joined: 08 Aug 2007
Posts: 93

PostPosted: Fri Jan 11, 2008 4:56 pm    Post subject: Re: DrawString Graphics problem Reply with quote

Funny, I was just about to suggest that myself Wink


--
--
Bob Powell [MVP]
Visual C#, System.Drawing

Ramuseco Limited .NET consulting
http://www.ramuseco.com

Find great Windows Forms articles in Windows Forms Tips and Tricks
http://www.bobpowell.net/tipstricks.htm

Answer those GDI+ questions with the GDI+ FAQ
http://www.bobpowell.net/faqmain.htm

All new articles provide code in C# and VB.NET.
Subscribe to the RSS feeds provided and never miss a new article.


"Chris Dunaway" wrote in message @v67g2000hse.googlegroups.com...
> On Jan 10, 10:40 am, Brian Ward wrote:
>> I am trying to get to grips with some basic graphics, being new to C#.
>> I have this code (see below) in a simple project .. when I run it 6 text
>> strings are drawn, as I expected .. but this happens twice .. once with
>> a grey background and once with the white one.
>> Clearly I am missing something fundamental here.
>> Can anyone please explain.
>> TIA
>> ===
>> Brian
>> =====
>> private void Form1_Paint(object sender, PaintEventArgs e)
>> {
>> this.BackColor = Color.White;
>> Graphics g = e.Graphics; // get a graphics object
>> Font ft = new Font("Arial", 30); // create a font ft
>> Brush br = new SolidBrush(Color.Tomato); // create a brush
>> br
>> int y = 20;
>> for (int i = 0; i < 6; i++)
>> {
>> g.DrawString("Brian is texting a Window", ft, br, 30, y);
>> y += 50;
>> System.Threading.Thread.Sleep(1000); // pause for 1 sec
>> }
>>
>> }
>
> To add to what Peter has said, here is a site that might help you:
>
> http://www.bobpowell.net
>
> Chris
Back to top
View user's profile Send private message
Chris Dunaway



Joined: 09 Aug 2007
Posts: 6

PostPosted: Fri Jan 11, 2008 6:09 pm    Post subject: Re: DrawString Graphics problem Reply with quote

On Jan 11, 4:56 am, "Bob Powell [MVP]"
wrote:
> Funny, I was just about to suggest that myself Wink
>
> --
> --
> Bob Powell [MVP]
> Visual C#, System.Drawing
>
> Ramuseco Limited .NET consultinghttp://www.ramuseco.com
>
> Find great Windows Forms articles in Windows Forms Tips and Trickshttp://www.bobpowell.net/tipstricks.htm
>
> Answer those GDI+ questions with the GDI+ FAQhttp://www.bobpowell.net/faqmain.htm
>
> All new articles provide code in C# and VB.NET.
> Subscribe to the RSS feeds provided and never miss a new article.
>
> "Chris Dunaway" wrote in message
>
> @v67g2000hse.googlegroups.com...
>
> > On Jan 10, 10:40 am, Brian Ward wrote:
> >> I am trying to get to grips with some basic graphics, being new to C#.
> >> I have this code (see below) in a simple project .. when I run it 6 text
> >> strings are drawn, as I expected .. but this happens twice .. once with
> >> a grey background and once with the white one.
> >> Clearly I am missing something fundamental here.
> >> Can anyone please explain.
> >> TIA
> >> ===
> >> Brian
> >> =====
> >> private void Form1_Paint(object sender, PaintEventArgs e)
> >> {
> >> this.BackColor = Color.White;
> >> Graphics g = e.Graphics; // get a graphics object
> >> Font ft = new Font("Arial", 30); // create a font ft
> >> Brush br = new SolidBrush(Color.Tomato); // create a brush
> >> br
> >> int y = 20;
> >> for (int i = 0; i < 6; i++)
> >> {
> >> g.DrawString("Brian is texting a Window", ft, br, 30, y);
> >> y += 50;
> >> System.Threading.Thread.Sleep(1000); // pause for 1 sec
> >> }
>
> >> }
>
> > To add to what Peter has said, here is a site that might help you:
>
> >http://www.bobpowell.net
>
> > Chris

Hi Bob,

I love your site! When will your book be out? Wink

I noticed on your site that you have started a WPF faq. Have had a
chance to use WPF much? What are your impressions of it compared to
GDI and GDI+ ?

Cheers,

Chris
Back to top
View user's profile Send private message
Brian Ward



Joined: 28 Sep 2007
Posts: 2

PostPosted: Sat Jan 12, 2008 2:27 pm    Post subject: Re: DrawString Graphics problem Reply with quote

Thanks for all this help .. Bob's site looks really good.
One more thing. I have another problem (always another!)
I am using protected override bool ProcessCmdKey to control the movement
of this circle (see below) by adjusting x and y values .. it works fine,
but I also want the circle to leave a trace behind it as it moves .. I
would think that writing to a Bitmap would be the thing, but I can't
seem to figure out how.
Any help again much appreciated
==
Brian
==

private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
g.FillEllipse(Brushes.Blue, x, y, 20, 20);
g.Dispose()
}
Back to top
View user's profile Send private message
Peter Duniho



Joined: 08 Aug 2007
Posts: 45

PostPosted: Sat Jan 12, 2008 3:33 pm    Post subject: Re: DrawString Graphics problem Reply with quote

On Sat, 12 Jan 2008 01:27:09 -0800, Brian Ward
wrote:

> [...]
> but I also want the circle to leave a trace behind it as it moves .. I
> would think that writing to a Bitmap would be the thing, but I can't
> seem to figure out how.
> Any help again much appreciated

Well, the basic idea would be to create a Bitmap instance into which you
draw, using Graphics.FromImage() to get a Graphics instance you can use
for drawing the circle, then in your Paint handler draw the Bitmap instead
of the circle.

Assuming the size of your control never changes, this may be the easiest.
If you want to handle changes in the control size gracefully it gets more
complicated, at least partly just because you then need to decide what
behavior is "correct" for your application.

You could save the circles into a Metafile instead, which introduces its
own complexities but can avoid the resizing issue. Alternatively, you
could just keep your own list of circles as you add them, drawing all of
them one by one each time the control needs to be painted. And of course
you could use some combination of the above, such as using a Bitmap most
of the time, but still storing a list of the circles so that you can
recreate a new Bitmap at arbitrary sizes as the control changes without
worrying about how best to preserve previously drawn circles.

Basically, for small numbers of circles, just storing the circles
themselves is easiest and more efficient. As the number of circles goes
up, a solution that uses only a Bitmap becomes more efficient. There's a
large area of wiggle room in the middle where you can pretty much do it
however you prefer. Smile

Pete
Back to top
View user's profile Send private message
Peter Duniho



Joined: 08 Aug 2007
Posts: 45

PostPosted: Mon Jan 14, 2008 1:28 am    Post subject: Re: DrawString Graphics problem Reply with quote

I was looking at this thread in review for a reply elsewhere, and I took
another look at this post. I'm embarassed that I didn't notice the
obvious bug, especially since it might have been introduced as a result of
a misunderstanding of a comment I made earlier. In particular:

On Sat, 12 Jan 2008 01:27:09 -0800, Brian Ward
wrote:

> [...]
> private void Form1_Paint(object sender, PaintEventArgs e)
> {
> Graphics g = e.Graphics;
> g.FillEllipse(Brushes.Blue, x, y, 20, 20);
> g.Dispose()
> }

Do _not_ dispose the Graphics instance. It is good and correct to dispose
objects that are disposable and which you created in your own code. But
the Graphics instance is passed to you in the event args and must remain
valid for other Paint event handlers. Don't call Dipose() on it.

Sorry for not noticing this earlier.

Pete

Back to top
View user's profile Send private message
Display posts from previous:   
Related Topics:
Bug in DrawString() I think I found a bug in method. Font underlines and strikeouts are drawn in wrong places after changing To reproduce this bug place provided code in the Paint event of a form: { Font font = new Font("Arial", 10, F

Left-justify text using DrawString Is it possible to left-justify, center, or right-justify text on a panel when drawing it using DrawString? I looked at the class, but all it has is far, near, and center. Thanks, Robin S.

Drawstring doesn't work with all printers. Any ideas? I have been doing some simple tests, based on the code given in the MSDN example, with additions to select any of the printers available on my machine.

Graphic.DrawString - Smooth Font Edges on Small Point Size. I'm new to - but I've been working with the ideas outlined in Ken Spencer's "Creating Text Images On the Fly with GDI+" article in this month's MSDN magazine. I'm drawing a string on top of a background image, and my question is this: Is th

Graphics.FromHwnd Hi NG I get allways a when I would get a but it could not be right. When I try with this.Handle it is all ok. When I try with a Handle from Spy++ I get a What could be wrong? Thomas Bock
Post new topic   Reply to topic    MSDOTnet.org Forum Index -> C Sharp All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group