c# - How can I clear the Graphics before drawing another letter? -


    private void timer1_tick(object sender, eventargs e)     {         counter--;         drawletter();         if (counter == 0)         {             t.stop();             takescreenshot();         }     }      private void drawletter()     {         var letter = counter.tostring();         graphics g = graphics.fromhdc(getdc(intptr.zero));         float width = ((float)this.clientrectangle.width);         float height = ((float)this.clientrectangle.width);         float emsize = height;         font font = new font(fontfamily.genericsansserif, emsize, fontstyle.regular);         font = findbestfitfont(g, letter.tostring(), font, this.clientrectangle.size);         sizef size = g.measurestring(letter.tostring(), font);         g.drawstring(letter, font, new solidbrush(color.white), (width - size.width) / 2, 0);     }      private font findbestfitfont(graphics g, string text, font font, size proposedsize)     {         // compute actual size, shrink if needed         while (true)         {             sizef size = g.measurestring(text, font);              // fits, out             if (size.height <= proposedsize.height &&                  size.width <= proposedsize.width) { return font; }              // try smaller font (90% of old size)             font oldfont = font;             font = new font(font.name, (float)(font.size * .9), font.style);             oldfont.dispose();         }     }      void takescreenshot()     {         bmpscreenshot = new bitmap(screen.primaryscreen.bounds.width, screen.primaryscreen.bounds.height, pixelformat.format32bppargb);         gfxscreenshot = graphics.fromimage(bmpscreenshot);         gfxscreenshot.copyfromscreen(screen.primaryscreen.bounds.x, screen.primaryscreen.bounds.y, 0, 0, screen.primaryscreen.bounds.size, copypixeloperation.sourcecopy);         bmpscreenshot.save(environment.getfolderpath(environment.specialfolder.desktopdirectory) + @"\screencaptures\newfile.png", imageformat.png);                 } 

i able draw string writing on top of itself.

how can clear it? want countdown appear on screen take screenshot.

right number overwritten another.

my current results

you can following: create additional transparent form, , display timer values. allow erase previous value. in addition, allow rid of function call getdc via pinvoke.

form timerform; // main form field 
// create , show additional transparent form before starting timer timerform = new form {     formborderstyle = formborderstyle.none,     windowstate = formwindowstate.maximized,     transparencykey = systemcolors.control,     showintaskbar = false }; timerform.show(); timer.start(); 

change method drawletter follows

private void drawletter() {     var letter = counter.tostring();     graphics g = timerform.creategraphics();      float width = clientrectangle.width;     float height = clientrectangle.width;     float emsize = height;      using (font font1 = new font(fontfamily.genericsansserif, emsize, fontstyle.regular))     using (font font2 = findbestfitfont(g, letter, font1, clientrectangle.size))     using (var brush = new solidbrush(color.white))     {         sizef size = g.measurestring(letter, font2);         g.clear(systemcolors.control);         g.drawstring(letter, font2, brush, (width - size.width) / 2, 0);     } } 

we must release used resources fonts , brushes. applied using.

change timer tick event handler follows

private void timer1_tick(object sender, eventargs e) {     counter--;     drawletter();     if (counter == 0)     {         timer.stop();         takescreenshot();          timerform.dispose(); // must release     } } 

findbestfitfont , takescreenshot methods remain unchanged.