[Gtk-sharp-list] DrawingArea flickering - how to stop erasing background
Nicholas Frechette
zeno490 at gmail.com
Sat Jun 30 16:37:20 UTC 2012
Have you tried playing with the following properties?
mDrawingArea.AppPaintable = true;
mDrawingArea.DoubleBuffered = false;
I set these values since I handle the drawing manually on a Cairo
surface followed by painting that on a pixmap (which is equivalent to
manually handling the double buffering).
My expose event looks like the following:
private void HandleDrawingAreaExposeEvent(object o, ExposeEventArgs args)
{
var lArea = args.Event.Area;
args.Event.Window.DrawDrawable(mDrawingArea.Style.BlackGC,
mCompositePixmap, lArea.X, lArea.Y, lArea.X, lArea.Y, lArea.Width,
lArea.Height);
args.RetVal = false;
}
Hope this helps,
Nicholas
On Wed, Jun 13, 2012 at 8:20 AM, eskimobob <martin at berriman.co.uk> wrote:
> I've searched and searched on DoubleBuffering with Gdk# but am still stuck...
> I'm writing a test linux app in Monodevelop using Gdk# and Cairo.
> I have on my form a DrawingArea widget onto which I draw.
>
> In order to avoid flickering, I am creating a Cairo.ImageSurface where I do
> the actual drawing. This is then painted onto the DrawingArea during the
> Expose event handler.
>
> I am finding that it is flickering badly but fail to understand why. In a
> previous app on Windows, I had a similar problem because Windows tries to
> erase the background before each paint. Since I am painting the entire
> image from memory, there is no need to erase first. This was solved by
> handling the WM_ERASEBKGND message - i.e. intercept the message and ignore
> it so that the attempted erase does not occur.
>
> It seems likely that the same thing is happening here (automatic erase
> before my paint) however I don't know how to stop it.
>
> I've included example code below (although can't see any way to use code
> tags) and would appreciate any suggestions.
>
> private Cairo.ImageSurface viewSurface; //surface used to double buffer
> drawing to prevent flicker
> private System.Timers.Timer timer; //used to cause a redraw
>
> public MainWindow (): base (Gtk.WindowType.Toplevel)
> {
> Build ();
> timer = new System.Timers.Timer(10);
> timer.Enabled = false;
> timer.Elapsed += HandleTimerElapsed;
> }
>
> void HandleTimerElapsed (object sender, System.Timers.ElapsedEventArgs e)
> {
> UpdateViewSurface();
> mainDrawingArea.QueueDraw();
> }
>
> protected void eDrawingAreaConfigure (object o, Gtk.ConfigureEventArgs
> args)
> {
> //we get here we we have a resize event
> //create our sufrace in memory for later use
> viewSurface = new ImageSurface(Format.ARGB32,
> mainDrawingArea.Allocation.Width, mainDrawingArea.Allocation.Height);
> }
>
> protected void eDrawingAreaExpose (object sender, Gtk.ExposeEventArgs args)
> {
> //we get here when we need to redraw the screen
> DrawingArea viewArea = (DrawingArea)sender;
> using (Context cr = Gdk.CairoHelper.Create(viewArea.GdkWindow))
> {
> cr.SetSourceSurface(viewSurface, 0, 0);
> cr.Paint();
> }
> }
>
> private void UpdateViewSurface()
> {
> //whenever we want
> //draw onto our surface in memory
> //white background with a blue circle which has a red border
> using (Context cr = new Context(viewSurface))
> {
> int width, height;
> width = Allocation.Width;
> height = Allocation.Height;
>
> cr.Rectangle(0, 0, width, height);
> cr.SetSourceRGB(1, 1, 1);
> cr.Fill();
>
> cr.LineWidth = 9;
> cr.SetSourceRGB(1, 0, 0);
>
> cr.Translate(width/2, height/2);
> cr.Arc(0, 0, (width < height ? width : height) / 2 - 10, 0, 2*Math.PI);
> cr.StrokePreserve();
>
> cr.SetSourceRGB(0, 0, 1);
> cr.Fill();
> }
> }
>
> --
> View this message in context: http://mono.1490590.n4.nabble.com/DrawingArea-flickering-how-to-stop-erasing-background-tp4649911.html
> Sent from the Mono - Gtk# mailing list archive at Nabble.com.
> _______________________________________________
> Gtk-sharp-list maillist - Gtk-sharp-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/gtk-sharp-list
More information about the Gtk-sharp-list
mailing list