Click here to Skip to main content
15,861,168 members
Articles / Multimedia / GDI

Using Color Gradients in Win32/SDK Programs

Rate me:
Please Sign up or sign in to vote.
4.22/5 (8 votes)
12 Oct 20021 min read 96.7K   34   9
How to create a color gradient as a background in a SDK application.

Sample Image - grad.jpg

Introduction

Creating a color gradient as a background isn't hard at all. If you have read Nishant's article on using color gradients with MFC, then this code is simply a modified SDK version of his article.

Into the Abyss We Go

Okay, first I suggest reading the MFC version of this:

After that, you should have a simple understanding of how this was done. To get started, simply add the WM_ERASEBKGND message to your window procedure function. I suggest creating a separate function to do all the work of actually drawing the background. If this is the route you decide to take, make sure in the declaration of the function you pass along the handle to your main window. With this said, now for the code.

C++
void OnEraseBkGnd(HWND hwnd)
{
    /* Vars */
    HDC dc; /* Standard Device Context; used to do the painting */
    
    /* rect = Client Rect of the window; 
    Temp = Temparory rect tangle for the color bands */
    RECT rect, temp; 
    HBRUSH color; /* A brush to do the painting with */
    
    /* Get the dc for the wnd */
    dc = GetDC(hwnd);
    
    /* Get the client rect */
    GetClientRect(hwnd, &rect);
    
    /* Start color; Change the R,G,B values 
    to the color of your choice */
    int r1 = 255, g1 = 0, b1 = 0;
    
    /* End Color; Change the R,G,B values 
    to the color of your choice */
    int r2 = 255, g2 = 255, b2 = 0;
    
    /* loop to create the gradient */
    for(int i=0;i<rect.right;i++) 
    { 
        /* Color ref. for the gradient */
        int r,g,b; 
        /* Determine the colors */
        r = r1 + (i * (r2-r1) / rect.right); 
        g = g1 + (i * (g2-g1) / rect.right);
        b = b1 + (i * (b2-b1) / rect.right);
        
        /* Fill in the rectangle information */
        
        /* The uper left point of the rectangle 
        being painted; uses i as the starting point*/
        temp.left = i;
        /* Upeer Y cord. Always start at the top */ 
        temp.top = 0; 
        /* Okay heres the key part, 
        create a rectangle thats 1 pixel wide */
        temp.right = i + 1; 
        /* Height of the rectangle */
        temp.bottom = rect.bottom; 
        
        /* Create a brush to draw with; 
        these colors are randomized */
        color = CreateSolidBrush(RGB(r, g, b));
        
        /* Finally fill in the rectangle */
        FillRect(dc, &temp, color);
    }
}

Final Notes

One last final note, now that wasn't hard, was it? Its really easy to create a gradient. Also if you create a second function for creating the gradient, you could just easily call the function when you wanted the gradient to appear. Also with a little bit of customization, you could easily make the gradient only a portion of the window. That's all folks...

License

This article has no explicit license attached to it, but may contain usage terms in the article text or the download files themselves. If in doubt, please contact the author via the discussion board below.

A list of licenses authors might use can be found here.


Written By
Web Developer
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralMy vote of 5 Pin
VinhTran_30-Nov-11 17:19
VinhTran_30-Nov-11 17:19 
excellent, it helped me much, thanks a lot ^^
GeneralReleaseDC and DeleteObject must be called Pin
sbcan18-Sep-05 8:30
sbcan18-Sep-05 8:30 
GeneralRe: ReleaseDC and DeleteObject must be called Pin
Chuanren Wu13-Jun-07 2:38
Chuanren Wu13-Jun-07 2:38 
GeneralStep looking Pin
Mate7-Jun-03 14:16
Mate7-Jun-03 14:16 
GeneralWin2k upwards... Pin
Indivara14-Oct-02 23:29
professionalIndivara14-Oct-02 23:29 
GeneralDeleteObject Pin
Anonymous14-Oct-02 5:19
Anonymous14-Oct-02 5:19 
GeneralRe: DeleteObject Pin
einst99214-Oct-02 12:11
einst99214-Oct-02 12:11 
GeneralRe: DeleteObject Pin
Philippe Lhoste14-Oct-02 22:28
Philippe Lhoste14-Oct-02 22:28 
GeneralRe: DeleteObject Pin
Johann Gerell15-Oct-02 2:30
Johann Gerell15-Oct-02 2:30 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.