Late binding of image - I_IMAGECALLBACK


When inserting an item in the list view control, you dont have to specify the image just then. You can delay a decision on the image by using a callback item. A callback item is an item that causes the list view control to send the LVN_GETDISPINFO notification to its parent whenever it needs information to display the item. The LVN_GETDISPINFO notification can be handled by the parent window or it can be reflected back to the list view control, the latter solution being the more preferred. Here are the steps to use message reflection.
 
  • Add a message handler for =LVN_GETDISPINFO in your CListCtrl derived class. The = sign indicates that it is a reflected message. This adds a line in the message map section which looks like
    ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetDispInfo)
  • Implement the message handler. The message handler shown below does not show any logic to decide on the image index. The image index would most likely be a function of the item index and/or the items data (pItem->lParam).
    void CMyListCtrl::OnGetDispInfo(NMHDR* pNMHDR, LRESULT* pResult) 
    { 
            LV_ITEM *pItem = &((LV_DISPINFO*)pNMHDR)->item; 
    
            if( pItem->mask & LVIF_IMAGE ) 
            { 
                    // GetImageFor() needs to be defined and should return image number 
                    pItem->iImage = GetImageFor( pItem-> iItem); 
            } 
           
            *pResult = 0; 
    }
     
  • Insert items using the I_IMAGECALLBACK value for image index. E.g.
  • m_listctrl.InsertItem( nRow, sItemText, I_IMAGECALLBACK );
 



Comments

  • Image Icons Does not appear if I close a dialog

    Posted by Legacy on 01/09/2002 12:00am

    Originally posted by: Shiv

    Hi,

    I have a Listcontrol in a dialog. I initialize the CImageList with Icons on the Dialog's OnInitDialog(). The icons appears the first I operate on the Dialog however when I close the dialog and start it again the Icons disappear. Can anybody tell me why? What exactly is going wrong?

    Thanx
    Shiv

    Reply
  • ... and with the overlay image as well.

    Posted by Legacy on 02/02/2000 12:00am

    Originally posted by: Kurt P. Gulden

    In Oleg Pilipenkos' earlier example, just replace the line:

    SetCallbackMask(GetCallbackMask() | LVIS_STATEIMAGEMASK);

    with...

    SetCallbackMask(GetCallbackMask() | LVIS_OVERLAYMASK);

    then, in the CFancyListCtrl::OnGetDispInfo() function, replace ( or modify ) the lines:

    if ((pDispInfo->item.mask & LVIF_STATE) != 0)
    pDispInfo->item.state = INDEXTOSTATEIMAGEMASK(nState);

    with...

    if ((pDispInfo->item.mask & LVIF_STATE) != 0)
    pDispInfo->item.state = INDEXTOOVERLAYMASK(nOverlayIndex);

    Yes, I know it looks weird, but it does work. Thanks Oleg for your keen example.

    Reply
  • It is also possible to "late bind" with the state image.

    Posted by Legacy on 02/25/1999 12:00am

    Originally posted by: Oleg Pilipenko

    If you modify the CListCtrl callback mask:
    
    

    SetCallbackMask(GetCallbackMask() | LVIS_STATEIMAGEMASK);

    in the GetDispInfo you can set state image index:

    void CFancyListCtrl::OnGetDispInfo(NMHDR* pNMHDR, LRESULT* pResult)
    {
    LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
    ASSERT_POINTER(pDispInfo, LV_DISPINFO);

    static CString str;
    int nImage = 0;
    int nState = 0;
    DoGetDispInfo(GetItemData(pDispInfo->item.iItem),
    pDispInfo->item.iSubItem,
    str,
    nImage,
    nState);

    if ((pDispInfo->item.mask & LVIF_TEXT) != 0)
    pDispInfo->item.pszText = (LPTSTR)LPCTSTR(str);

    if ((pDispInfo->item.mask & LVIF_IMAGE) != 0)
    pDispInfo->item.iImage = nImage;

    if ((pDispInfo->item.mask & LVIF_STATE) != 0)
    pDispInfo->item.state = INDEXTOSTATEIMAGEMASK(nState);

    ASSERT_POINTER(pResult, LRESULT);
    *pResult = 0;
    }

    where DoGetDispInfo() does the dirty work of actually retriving item\subitem text, item image and state.

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Live Event Date: October 29, 2014 @ 11:00 a.m. ET / 8:00 a.m. PT Are you interested in building a cognitive application using the power of IBM Watson? Need a platform that provides speed and ease for rapidly deploying this application? Join Chris Madison, Watson Solution Architect, as he walks through the process of building a Watson powered application on IBM Bluemix. Chris will talk about the new Watson Services just released on IBM bluemix, but more importantly he will do a step by step cognitive …

  • Live Event Date: October 29, 2014 @ 1:00 p.m. ET / 10:00 a.m. PT It's well understood how critical version control is for code. However, its importance to DevOps isn't always recognized. The 2014 DevOps Survey of Practice shows that one of the key predictors of DevOps success is putting all production environment artifacts into version control. In this eSeminar, Gene Kim will discuss these survey findings and will share woeful tales of artifact management gone wrong! Gene will also share examples of how …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds