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.
-
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.
-
danke für die hilfe lansam versteh ich was da passiert. mitlerweile wird auch NM_CUSTOMDRAW für jedes subitem angesprochen.
