Listcontrol zweifarbig darstellen


  • Mod

    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.


  • Mod

    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...


  • Mod

    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 😃


Anmelden zum Antworten