2012-01-11 16 views
6

Utilizzo di MFC e Visual Studio 2010 C++. Ho bisogno di un modo per far risaltare alcune singole righe di un CListCtrl (tuttavia non voglio usare la funzionalità di selezione integrata per evidenziare le righe). Potrebbe essere il colore dello sfondo della riga, o il peso del font, o forse anche un'immagine (se è performante).MFC: Come cambiare colore/audacia delle righe inimitabili di ListCtrl?

Idealmente, voglio sapere come farlo utilizzando il controllo della lista azionaria. Tuttavia, se ciò non è possibile, fammi sapere come utilizzare il codice di terze parti.

UPDATE

Ecco il codice che ho finito per usare:

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; 
    } 
} 

Nel mio caso, non stavo usando l'ItemData per qualsiasi cosa, così ho chiamato SetItemData altrove con un valore booleano a indica se la riga deve essere evidenziata.

+2

questo è davvero esattamente quello che ho in mente la testa ;-) Per quanto riguarda 'GetItemData (RowNumber)', non avete a disposizione in 'cd-> nmcd.lItemlParam' –

+0

@ Serge-appTranslator: buon punto ah , salverebbe una chiamata.Dovrò provarlo. – User

risposta

5

Il messaggio chiave qui è il messaggio NM_CUSTOMDRAW inviato a CListCtrl (e altri controlli). Ti permette di dire a Windows che vuoi personalizzare alcune parti di CListCtrl. L'idea è che il messaggio ti permetta di dire quale parte del controllo deve essere disegnata su misura. Perché il disegno personalizzato dell'intero CListCtrl solo per cambiare il colore del testo di una cella sarebbe totalmente eccessivo.

Non preoccuparti, non devi gestire autonomamente il disegno personalizzato: il messaggio consente di impostare il carattere e/o il testo/il colore di sfondo per una riga o una cella specifica del controllo.

This codeproject article è probabilmente un buon punto di partenza.

Here is a shorter code example per impostare il colore di una linea specifica in CListCtrl.

-2

È possibile utilizzare il codice seguente per modificare l'intero colore del backgroud dell'elenco, ma non sono sicuro che sia disponibile una funzionalità supportata per modificare il colore per riga. Segue il codice:

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

Spero che sia d'aiuto.

+1

Tutto è possibile. –

+0

Sì, credo ora. –

-3

Ecco quello che ho fatto per il mio programma, se la riga voglio evidenziata è un cin o un cout o qualsiasi altro semplicemente inserire questo codice al di sopra della stessa riga

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x0F); 

l'ultima parte cioè, 0x0F consente di modificare il codice colore dello sfondo e del testo

dopo averlo modificato con il colore desiderato, basta inserire un altro sotto la riga che si desidera evidenziare, vale a dire;

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x0C); 

Ecco la tabella dei colori e dei loro codici

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 

ESEMPIO per uno sfondo nero e testo blu;

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

OP chiesto come impostare il colore della riga di un CListControl ... –

Problemi correlati