Click here to Skip to main content
13,048,584 members (78,540 online)
Click here to Skip to main content
Add your own
alternative version


29 bookmarked
Posted 31 Jul 2003

Extracting Single Images from a CImageList object

, 31 Jul 2003
Rate this:
Please Sign up or sign in to vote.
This will show you how extract an individual CBitmap from a CImageList object


While working on a project of mine using skinned buttons, I ran into problems when I tried to use a CImageList as the source of the state images.

The CImageList does not provide any direct access to the separate images within the list. I searched, and searched and searched and search... well you get the idea... Anyway after banging my head against the keyboard for 4 days, I finally found a solution.

The GetImageFromList function

The result of my headaches is the GetImageFromList function. If you are familiar with using CDCs then you are probably already calling this an obvious solution - but then, why are you reading this article in the first place?

Here is the function I managed to come up with (with the help of sites like this):

It takes 3 parameters, and returns nothing.

  • lstImages: A pointer to the CImageList object containing all of the images.
  • nImage: The index of the image that is going to be extracted.
  • destBitmap: A pointer to the CBitmap object that is going to contain the extracted image.

The function makes a copy of the image list, and moves the requested image to the front of that list.

It then draws the requested image into the destination bitmap.

void CMyWindowClass::GetImageFromList(CImageList *lstImages, 
                             int nImage, CBitmap* destBitmap)
     //First we want to create a temporary image list we can manipulate
     CImageList tmpList;
    //Then swap the requested image to the first spot in the list 
    tmpList.Copy( 0, nImage, ILCF_SWAP );
    //Now we need to get som information about the image 
    IMAGEINFO lastImage;
    //Heres where it gets fun
    //Create a Compatible Device Context using 
    //the valid DC of your calling window
    CDC dcMem; dcMem.CreateCompatibleDC (GetWindowDC()); 
    //This rect simply stored the size of the image we need
    CRect rect (lastImage.rcImage);
    //Using the bitmap passed in, Create a bitmap 
    //compatible with the window DC
    //We also know that the bitmap needs to be a certain size.
    destBitmap->CreateCompatibleBitmap (this->GetWindowDC(), 
                                      rect.Width (), rect.Height ());
    //Select the new destination bitmap into the DC we created above
    CBitmap* pBmpOld = dcMem.SelectObject (destBitmap);
    //This call apparently "draws" the bitmap from the list, 
    //onto the new destination bitmap
    tmpList.DrawIndirect (&dcMem, 0, CPoint (0, 0), 
           CSize (rect.Width (), rect.Height ()), CPoint (0, 0));
    //cleanup by reselecting the old bitmap object into the DC
    dcMem.SelectObject (pBmpOld);

It looks big, but remove the comments and you have a mere 12 lines of code.


I hope that this article can save at least one person from going through what I went through to find the answer.

Good Luck, and Happy Coding!!


This article, along with any associated source code and files, is licensed under A Public Domain dedication


About the Author

Canada Canada
No Biography provided

You may also be interested in...

Comments and Discussions

GeneralCreate Multipage Images Pin
raju_Code30-Sep-09 21:50
memberraju_Code30-Sep-09 21:50 
QuestionIs it really your code? Pin
rom190429-Mar-08 10:00
memberrom190429-Mar-08 10:00 
AnswerRe: Is it really your code? Pin
leonbourassa22-Dec-08 14:40
memberleonbourassa22-Dec-08 14:40 
GeneralGetImageInfo fails with ILC_COLOR8 Pin
Nyarlatotep29-Oct-07 9:51
memberNyarlatotep29-Oct-07 9:51 
GeneralOr if using GDI+ Pin
joe_turpin1-Aug-07 10:23
memberjoe_turpin1-Aug-07 10:23 
NewsMemory EATER !!! Pin
Manni Singh24-Sep-06 6:01
memberManni Singh24-Sep-06 6:01 
GeneralRe: Memory EATER !!! Pin
wangdxhsuperman1-Feb-07 19:06
memberwangdxhsuperman1-Feb-07 19:06 
QuestionHow to Load from Disk Drive???? Pin
Manni Singh25-Jul-06 22:08
memberManni Singh25-Jul-06 22:08 
AnswerRe: How to Load from Disk Drive???? Pin
DavidCrow2-Mar-11 5:06
memberDavidCrow2-Mar-11 5:06 
GeneralThank you Pin
Fastfootskater30-Aug-05 20:19
memberFastfootskater30-Aug-05 20:19 
GeneralCImageList from a set of CBitmap Pin
Divya Rathore23-Apr-05 1:15
memberDivya Rathore23-Apr-05 1:15 
GeneralRe: CImageList from a set of CBitmap Pin
Divya Rathore23-Apr-05 1:49
memberDivya Rathore23-Apr-05 1:49 
GeneralThank you! Pin
Michael Klim15-Feb-05 9:05
memberMichael Klim15-Feb-05 9:05 
QuestionWhy not just use CopyImage()? Pin
spirit2kxx9-Feb-05 12:28
memberspirit2kxx9-Feb-05 12:28 
AnswerRe: Why not just use CopyImage()? Pin
synphreak24-Jun-05 10:11
membersynphreak24-Jun-05 10:11 
GeneralRe: Why not just use CopyImage()? Pin
LuisM22-Aug-05 2:15
memberLuisM22-Aug-05 2:15 
GeneralI am puzzled! Pin
CPAVG4-Apr-04 22:13
memberCPAVG4-Apr-04 22:13 
QuestionWhy this is necessary?? Pin
CPAVG4-Apr-04 22:04
memberCPAVG4-Apr-04 22:04 
AnswerRe: Why this is necessary?? Pin
synphreak24-Jun-05 10:17
membersynphreak24-Jun-05 10:17 
GeneralSpeed Pin
Francois Bedard8-Sep-03 10:59
sussFrancois Bedard8-Sep-03 10:59 
GeneralRe: Speed Pin
CPAVG5-Apr-04 5:06
memberCPAVG5-Apr-04 5:06 
GeneralNice Work BUT.... Pin
Howard Schmaeu8-Sep-03 2:38
memberHoward Schmaeu8-Sep-03 2:38 
GeneralRe: Nice Work BUT.... Pin
leonbourassa8-Sep-03 4:30
memberleonbourassa8-Sep-03 4:30 
GeneralRe: Nice Work BUT.... Pin
Howard Schmaeu8-Sep-03 4:39
memberHoward Schmaeu8-Sep-03 4:39 
GeneralRe: Nice Work BUT.... Pin
leonbourassa8-Sep-03 4:41
memberleonbourassa8-Sep-03 4:41 
GeneralRe: Nice Work BUT.... Pin
Howard Schmaeu8-Sep-03 22:25
memberHoward Schmaeu8-Sep-03 22:25 
QuestionRe: Nice Work BUT.... Pin
Rui Frazao9-May-07 23:34
memberRui Frazao9-May-07 23:34 
GeneralNice Work Pin
Howard Schmaeu8-Sep-03 1:16
memberHoward Schmaeu8-Sep-03 1:16 
GeneralGenius !!! Pin
Robert Decker5-Aug-03 0:34
memberRobert Decker5-Aug-03 0:34 
GeneralRe: Genius !!! Pin
leonbourassa7-Aug-03 19:12
memberleonbourassa7-Aug-03 19:12 

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.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.170713.1 | Last Updated 1 Aug 2003
Article Copyright 2003 by leonbourassa
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid