Как изменить иконку или битмап в выбранной ячейке CListCtrl

Эта статья объясняет, как изменить иконку или битмап в ячейке CListCtrl когда она выбрана.

Когда, Вы инициализируете CListCtrl при помощи вызова CListCtrl::InsertItem(), то Вы можете передать в значении I_IMAGECALLBACK номер картинки. То есть, при получении уведомления LVN_GETDISPINFO надо сообщить системе номер картинки, которая должна быть показана. Для этого, внутри обработчика LVN_GETDISPINFO, необходимо устроить проверку.

Пример кода

 BEGIN_MESSAGE_MAP(CTestView, CView)
//{{AFX_MSG_MAP(CTestView)
ON_WM_CREATE()
//}}AFX_MSG_MAP
ON_NOTIFY (LVN_GETDISPINFO, IDI_LIST, OnGetDispInfo)
END_MESSAGE_MAP()

int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// m_pImage, это переменная член CTestView, имеющая тип CImageList*
// и создающая CImageList с картинками 16x15
m_pImage = new CImageList();
VERIFY (m_pImage->Create (16, 15, TRUE, 0, 1));
CBitmap bm;
// IDR_MAINFRAME, это битмап тулбара в дефолтовом проекте
//
bm.LoadBitmap (IDR_MAINFRAME);
// Будет произведено автоматическое разделение битмапа на девять
// картинок.
m_pImage->Add (&bm, RGB (192, 192, 192));

// m_pList, это переменная член CTestView имеющая тип CListCtrl*,
// и создающая CListCtrl.
m_pList = new CListCtrl();
VERIFY (m_pList->Create (WS_VISIBLE | WS_CHILD | LVS_REPORT |
LVS_EDITLABELS, CRect (0, 0, 400, 400), this, IDI_LIST));
// Создаём колонку.
m_pList->InsertColumn (0, "Button Number", LVCFMT_LEFT, 100);
// Связываем CImageList с CListCtrl.
m_pList->SetImageList (m_pImage, LVSIL_SMALL);

char szTemp[10];
for (int iCntr = 0; iCntr < 9; iCntr++)
{
wsprintf (szTemp, "%d", iCntr);
m_pList->InsertItem (LVIF_IMAGE | LVIF_TEXT,
iCntr, szTemp, 0, 0, I_IMAGECALLBACK, 0L);
}
return 0;
}

void CTestView::OnGetDispInfo (NMHDR* pnmhdr, LRESULT* pResult)
{
LV_DISPINFO* pdi = (LV_DISPINFO *) pnmhdr;

// Заполняем структуру LV_ITEM информацией о картинке.
// Когда ячейка выбрана, то изображение устанавливается на первую
// картинку (новый bitmap на тулбаре).
// Когда она не выбрана, то индекс изображения равен номеру
// ячейки (то есть, 0=new, 1=open, 2=save, и т. д.)
if (LVIS_SELECTED == m_pList->GetItemState (pdi->item.iItem,
LVIS_SELECTED))
pdi->item.iImage = 0;
else
pdi->item.iImage = pdi->item.iItem;
}

CTestView::~CTestView()
{
// Очищаем.
delete m_pImage;
delete m_pList;
}  
 
« Предыдущая статья   Следующая статья »