Saturday, 15 May 2010

c# - How to disable a User Control to draw it's background (or Region) -



c# - How to disable a User Control to draw it's background (or Region) -

my question : how disable user command draw it's background (or region)

note : tried override , empty onpaintbackground or set background color transparent.

i'm trying bypass winform paint custom user controls in custom container. thought give seek : beginners-starting-a-2d-game-with-gdiplus

my setup :

a form containing: a user command (drawingboard) a container elements can drag , drop drawingboard (it's listbox).

my render loop within drawingboard elements specified in previous link.

public drawingboard() { initializecomponent(); //resize event ignored setstyle(controlstyles.fixedheight, true); setstyle(controlstyles.fixedwidth, true); setstyle(system.windows.forms.controlstyles.allpaintinginwmpaint, true);// true improve setstyle(system.windows.forms.controlstyles.optimizeddoublebuffer, true); // true improve // disable on built paint event. dont need renderloop. // form no longer refresh // raise paint event ourselves our renderloop. setstyle(system.windows.forms.controlstyles.userpaint, false); // false improve } #region gdi+ rendering public timer t = new timer(); //this backbuffer, bitmap: bitmap b_buffer = null; //this surface allows draw on backbuffer bitmap. graphics g_buffer = null; //this surface utilize draw backbuffer display. graphics g_target = null; size displaysize = new size(1120, 630); bool antialiasing = false; const int ms_redraw = 32; public void gdiinit() { b_buffer = new bitmap(displaysize.width, displaysize.height); g_buffer = graphics.fromimage(b_buffer); //drawing surface g_target = creategraphics(); // configure display (target) graphics fastest rendering. g_target.compositingmode = compositingmode.sourcecopy; g_target.compositingquality = compositingquality.assumelinear; g_target.smoothingmode = smoothingmode.none; g_target.interpolationmode = interpolationmode.nearestneighbor; g_target.textrenderinghint = textrenderinghint.systemdefault; g_target.pixeloffsetmode = pixeloffsetmode.highspeed; // configure backbuffer's drawing surface optimal rendering optional // antialiasing text , polygon shapes //antialiasing boolean tells weather enable antialiasing. //it declared somewhere else if (antialiasing) { g_buffer.smoothingmode = smoothingmode.antialias; g_buffer.textrenderinghint = textrenderinghint.antialias; } else { // no text or polygon smoothing applied default g_buffer.compositingmode = compositingmode.sourceover; g_buffer.compositingquality = compositingquality.highspeed; g_buffer.interpolationmode = interpolationmode.low; g_buffer.pixeloffsetmode = pixeloffsetmode.half; } t.tick += renderingloop; t.interval = ms_redraw; t.start(); } void renderingloop(object sender, eventargs e) { seek { g_buffer.clear(color.darkslategray); uipaint(g_buffer); g_target.drawimageunscaled(b_buffer, 0, 0); } grab (exception ex) { console.writeline(ex); } } #endregion

then elements event fired , seek draw like:

public override void uipaint(graphics g) { pen p = new pen(color.blue,4); p.alignment = system.drawing.drawing2d.penalignment.inset; g.drawlines(p, new point[] { new point(location.x, location.y), new point(location.x + width, location.y), new point(location.x + width, location.y + height), new point(location.x, location.y + height), new point(location.x, location.y - 2) }); g.drawimageunscaled(gdata.getwindowimage(), location); }

here happening on drawingboard :

as can't post image ... here link : http://s8.postimage.org/iqpxtaoht/winform.jpg

the background darkslategray because g_buffer state clear each tick that, ok the bluish rectangle paint, cropped, ko the texture cropped, ko the part crop drawing command size.

so there i've tried disable winform create magic drawing in background. tried override , empty got paint/update/refresh/invalidate/validate on form/drawingboard/elements nil allowed me texture or drawing not cropped command background : (

i tried set background of element transparent , set form.transparencykey = blabla each element backcolor = blabla. failed each time.

i'm missing : / don't know what.

why don't want draw background? avoid problems flickering in custom command (derived class control), here's did:

(1) override onpaintbackground:

protected override void onpaintbackground(painteventargs pevent) { }

(2) draw in offscreen bitmap , transfer screen:

bitmap _completeframe; protected override void onpaint(painteventargs pe) { drawframe(); // draws onto _completeframe, calling new bitmap() // when _completeframe null or size wrong var g = pe.graphics; g.drawimage(_completeframe, new point()); }

c# winforms background

No comments:

Post a Comment