[CTreeCtrl] NM_CUSTOMDRAW und GetItemState()



  • Hi,

    ich ändere die Hintergrundfarbe eine tvItems über die NM_CUSTOMDRAW. Falls das Item ausgewählt ist, soll es ganz normal angezeigt werden. Den Zustand erfrage ich über GetItemState(). Nun gibt es ein Problem:
    Wenn ich einen Knoten expandiere, dann funktioniert die Abfrage mit GetItemState() nicht mehr? 😕

    void CExView::OnNMCustomdrawMainList(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	LPNMTVCUSTOMDRAW pTVCD = reinterpret_cast<LPNMTVCUSTOMDRAW>(pNMHDR);
    	*pResult = CDRF_DODEFAULT;
    
    	const COLORREF crCompleted = RGB(240, 255, 240);
    	const COLORREF crPrepared  = RGB(255, 240, 240);
    
    	// Zeichnen von jedem Item melden
    	if (pTVCD->nmcd.dwDrawStage == CDDS_PREPAINT)
    		*pResult = CDRF_NOTIFYITEMDRAW;
    	if (pTVCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
    	{
    		// Von jedem Eintrag den Zustand ermitteln und entsprechend färben	
    		CTreeCtrl* pTree = reinterpret_cast<CTreeCtrl*>(GetDlgItem(IDC_MAIN_LIST));
    		HTREEITEM hItem = reinterpret_cast<HTREEITEM>(pTVCD->nmcd.dwItemSpec);
    		if (pTree->GetItemState(hItem, TVIS_SELECTED)==TVIS_SELECTED) {
    			TRACE("View::OnNMCustomdraw()> Markiertes Item.\n");
    			return;
    		}
    		int nType = static_cast<int>(pTVCD->nmcd.lItemlParam);
    		switch (nType) {
    			// Einfärben
    			// ..
    		}
    
    	}
    }
    

    Was kann ich nach dem Expandieren eines Items den Zustand ermitteln?

    Danke,
    don_basto.



  • Hab einen Weg gefunden. 😃

    if (pTree->GetItemState(hItem, TVIS_SELECTED)==TVIS_SELECTED) {
    	TRACE("View::OnNMCustomdraw()> Markiertes Item.\n");
    	return;
    } 
    //  ersetzen mit:
    if (pTVCD->nmcd.uItemState & CDIS_SELECTED)	return;
    

    Und schon funktioniert's. Kann mir jemand sagen, was an dem ersten Ansatz falsch ist?

    Grüsse,
    don_basto.


Anmelden zum Antworten