Wednesday 15 August 2012

c# - How do I save a Winforms panel's drawing content to a file? -



c# - How do I save a Winforms panel's drawing content to a file? -

i made paint program, , drawing content (from system.drawing) drawn on panel. attempted method simple save now, , blank image.

my bitmap has property .rawdata 0. don't know if matters.

when hide screen, , show again, panel becomes blank.

on side note, when phone call panel's pnlpaint.refresh(), panel goes blank. drawing lost. double buffer thing, it's not retaining values?

private bool save() { bitmap bmpdrawing; rectangle rectbounds; seek { // create bitmap paint storage bmpdrawing = new bitmap(pnlpaint.width, pnlpaint.height); // set bounds of bitmap rectbounds = new rectangle(0, 0, bmpdrawing.width, bmpdrawing.height); // move drawing bitmap pnlpaint.drawtobitmap(bmpdrawing, rectbounds); // save bitmap file bmpdrawing.save("a.bmp", imageformat.bmp); } grab (exception e) { messagebox.show("error on saving. message: " + e.message); } homecoming true; }

this minimal doodle programme lets draw persistent lines:

list<point> curpoints = new list<point>(); list<list<point>> allpoints = new list<list<point>>(); private void pnlpaint_mousedown(object sender, mouseeventargs e) { if (curpoints.count > 1) { // begin fresh line or curve curpoints.clear(); // startpoint curpoints.add(e.location); } } private void pnlpaint_mouseup(object sender, mouseeventargs e) { if (curpoints.count > 1) { // tolist creates re-create allpoints.add(curpoints.tolist()); curpoints.clear(); } } private void pnlpaint_mousemove(object sender, mouseeventargs e) { if (e.button != mousebuttons.left) return; // here should check if distance more minimum! curpoints.add(e.location); // allow show pnlpaint.invalidate(); } private void pnlpaint_paint(object sender, painteventargs e) { // here can utilize drawlines or drawcurve // current line if (curpoints.count > 1) e.graphics.drawcurve(pens.red, curpoints.toarray()); // other lines or curves foreach (list<point> points in allpoints) if (points.count > 1) e.graphics.drawcurve(pens.red, points.toarray()); } private void btn_undo_click(object sender, eventargs e) { if (allpoints.count > 1) { allpoints.removeat(allpoints.count - 1); pnlpaint.invalidate(); } } private void btn_save_click(object sender, eventargs e) { string filename = @"d:\test.bmp"; bitmap bmp = new bitmap(pnlpaint.clientsize.width, pnlpaint.clientsize.width); pnlpaint.drawtobitmap(bmp, pnlpaint.clientrectangle); bmp.save(filename, imageformat.bmp); }

add save code , if have problems so..

update: have added 2 code pieces save , (unlimited) undo..

c# winforms

No comments:

Post a Comment