How to use SetPixel Function in Windows.h?

5 Min Read

SetPixel() is a function that simply sets a pixel with the user-defined color. For Windows users, pixel operation can be easily done with C/C++ programming language. Here’s simple tutorial on “Using SetPixel Function in Windows.h”. Here, I’ve briefly introduced the need of pixels with program source code to setup SetPixel Function in Windows.h and the drawbacks of SetPixel() function.

While learning computer graphics, many times you might’ve come across creating graphical structure using pixels. To implement this in your program, a programming platform that supports pixel features is required. That is to say that the programming language, should provide the facility of printing a single pixel on the screen.

Now, let’s come to C/C++. Both support pixel operations, but you cannot print pixels in the console window. Some graphical structure mechanism is required for pixel operation in C/C++, and for Windows users, that mechanism is provided by windows.h library.

You can learn more about SetPixel function here.

Drawing Line with SetPixel

SetPixel() function, provided by windows.h can be used to print a pixel at any specified location of window. The general form of the function is:
SetPixel(HDC hdc, int x, int y, COLORREF& color);

Here, hdc is a handle to a device context, x and y are coordinates of pixel and color is the color of the pixel to be displayed. To use SetPixel() function, besides writing the command for the function and including windows.h, extra linking operation need to done.

Source Code to Implement SetPixel Function in Windows.h:

The program code presented below draws a horizontal line to a window. Note that you need to add a link library: libgdi32.a in linker setting before running the code with Code::Blocks IDE. This link library can be found usually inside MinGW\lib.

#include <windows.h>

static HWND sHwnd;
static COLORREF redColor=RGB(255,0,0);
static COLORREF blueColor=RGB(0,0,255);
static COLORREF greenColor=RGB(0,255,0);

void SetWindowHandle(HWND hwnd)
{
    sHwnd=hwnd;
}

void setPixel(int x,int y,COLORREF& color=redColor)
{
    if(sHwnd==NULL)
    {
        MessageBox(NULL,"sHwnd was not initialized !","Error",MB_OK|MB_ICONERROR);
        exit(0);
    }
    HDC hdc=GetDC(sHwnd);
    SetPixel(hdc,x,y,color);
    ReleaseDC(sHwnd,hdc);
    return;
}

void drawLine()
{
    for(int i = 0; i < 100; i++)
        setPixel(10+i, 100, blueColor);
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    switch(message)
    {
    case WM_PAINT:
        SetWindowHandle(hwnd);
        drawLine();
        break;
    case WM_CLOSE: // Failure to call DefWindowProc
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    default:
        break; // Failure to call DefWindowProc //
    }
    return DefWindowProc(hwnd,message,wParam,lParam);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow)
{
    static TCHAR szAppName[] = TEXT("Test");
    WNDCLASS wndclass;
    wndclass.style         = CS_HREDRAW|CS_VREDRAW ;
    wndclass.lpfnWndProc   = WndProc ;
    wndclass.cbClsExtra    = 0 ;
    wndclass.cbWndExtra    = 0 ;
    wndclass.hInstance     = hInstance ;
    wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
    wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
    wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
    wndclass.lpszMenuName  = NULL ;
    wndclass.lpszClassName = szAppName ;
    
    // Register the window
    if(!RegisterClass(& wndclass))
    {
        MessageBox(NULL,"Registering the class failed","Error",MB_OK|MB_ICONERROR);
        exit(0);
    }
    
    // CreateWindow
    HWND hwnd=CreateWindow(szAppName,"SetPixel example - codewithc.com",
                           WS_OVERLAPPEDWINDOW,
                           CW_USEDEFAULT,
                           CW_USEDEFAULT,
                           CW_USEDEFAULT,
                           CW_USEDEFAULT,
                           NULL,
                           NULL,
                           hInstance,
                           NULL);
    if(!hwnd)
    {
        MessageBox(NULL,"Window Creation Failed!","Error",MB_OK);
        exit(0);
    }
    
    // ShowWindow and UpdateWindow
    ShowWindow(hwnd,iCmdShow);
    UpdateWindow(hwnd);
    
    // Message Loop
    MSG msg;
    while(GetMessage(& msg,NULL,0,0))
    {
        TranslateMessage(& msg);
        DispatchMessage(& msg);
    }
    
    return 0;
}

Limitations of SetPixel() Function:

SetPixel() function seems easy but for very large image data it is very slow to work. So, for such cases, instead of using SetPixel or GetPixel, bitmap functions such as BlendFunction, TransparentBlt or BitBlt can be used. The basic coding for setting some pixels with specific color on the screen using SetPixel() function is:

int x[10000], y[10000];
for (int i=0; i<num_of_points; i++)
{
    SetPixel(hDC, x[i], y[i], color);
}

The problem here is that it accesses the device context for every single point individually. So, we should try to reduce accessing as well as writing in device context for every point and do more work in memory. This can done by creating a bitmap in memory. This acts as an alternative to SetPixel() function.

If you have any queries and feedback regarding the setup procedure aforementioned, bring them up from the comments section.

Share This Article
Leave a comment

Leave a Reply

Your email address will not be published. Required fields are marked *

English
Exit mobile version