List Control - SetTextColor(RGB(0,0,255)); auch für einzelne Items?



  • hi leute!
    wie kann man die farbe einzelner Items in einer List Control ändern? ich hab nur

    SetTextColor
    

    gefunden das setzt dann alle items;-( will aber nur bei bestimmten die Textfarbe ändern...

    cu



  • Fang die Meldung NM_CUSTOMDRAW ab. Dort kannst vor jedem Zeichnen eines Items die Textfarbe ändern.

    Grüsse,
    don_basto



  • danke;-)
    was ist der unterschied zw.: NMLVCUSTOMDRAW und LPNMCUSTOMDRAW?
    wie sag ich jetzt ich will nur 3tes item blau...es werden ja nun hier alle items gefärbt...

    cu

    void CClient_GUIDlg::OnNMCustomdrawList1(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR); 
    	//LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
    	// TODO: Add your control notification handler code here
    	*pResult = 0;
    
    	// First thing - check the draw stage. If it's the control's prepaint
        // stage, then tell Windows we want messages for every item.
    	if (pLVCD->nmcd.dwDrawStage == CDDS_PREPAINT) { 
              *pResult = CDRF_NOTIFYITEMDRAW; 
    	}
    
    	// This is the notification message for an item.  We'll request
        // notifications before each subitem's prepaint stage.
    	else if (pLVCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) {
            *pResult = CDRF_NOTIFYSUBITEMDRAW; 
    	}
    
    	// This is the prepaint stage for a subitem. Here's where we set the
        // item's text and background colors. Our return value will tell 
        // Windows to draw the subitem itself, but it will use the new colors
        // we set here.
        else if (pLVCD->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM)) 
        {
    		// Store the colors back in the NMLVCUSTOMDRAW struct.
    		pLVCD->clrText = RGB(0, 0, 255);
    
    		// Tell Windows to paint the control itself.
            *pResult = CDRF_DODEFAULT; 
        } 
    }
    


  • // This is the notification message for an item.  We'll request
        // notifications before each subitem's prepaint stage.
    	if (pLVCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) {
    		if (pLVCD->nmcd.dwItemSpec==3) {
    			pLVCD->clrText = RGB( 0, 0, 255)
    			*pResult = CDRF_NOTIFYITEMDRAW; 
    		}
    		if (pLVCD->nmcd.dwItemSpec>3) {
    			pLVCD->clrText = RGB( 0, 0, 0)
    			*pResult = CDRF_DODEFAULT; 
    		}
    	}
    

    Bei Codeproject find'ste gute Beiträge zu dem Thema!!!



  • hi, danke;-)

    ich wollte das eigentlich so machen: das item mit der ID=1 den text blau färben;-) ...mal schaun ob ich das auch kann;-)
    nun möcht ich das alle blauen items am anfang der List Control platziert werden, danach die in schwarz...ist sowas möglich?

    cu



  • marko. schrieb:

    ich wollte das eigentlich so machen: das item mit der ID=1 den text blau färben;-)
    nun möcht ich das alle blauen items am anfang der List Control platziert werden, danach die in schwarz...ist sowas möglich?

    Sobald du ein Item verschiebst bzw. sortierst, mußt du die ListCtrl neu zeichenen, also neu einfärben. Deswegen erst sortieren:
    1. Die 'blauen' Items an den Anfang verschieben.
    2. Die 'blauen' Items in OnCustomDraw einfärben.

    Grüsse,
    don_basto



  • ja...aber die items die blau werden weiss ich erst zur runtime...und das könnnen irgendwelche sein..ist das ein problem?

    cu



  • marko. schrieb:

    ja...aber die items die blau werden weiss ich erst zur runtime...und das könnnen irgendwelche sein..ist das ein problem?

    Für mich nicht. 😃



  • nagut ich versuchs mal;-)
    wie komm ich von der id des items zu pLVCD->nmcd.dwItemSpec das ist ja die aktuelle pos des items in der list control!?
    cu 😃



  • marko. schrieb:

    wie komm ich von der id des items zu pLVCD->nmcd.dwItemSpec das ist ja die aktuelle pos des items in der list control!?

    pLVCD->nmcd.dwItemSpec ist der Index des Items, was gerade gezeichnet wird. Also die Position in der ListCtrl. Was meinst du mit ID?



  • ja das:

    m_Popup.InsertMenu(1, MF_BYPOSITION | MF_STRING, 1, "Send Message");
    

    der dritte parameter da ist ja die ID des items...die kann sich ja nicht verändern, die pos des items also param. 1 schon...
    ich müsste halt von der id des items auf die pos kommen...

    cu



  • das was du da gerade gezeigt hast gehört wahrscheinlich zu CMenu !!
    das ist was ganz anderes



  • also ich will nun folgendes machen:

    wenn ich auf einen button klicke will ich einen item "Gerald" in der list control blau einfärben und dann die list control nach der farbe sortieren...
    dh.: Gerald soll dann an pos 1 der list control stehen...

    wie komm ich von pszText auf die aktuelle Pos in der List Control?
    dann muss ich:
    1. Die 'blauen' Items an den Anfang verschieben.
    alle items löschen u neu einfügen? oder gibt es das was besseres?

    2. Die 'blauen' Items in OnCustomDraw einfärben.
    ich mach am besten einen std::vector wo ich alle items die blau werden sollen speichere?

    so füge ich die items in die list control ein:

    char* username[]={"Gerald","Marcel","windowsint","ChrisM","Sebi","evilissimo"};
    
    	LV_ITEM item; 
    	m_ListCtrl.InsertColumn(0,"Userlist",LVCFMT_LEFT,183,0);
    	item.mask=LVIF_TEXT;
    
        for(int j=0; j<6; j++)
        {
    		item.iItem=0;
            item.pszText=username[j];
            item.iSubItem=0;
            int itemNr=m_ListCtrl.InsertItem(&item);
         }
    


  • hm..irgendwie funktioniert das nicht;-( das mit dem sortieren klappt nicht...
    jemand ne idee? hab versucht in die list control alle items neu rein zu schreiben...hm

    cu



  • jemand nen rat? werd am weekend wieder mal hier was weiter machen...

    cu



  • help is needed;-)


Anmelden zum Antworten