Listenelemente unter Listview farbig gestallten



  • ich habe eine Liste mit CreateWindowEx erstellt und möchte nun einzelne Listenelemente farbig markieren. ich hab mir dieses beispiel von Code-Project mal näher zu gemühte geführt. Leider haut das so bei mir nicht hin.

    Ich subclasse die Callback prozedur die mir die die NM_CUSTOMDRAW nachricht abfängt. Leider wird mir die NM_CUSTOMDRAW Nachricht nur einmal abgearbeitet. und zwar nur wenn Header der Liste gesetzt werden. In dem Beispiel jedoch wird pro element die NM_CUSTOMDRAW angesprochen.
    jedoch andere Nachrichten werden korrekt in der Callback verarbeitet(siehe WM_MOUSEMOVE).

    so starte ich die Subclass Callback

    m_ListCtrlProc = (WNDPROC)SetWindowLongPtr(hWndList, GWLP_WNDPROC, (LONG_PTR)ListCtrlProc);
    
    LRESULT CALLBACK ListCtrlProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    
        // zunaechst die originale WNDPROC aufrufen
        LRESULT lResult = CallWindowProc(m_ListCtrlProc, hWnd, uMsg, wParam, lParam);
    
        switch(uMsg)
        {
    		case WM_MOUSEMOVE:
    			{
    				//Hier arbeiete die Nachricht korreckt
    			}
    		break;
    
    		case WM_NOTIFY:
    			{
    				NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)((LPNMHDR)lParam);
    
    				switch(pNMListView->hdr.code)
    				{
    					case NM_CUSTOMDRAW:
    						{
    						    LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam;
    
    							switch(lplvcd->nmcd.dwDrawStage)
    							{
    								case CDDS_PREPAINT : //Before the paint cycle begins
    									{
    										//request notifications for individual listview items
    										//return CDRF_NOTIFYITEMDRAW;
    									}
    								break;
    
    								case CDDS_ITEMPREPAINT: //Before an item is drawn
    									{
    										//return CDRF_NOTIFYSUBITEMDRAW;
    									}
    								break;
    
    								case CDDS_SUBITEM | CDDS_ITEMPREPAINT: //Before a subitem is drawn
    									{
    										switch(lplvcd->iSubItem)
    										{
    
    										}
    
    									}
    								break;
    							}
    						return CDRF_DODEFAULT;
    						}
    					break;
    				}
    			}
    		break;
        }
    
      return(lResult);
    }
    

    weis jemand was ich verkehrt mach, oder weis jemand ein besseres beispiel??
    bin für jeden denkanstoß dankbar.



  • HILFE,
    ich hab jetzt nochmal von vorne begonnen. ich frage die NM_CUSTOMDRAW nachricht in der callback procedur des Dialoges ab. aber egal wie ich es anstelle, (ob ich die NM_CUSTOMDRAW nachricht so abfrage wie in dem beispiel von Code-Project LPNMLISTVIEW pnm = (LPNMLISTVIEW)lParam bzw. mit switch(((LPNMHDR)lParam)->code)) es wird NM_CUSTOMDRAW nur einmal aufgerufen.

    weis da jemand rat, warum das bei mir so passiert.


  • Mod

    Du darfst nicht CDRF_DODEFAULT returnieren.
    In diesem Fall macht den Rest das List View und NM_CUSTOMDRAW wird nie wieder ausgeführt.
    Du musst einen anderen Dir entsprechenden Code returnieren z.B. CDRF_NOTIFYPOSTERASE.

    http://msdn2.microsoft.com/en-us/library/bb774865.aspx



  • danke für die hilfe lansam versteh ich was da passiert. mitlerweile wird auch NM_CUSTOMDRAW für jedes subitem angesprochen.
    👍


Anmelden zum Antworten