Эта статья объясняет, как изменить иконку или битмап в ячейке 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; } |