Изменение цвета строки в элементе управления списком в MFC при двойном щелчке - PullRequest
0 голосов
/ 06 октября 2018

У меня есть элемент управления списком CListCtrl с именем m_listCtrl, который отображает ID, Firstname и Lastname при создании диалогового окна.В приведенном ниже коде я обрабатываю double click, получая position элемента, по которому щелкнули, и изменяя значение первого столбца этой строки.

//This is in the message map and IDC_LISTNAMES is the list control
ON_NOTIFY(NM_DBLCLK, IDC_LISTNAMES,  OnDoubleClick)


void CSqlMfcTestDlg::OnDoubleClick(NMHDR* pNMHDR, LRESULT* pResult) 
{

  POSITION pos = m_listCtrl.GetFirstSelectedItemPosition();
  if (pos == NULL)
  {
    TRACE(_T("No items were selected!\n"));
  }
  else
  {
    while (pos)
    {
        int nItem = m_listCtrl.GetNextSelectedItem(pos);

        itemClicked = nItem;
        CString idString = m_listCtrl.GetItemText(nItem, 0);
        CString textString = m_listCtrl.GetItemText(nItem, 1);
        MessageBox(L"Item Clicked is : " + textString);
        m_listCtrl.SetItemText(nItem,0, idString+L"(Clicked)");


    }
  }

}

вместо m_listCtrl.SetItemText(nItem,0, idString+L"(Clicked)"); Я хотел быдобавьте оператор, чтобы изменить цвет этой строки.

1 Ответ

0 голосов
/ 06 октября 2018

См. Этот фрагмент:

class MyListCtrl: public CListCtrl
{
   private:
      int m_row;
   public:
      afx_msg void OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult); // write your custom code in the definition
      afx void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);
}; 

class CSqlMfcTestDlg: public CDialogEx 
{
   private:
      MyListCtrl m_listCtrl;    
};

Определения (не проверено):

void MyListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
  LPNMLVCUSTOMDRAW  lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;
  int iRow = lplvcd->nmcd.dwItemSpec;

  switch(lplvcd->nmcd.dwDrawStage)
  {
     case CDDS_SUBITEM | CDDS_PREPAINT | CDDS_ITEM:
    {
         if(iRow == m_row)
         lplvcd->clrTextBk =  RGB(0,0,255);
    }
  }
}
void MyListCtrl::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    m_row = GetSelectionMark();
    RedrawItems(m_row, m_row);
}
...