Click here to Skip to main content
13,042,630 members (83,380 online)
Click here to Skip to main content
Add your own
alternative version


17 bookmarked
Posted 18 Jul 2008

An easy technique to improve the drawing of background images of Windows Forms

, 18 Jul 2008
Rate this:
Please Sign up or sign in to vote.
Improve drawing of controls with transparent background over a form with image background.


This article is about a simple trick to improve the drawing performance of Windows Forms. When a background image is used for a form and it has a number of controls, and especially when there are a lot of controls with a transparent background, you will definitely face an issue in rendering controls. You can individually render the controls just after loading the form. Even if you enable AllPaintingInWmPaint and do double-buffering using SetStyle, the performance will not improve.

(Double-buffering can create problems in a limited memory environment/ a terminal server environment / if you want to use OpenGL applications like VTK to draw over your window.)

This article shows you how to overcome this drawing issue without even using double-buffering

Using the code

The technique is overriding the background image property to return an image (Bitmap) which GDI can easily draw. Also, you can include the code to adjust the size. This will avoid the zoom/stretching needed while drawing and further improve performance.

//C++ Source code
property System::Drawing::Image^ BackgroundImage 
    virtual System::Drawing::Image^ BackgroundImage::get()override
        return this->m_bmpRenderBitMap;

    virtual void BackgroundImage::set(System::Drawing::Image ^value) override
            m_bmpRenderBitMap = nullptr;
        //Create new BitMap Object of the size 
        this->m_bmpRenderBitMap = gcnew System::Drawing::Bitmap(value->Width, 

        //Create graphics from image
        System::Drawing::Graphics ^g = 

        //set the graphics interpolation mode to high
        g->InterpolationMode = Drawing::Drawing2D::InterpolationMode::High;
       //draw the image to the graphics to create the new image 
       //which will be used in the onpaint background
        g->DrawImage(value, Rectangle(0, 0, this->m_bmpRenderBitMap->Width, 

The same can be done in C# as well:

//C# Sample
public override Image BackgroundImage
        return bmpBackground;
        if (value!=null)
            //Create new BitMap Object of the size 
            bmpBackground = new Bitmap(value.Width,value.Height);

            //Create graphics from image
            System.Drawing.Graphics g = 
            //set the graphics interpolation mode to heigh
            g.InterpolationMode = 
            //draw the image to the graphics to create the new image 
            //which will be used in the onpaint background
            g.DrawImage(value, new Rectangle(0, 0, bmpBackground.Width, 
            bmpBackground = null;

After posting this article, when I searched in Google, a similar article was found in MSDN blog:


This article, along with any associated source code and files, is licensed under The Common Development and Distribution License (CDDL)


About the Author

Software Developer
India India
No Biography provided

You may also be interested in...

Comments and Discussions

-- There are no messages in this forum --
Permalink | Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.170713.1 | Last Updated 19 Jul 2008
Article Copyright 2008 by Cibz
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid