2012-01-11 9 views
6

Uso de MFC y Visual Studio 2010 C++. Necesito una forma de destacar ciertas filas individuales de un CListCtrl (sin embargo, no quiero usar la capacidad de selección incorporada para resaltar las filas). Podría ser el color del fondo de la fila, o el peso de la fuente, o posiblemente incluso una imagen (si eso es posible).MFC: ¿Cómo cambiar el color/negrita de las filas individuales de ListCtrl?

Lo ideal es que sepa cómo hacerlo utilizando el control de lista de existencias. Sin embargo, si esto no es posible, hágamelo saber de alguna manera usando código de terceros.

ACTUALIZACIÓN

Aquí está el código que terminé usando:

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

En mi caso, yo no estaba usando el ItemData para nada, así que me llamaron SetItemData en otros lugares con un valor booleano para indique si la fila debe estar resaltada.

+2

Eso es de hecho exactamente lo que la cabeza en cuenta ;-) En cuanto a 'GetItemData (rowNumber)', no lo tienes disponible en 'CD-> nmcd.lItemlParam' –

+0

@ Serge-appTranslator: ah buen punto , salvaría una llamada.Tendré que intentar eso. – User

Respuesta

5

El mensaje clave aquí es el mensaje NM_CUSTOMDRAW enviado a su CListCtrl (y algunos otros controles). Le permite decirle a Windows que desea dibujar una parte personalizada de CListCtrl. La idea es que el mensaje te permita decir qué parte del control debe dibujarse a medida. Debido a que el dibujo personalizado de todo el CListCtrl solo para cambiar el color del texto de una celda sería totalmente exagerado.

No se preocupe, no tiene que manejar el sorteo personalizado usted mismo: El mensaje permite establecer la fuente y/o el texto/color de una fila o celda específica del control.

This codeproject article es probablemente un buen punto de partida.

Here is a shorter code example para establecer el color de una línea específica en su CListCtrl.

-2

Puede usar el siguiente código para alterar el color de fondo de la lista completa, pero no estoy seguro de que haya una funcionalidad compatible para cambiar el color por fila. A continuación se muestra el código:

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

Espero que ayude.

+1

Todo es posible. –

+0

Sí, creo ahora. –

-3

Esto es lo que hice para mi programa, si la fila que quiero destacar es una cin o cout o cualquier otro sólo hay que poner este código por encima de la dicha fila

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x0F); 

la última parte es decir, 0x0F le permite cambiar el código de color del fondo y el texto

después de cambiar eso al color deseado, simplemente inserte otro debajo de la fila que desea resaltar, es decir;

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x0C); 

aquí es la tabla de colores y sus códigos

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 

Ejemplo para un fondo negro y el texto azul;

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

OP preguntó cómo establecer el color de la fila de un CListControl ... –

Cuestiones relacionadas