Listcontrol zweifarbig darstellen
-
Der cast ist falsch:
LPNMCUSTOMDRAW pLVCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);Muss heißen:
LPNMLVCUSTOMDRAW pLVCD = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);
-
Wie, nicht bekannt? Sagt der Compiler dir das? Sieht eigentlich richtig aus...
-
Ich habe es in der Funktion wie folgt abgeändert, was zwar kompilierbar ist,
jedoch die Zeilen nicht zweifarbig darstellt:LPNMLVCUSTOMDRAW pLVCD = reinterpret_cast<LPNMLVCUSTOMDRAW>(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; } *pResult = 0;Selbst bei der Schriftfarbe tut sich nichts, wenn ich die RGB-Werte verändere.
-
Springt er denn überhaupt in diesen Zweig rein?
Sollte "case CDDS_ITEMPREPAINT | CDDS_ITEM:" vielleicht eher " case CDDS_ITEMPREPAINT || CDDS_ITEM:" heißen?
-
Hi _matze,
springt tatsächlich nicht rein.
Ich habe es jetzt so gelöst:
LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR; switch(lplvcd->nmcd.dwDrawStage) { case CDDS_PREPAINT: { *pResult = CDRF_NOTIFYITEMDRAW; // ask for item notifications. break; } case CDDS_ITEMPREPAINT: { *pResult = CDRF_DODEFAULT; int iRow = lplvcd->nmcd.dwItemSpec; if(iRow & 1) { lplvcd->clrTextBk = RGB(240, 240, 240); lplvcd->clrText = RGB(0, 0, 0); *pResult = CDRF_NEWFONT; } break; } default: *pResult = CDRF_DODEFAULT; }Warum die andere Variante nicht greift...keine Ahnung?!
Alles was anders ist im Vergleich zu bisherigen Projekten ist,
dass ich VS2008 verwende und da scheinbar einiges anders Tickt
Es wird z.B. beim Anlegen des Handlers nicht
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );sondern
LPNMCUSTOMDRAW pLVCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);erzeugt. Ich versteh es einfach nicht

-
Das CDDS_ITEMPREPAINT | CDDS_ITEM muss richtig sein.
Daran liegt es nicht.
-
Nein! IMHO muss es CDDS_ITEMPREPAINT | CDDS_SUBITEM heißen.
EDIT: Ich muss mich korrigieren. Das gilt nur, wenn man auch Subitems behandeln will.
Da
#define CDDS_ITEMPREPAINT (CDDS_ITEM | CDDS_PREPAINT)defniert ist, ist
case CDDS_ITEMPREPAINT:mit
case CDDS_ITEMPREPAINT | CDDS_ITEM:identisch
-
Hmm, komisch. Dann verstehe ich nicht warum sich nichts rührt...
-
Weil Du selbst willst, dass Du keine weiteren Notifications bekommst!!!!

Schau mal am Ende Deines Switch Blocks, da steht:
*pResult = 0;Ich würde mal sagen: Kein Wunder!
-
Lol
