CListCtrl Farbe
-
hallo,
in meinen programm will ich die ListView ein wenig farbiger gestallten.
um eine passable lösung zu finden hab ich diese forum druchstöbert.
Dabei bin ich auf viele threads gestossen mit vielen querverweisen, die ich meistens alles durchgelesen habe.
jedoch bekomme ich durch diese informationen keine lösung zustande.
deshalb möchte ich euch mein derzeitiges problem schildern.ich hab eine klasse (ForkCListCtrl) erstellt die von CListCtrl erbt.
in dieser klasse überschreibe ich die virtuelle funktion
void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
in dieser methode steht folgendes:COLORREF text; text = RGB(255, 0, 0); SetBkColor(text);
darauf erstelle ich mit dem klassenwizzard eine membervariable in meiner Dlg klasse.
name: m_CListCtrl type: kategorie: Control type: ForkCListCtrlnun weis ich nicht mehr weiter.
könnt ihr mir helfen?gruß xerxes
-
Um Text farbig zu gestalten musst du nicht die WM_DRAWITEM verwenden !
Machs so:CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_LIST); pList->SetBkColor(RGB(255,0,0)); pList->SetTextBkColor(RGB(0,0,255));
Hoffe konnte dir helfen !
Gruß
:: NoName ::
-
hi,
ja damit hab ich es schon versucht, jedoch wird die ganze listview mit einer farbe
ausgefüllt. um mein vorhaben vielleicht ein wenig zu spezifizieren.
ich möchte zeilen unterschiedlich färben bzw den text einer zeilegruß xerxes
-
Du könntest eine Schleife bilden und in der 3 Zufallszahlen erzeugen die du für SetTextColor nimmst!
#include <time.h> #include <stdlib.h> CListCtrl* pList = (CListCtrl*) GetDlgItem(IDC_LIST); for(int i = 0; i < pList->GetItemCount(); i++) { srand(time(NULL)); int Red = rand() % 255; int Green = rand() % 255; int Blue = rand() % 255; pList->SetTextColor(RGB(Red, Green, Blue)); }
Ein versuch ist es wert !
Gruß
:: NoName ::
-
Hi!
1. Leite Dir eine Klasse in von CListCtrl ab.
2. Hol Dir die CustomDraw Nachricht mit dem Assi.
3. Im CDDS_ITEMPREPAINT-Stage veränderst Du die Farben "reihenweise":void CMyListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) { NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR ); *pResult = CDRF_DODEFAULT; switch (pLVCD->nmcd.dwDrawStage) { case CDDS_PREPAINT: // Wir wollen eine ITEMPREPAINT Nachricht also: *pResult = CDRF_NOTIFYITEMDRAW; break; case CDDS_ITEMPREPAINT | CDDS_ITEM: { if ((int)pLVCD->nmcd.dwItemSpec % 2 == 1) { pLVCD->clrText = RGB(0,0,0); // Unsere Schriftfarbe pLVCD->clrTextBk = RGB(240,240,240); // Unsere Hintergrundfarbe } *pResult = CDRF_DODEFAULT; break; } default: *pResult = CDRF_DODEFAULT; break; } }
Fertig!
Gruß T.
-
hi,
ich hab jetzt eine klasse namens ListCtrlColor erstellt die von CListCtrl erbt.
in diese klasse habe ich die methode
void ListCtrlColor::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
hinzugefügt. danach hab ich den klassenwizzard aufgerufen.
dort hab ich unter "nachrichtenzuordungstabellen" bei der Dlg klasse nach der customdraw nachricht gesucht. jedoch hab ich nichts gefunden.gruß xerxes
-
Sorry, der Klassen-Assi bietet NM_CUSTOMDRAW ja gar nicht an. Ist aber kein Problem. Einfach manuell die Nachricht zur Messagemap Deiner Klasse hinzufügen, aber immer schön außerhalb des für den Assi reservierten Bereichs.
In der ListCtrlColor.cpp:BEGIN_MESSAGE_MAP(ListCtrlColor, CListCtrl) //{{AFX_MSG_MAP(ListCtrlColor) //Bereich für den Assi //}}AFX_MSG_MAP ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw) // <- Neuer Eintrag END_MESSAGE_MAP()
In der ListCtrlColor.h:
// Generierte Nachrichtenzuordnungsfunktionen protected: //{{AFX_MSG(ListCtrlColor) //Bereich für den Assi //}}AFX_MSG afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult); // <- Neuer Eintrag DECLARE_MESSAGE_MAP()
Jetzt sollte es laufen!
Gruß T.