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.
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.