15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


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