2013-05-28 3 views
3

У меня есть CListCtrl, и мне нужно изменить цвет СПЕЦИФИЧЕСКОГО символа/набора символов (который я выбираю путем сравнения) из текста каждой ячейки в список.Изменение цвета конкретного символа в элементе в CListCtrl в MFC

Я знаю, как изменить цвет всего текста ячейки, когда я нахожу символ/набор символов (используя команду strstr), но я не могу найти пример, который показывает, как изменить ТОЛЬКО символ/набор символов.

Вот пример моего кода:

void Agenda::OnCustomdrawMyList(NMHDR* pNMHDR, LRESULT* pResult) 
    { 
     NMLVCUSTOMDRAW* pLVCD = (NMLVCUSTOMDRAW*)pNMHDR; 

     *pResult = CDRF_DODEFAULT; 

     if (CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage) 
     { 
      *pResult = CDRF_NOTIFYITEMDRAW; 
      return; 
     }else if (CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage) 
     { 
      *pResult = CDRF_NOTIFYSUBITEMDRAW; 
      return; 
     }else if ((CDDS_SUBITEM | CDDS_ITEMPREPAINT) == pLVCD->nmcd.dwDrawStage) 
     { 

      // So right now I am in the stage where a SUBITEM is PREPAINTED 

      int nItem = pLVCD->nmcd.dwItemSpec; 
      int nSubItem = pLVCD->iSubItem; 

      char a[100]; 
      listControl.GetItemText(nItem,nSubItem,a,100); 

      COLORREF textColorFound, textColorDefault; 
      textColorDefault = RGB(0,0,0); 
      pLVCD->clrText = textColorDefault; 

      char* startingFrom; 

      if((startingFrom = strstr(a,filterText)) != NULL) { 
        // Could I set a pointer here or something like that so 
        // the coloring could start only from 'startingFrom' 
        // and stop at 'strlen(filterText)' characters? 

       textColorFound = RGB(205,92,92); 
       pLVCD->clrText = textColorFound; 
      } 
      *pResult = CDRF_DODEFAULT; 
     } 
    } 
  • ListControl переменная для моего CListCtrl
  • другие вещи довольно очевидны
+1

Я бы сказал, что нужно, чтобы владелец рисовал подэлементы. Выбранное пользовательское решение для рисования позволяет вам изменять свойства (текст или цвет фона, шрифт ...) всего подэлемента, а затем список рисует его с этими свойствами. Одна вещь, которая приходит мне на ум, которую я не пробовал, заключается в том, чтобы переопределить чертеж в фазе CDDS_ITEMPOSTPAINT. Но это в значительной степени владелец-рисование его после того, как он был нарисован. Но вы можете выбрать, когда вам это нужно. – MikMik

+0

Хотя я мог бы избежать использования CustomDraw, но я начну искать. Спасибо за ваш ответ. –

ответ

2

Нет, вы не можете сделать это. То, что вам нужно будет сделать, - это нарисовать текст, о котором идет речь. Это будет сложно, потому что вам придется делать это с помощью двух разных вызовов, между которыми вам придется вручную настроить цвет и расположение чертежа, чтобы учесть интерхарактерный интервал и т. Д. И вы лучше надеюсь, что вам не понадобится для выполнения многострочного вывода.

Посмотрите на статью Neat Stuff to Do in List Controls Using Custom Draw от Michael Dunn по CodeProject, чтобы получить некоторые идеи о том, как действовать.

В качестве альтернативы, если вы можете использовать Toolkit Pro инструментарий от CodeJock вы можете использовать их «XAML» поддержки (я использую кавычки, потому что это не действительно XAML, но их собственная реализация подмножества из XAML) и пусть сделайте всю тяжелую работу.

+0

вручную отрегулируйте цвет и расположение чертежа
Итак, как я могу это сделать? Это то, что я ищу. Я знаю этот учебник из codeproject. То, что я сделал до сих пор, оттуда. –

+0

Вы не можете сделать это на основе персонажа. Вы можете сделать это для строки * whole *. –

0

Копаем по той же проблеме; Но я бы не стал дорабатывать/добавлять к по умолчанию поведение Windows для рисования строк ... видимо, это было бы конечной точкой, когда он был бы нарисован владельцем. (Aici am murit si eu :).