Click here to Skip to main content
Click here to Skip to main content

Drawing lines, shapes, or text on bitmaps

By , 12 Apr 2002
 

Introduction

This article describes the operations needed to draw lines, shapes, or text on bitmaps. The task is quite simple, but a quick reference could be handy for the beginners.

Working with HBITMAPs

As first step we need a background image, referenced by a hbitmap handle. hbitmap can be the result of previous operations, or created with CreateBitmap(), or a resource:

HBITMAP hbitmap = ::LoadBitmap(AfxGetInstanceHandle(),
        MAKEINTRESOURCE(IDB_BITMAP1));

From hbitmap we can extract the basic attributes:

BITMAP bm;
GetObject( hbitmap, sizeof(BITMAP), &bm );
long width=bm.bmWidth;
long height=bm.bmHeight;

Now let's create a memory device context and select a new bitmap.

//prepare the bitmap attributes
BITMAPINFO bmInfo;
memset(&bmInfo.bmiHeader,0,sizeof(BITMAPINFOHEADER));
bmInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmInfo.bmiHeader.biWidth=width;
bmInfo.bmiHeader.biHeight=height;
bmInfo.bmiHeader.biPlanes=1;
bmInfo.bmiHeader.biBitCount=24;
//create a temporary dc in memory.
HDC pDC = ::GetDC(0);
HDC TmpDC=CreateCompatibleDC(pDC);
//create a new bitmap and select it in the memory dc
BYTE *pbase;
HBITMAP TmpBmp=CreateDIBSection(pDC,
    &bmInfo,DIB_RGB_COLORS,(void**)&pbase,0,0);
HGDIOBJ TmpObj=SelectObject(TmpDC,TmpBmp);

TmpDC is the device context were you can draw lines, text, or images. For example, the next lines draw a string over a background image :

//draw the background
HDC dcBmp=CreateCompatibleDC(TmpDC);
HGDIOBJ TmpObj2 = SelectObject(dcBmp,hbitmap);
BitBlt(TmpDC,0,0,width,height,dcBmp,0,0,SRCCOPY);
SelectObject(TmpDC,TmpObj2);
DeleteDC(dcBmp);

//choose the font
CFont m_Font;
LOGFONT* m_pLF;
m_pLF=(LOGFONT*)calloc(1,sizeof(LOGFONT));
strncpy(m_pLF->lfFaceName,"Times New Roman",31);
m_pLF->lfHeight=64;
m_pLF->lfWeight=600;
m_pLF->lfItalic=1;
m_pLF->lfUnderline=0;
m_Font.CreateFontIndirect(m_pLF);

//select the font in the dc
CDC dc;
dc.Attach(TmpDC);
CFont* pOldFont=NULL;
if (m_Font.m_hObject) 
    pOldFont = dc.SelectObject(&m_Font);
else 
    dc.SelectObject(GetStockObject(DEFAULT_GUI_FONT));

//Set text color
dc.SetTextColor(RGB(60,120,240));
//Set text position;
RECT pos = {40,40,0,0};
//draw the text
dc.SetBkMode(TRANSPARENT);
dc.DrawText("Test",4,&pos,DT_CALCRECT);
dc.DrawText("Test",4,&pos,0);

//cleanup 
if (pOldFont) dc.SelectObject(pOldFont);
m_Font.DeleteObject();
dc.Detach();
free(m_pLF);

At this point there are 2 bitmaps: hbitmap and TmpBmp, you can keep both the old and the new image, or replace hbitmap with TmpBmp:

DeleteObject(hbitmap);
hbitmap=TmpBmp;

Finally, we can delete the temporary device context. Do not delete hbitmap and TmpBmp here, or you'll loose the bitmap.

//final cleanup
SelectObject(TmpDC,TmpObj);
DeleteDC(TmpDC);

Conclusion

The article starts with a background image stored in a HBITMAP, and ends with a new image in a new HBITMAP. This grants a high flexibility on what you can do before, after and in between: you can use all the GDI functions to build your image, and for example you can use CBitmap, or image processing libraries like FreeImage and CxImage, to add effects or save the result in a file.

License

This article, along with any associated source code and files, is licensed under The zlib/libpng License

About the Author

Davide Pizzolato
Italy Italy
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralMy vote of 5memberwanggxii19 Jan '13 - 23:13 
BugThe codes have an error?memberyiruirui21 Mar '12 - 20:19 
GeneralMy vote of 5memberRohit Vipin Mathews13 Feb '12 - 1:00 
GeneralThe source on the page is not working for mememberJJeffrey25 Nov '08 - 21:37 
GeneralRe: The source on the page is not working for mememberddas-edEn9 Feb '12 - 22:44 
GeneralRe: The source on the page is not working for me [modified]memberddas-edEn9 Feb '12 - 22:48 
QuestionCreating Text on bitmap in C# winformsmemberpyar12323 Sep '08 - 20:54 
GeneralTEXT OVER BITMAPmemberpelis30 May '07 - 7:09 
Question[C#] How to move a line using the mouse after drawing it ?memberaliaamonier22 Apr '07 - 14:56 
GeneralRe: [C#] How to move a line using the mouse after drawing it ?memberHamid.3 Jan '08 - 18:53 
QuestionWhere is the code source ??membermccool28 Mar '06 - 1:06 
AnswerRe: Where is the code source ??memberHamid.3 Jan '08 - 18:53 
QuestionDrawing shapes or bitmaps on bitmapsmemberAssaf Koren21 Jan '06 - 1:14 
AnswerRe: Drawing shapes or bitmaps on bitmapsmemberStan Shannon21 Jan '06 - 2:23 
GeneralRe: Drawing shapes or bitmaps on bitmapsmemberAssaf Koren21 Jan '06 - 16:54 
GeneralBUGmembernavratil10 Aug '04 - 6:00 
Generalresizing of images and shapes as in word artmembersreemail15 Dec '02 - 1:23 
GeneralRe: resizing of images and shapes as in word artmemberDavide Pizzolato15 Dec '02 - 1:48 
Generaltext rendering with cximagememberDavide Pizzolato13 Apr '02 - 23:24 
GeneralRe: text rendering with cximagememberAnonymous23 Apr '02 - 6:54 
GeneralRe: text rendering with cximagememberAnonymous23 Apr '02 - 9:18 
GeneralRe: text rendering with cximagememberAnonymous23 Apr '02 - 9:17 
GeneralRe: text rendering with cximagememberDavide Pizzolato25 Apr '02 - 5:42 
GeneralSome issuesmemberChristian Graus11 Apr '02 - 14:39 
GeneralRe: Some issuesmemberKarstenK11 Apr '02 - 23:26 
GeneralRe: Some issuesmemberChristian Graus11 Apr '02 - 23:46 
GeneralRe: Some issuesmemberDavide Pizzolato12 Apr '02 - 1:08 
GeneralRe: Some issuesmemberChristian Graus12 Apr '02 - 1:33 
GeneralRe: Some issuesmemberJehy16 May '08 - 15:14 
GeneralRe: Some issuesmemberDavide Pizzolato17 May '08 - 1:13 
GeneralRe: Some issuesmemberJehy17 May '08 - 4:51 

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

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130516.1 | Last Updated 13 Apr 2002
Article Copyright 2002 by Davide Pizzolato
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid