2012-01-11 14 views
6

Korzystanie z MFC i Visual Studio 2010 C++. Potrzebuję sposobu, aby wyróżnić poszczególne rzędy CListCtrl (jednak nie chcę używać wbudowanej możliwości zaznaczania wierszy). Może to być kolor tła wiersza, masa czcionki, a nawet obraz (jeśli jest to wydajność).MFC: Jak zmienić kolor/odwagę poszczególnych wierszy ListCtrl?

Idealnie chcę wiedzieć, jak to zrobić za pomocą kontrolki na liście. Jeśli jednak nie jest to możliwe, daj mi znać o sposobie korzystania z kodu innej firmy.

UPDATE

Oto kod I skończył przy użyciu:

void MyList::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult) 
{ 
    NMLVCUSTOMDRAW* cd = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR); 

    *pResult = CDRF_DODEFAULT; 

    switch(cd->nmcd.dwDrawStage) 
    { 
     case CDDS_PREPAINT: 
      *pResult = CDRF_NOTIFYITEMDRAW; 
      break; 

     case CDDS_ITEMPREPAINT: 
      { 
       int rowNumber = cd->nmcd.dwItemSpec; 
       bool highlightRow = (bool)GetItemData(rowNumber); 
       if (highlightRow) 
       { 
        COLORREF backgroundColor; 
        backgroundColor = RGB(255, 0, 0); 
        cd->clrTextBk = backgroundColor; 
       } 
      } 
      break; 

     default: 
      break; 
    } 
} 

W moim przypadku nie używał itemData do niczego, więc zadzwoniłem SetItemData gdzie indziej z wartością logiczną do wskazać, czy wiersz powinien być podświetlony.

+2

To rzeczywiście dokładnie to, co ja udać na uwadze ;-) Jeśli chodzi o 'GetItemData (RowNumber)', czy nie ma on dostępny w 'CD-> nmcd.lItemlParam' –

+0

@ Serge-appTranslator Ach dobrym punkcie , może zapisać połączenie.Będę musiał spróbować tego. – User

Odpowiedz

5

Kluczową wiadomością jest tutaj wiadomość NM_CUSTOMDRAW wysłana do twojego CListCtrl (i kilku innych kontrolek). Dzięki niemu możesz powiedzieć systemowi Windows, że chcesz niestandardowo narysować część CListCtrl. Pomysł polega na tym, że komunikat pozwala określić, która część formantu powinna być niestandardowo narysowana. Ponieważ niestandardowe rysowanie całego CListCtrl tylko w celu zmiany koloru tekstu komórki byłoby całkowicie przesadzone.

Nie martw się, nie musisz samodzielnie wykonywać losowania: Wiadomość pozwala ustawić czcionkę i/lub tekst/kolor tła dla jednego wiersza lub komórki kontrolki.

This codeproject article to prawdopodobnie dobry punkt wyjścia.

Here is a shorter code example aby ustawić kolor określonej linii w twoim CListCtrl.

-2

Możesz użyć następującego kodu, aby zmienić cały kolor tła listy, ale nie jestem pewien, czy jest obsługiwana funkcja zmiany koloru w wierszu. Poniżej znajduje się kod:

YourControl.SetBkColor(RGB(212,208,200)); 

Mam nadzieję, że to pomaga.

+1

Wszystko jest możliwe. –

+0

Tak, teraz wierzę. –

-3

Oto co zrobiłem do mojego programu, jeśli wiersz chcę podświetlony jest cin lub cout lub inny po prostu umieścić ten kod powyżej tego wiersza

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x0F); 

ostatnią część tj 0x0F pozwala zmienić kod koloru tła i tekstu po zmianie tego na żądany kolor, po prostu wstaw drugi pod wiersz, który chcesz podświetlić, tj;

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x0C); 

jest tutaj tabela kolorach i ich kodów

0 = Black  8 = Gray 
    1 = Blue  9 = Light Blue 
    2 = Green  A = Light Green 
    3 = Aqua  B = Light Aqua 
    4 = Red   C = Light Red 
    5 = Purple  D = Light Purple 
    6 = Yellow  E = Light Yellow 
    7 = White  F = Bright White 

PRZYKŁAD na czarnym tle i kolorze niebieskim;

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x01); 
+0

OP zapytał, jak ustawić kolor wiersza CListControl ... –

Powiązane problemy