Zwei verschiedene Listview und NM_CUSTOMDRAW
-
Hallo
ich Habe 2 Listview und versuche mit NM_CUSTOMDRAW die unterschiedliche farbige Zeile zu machen
Beide Listview sind über eine Funktion erstellt worden und unterscheiden sich nur über die ID (ID_LIST_FINDEN /ID_LIST_Suchen)
Das Problem ist Listview ID_LIST_Suchen bekommt die Farbigen Zeile
wenn ich
Listview ID_LIST_FINDEN stattdessen angebe , wird dieser nicht gefunden-> switch (LOWORD(wParam)) erkennt diese ID nicht
Jmd eine Idee woran das liegen könnte ?
Ich komme da grad nicht weiter , hoffe jemand kann dabei helfen
#define ID_LIST_SUCHEN 3001 #define ID_LIST_FINDEN 3002 hfinden = ListVfinden.ADD_ListView(320,25,215,270,ID_LIST_FINDEN); //Listview Finden (rechtes) aktivieren // hsuchen = ListVsuchen.ADD_ListView(6,70,200,215,ID_LIST_SUCHEN); //Listview Suchen (linkes) aktivieren //
HWND Listview::ADD_ListView (int x,int y,int w,int h,DWORD ID,int groesse) /*ListView erstellen */ { HWND liste= CreateWindowEx (0x00000201,WC_LISTVIEW,0,0x50010001|LVS_SINGLESEL,x,y,w,h,hwnd,((HMENU)ID),ThisInstance,NULL ); lhwnd = liste; DisplayFont = CreateFont (groesse, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "ARIAL"); SendMessage ( liste, WM_SETFONT, WPARAM(DisplayFont), TRUE); return liste; } int Listview::AddColumn(HWND hwndLV, int iCol, char* Text,char* Text1,char*Text2,char*Text3,char*Text4) { LVITEM lvI; lvI.mask = LVIF_TEXT /*| LVIF_IMAGE | LVIF_PARAM | LVIF_STATE*/; lvI.state = 0; lvI.stateMask = 0; lvI.iImage = 0; lvI.iSubItem = 0; lvI.lParam = (LPARAM)25; lvI.pszText = Text; lvI.iItem = (ListView_InsertItem(hwndLV, &lvI)); //Zeilenübergabe lvI.mask = LVIF_TEXT | LVIF_STATE; lvI.state = 0; lvI.stateMask = 0; lvI.iImage = 0; lvI.iSubItem = 1; lvI.pszText = Text1; SendMessage(hwndLV, LVM_SETITEM, 0, (LPARAM)(&lvI)); lvI.mask = LVIF_TEXT | LVIF_STATE; lvI.state = 0; lvI.stateMask = 0; lvI.iImage = 0; lvI.iSubItem = 2; lvI.pszText = Text2; SendMessage(hwndLV, LVM_SETITEM, 0, (LPARAM)(&lvI)); lvI.mask = LVIF_TEXT | LVIF_STATE; lvI.state = 0; lvI.stateMask = 0; lvI.iImage = 0; lvI.iSubItem = 3; lvI.pszText = Text3; SendMessage(hwndLV, LVM_SETITEM, 0, (LPARAM)(&lvI)); if (Text4 =="") return(0); lvI.mask = LVIF_TEXT | LVIF_STATE; lvI.state = 0; lvI.stateMask = 0; lvI.iImage = 0; lvI.iSubItem = 4; lvI.pszText = Text4; SendMessage(hwndLV, LVM_SETITEM, 0, (LPARAM)(&lvI)); return 0; }
LRESULT ListviewNotify(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (LOWORD(wParam)) { // ================================================================ case ID_LIST_FINDEN: switch ( ((LPNMHDR)lParam)->code ) { case NM_CUSTOMDRAW: { LPNMLVCUSTOMDRAW lpCD = (LPNMLVCUSTOMDRAW)lParam; // ======================================================== switch (lpCD->nmcd.dwDrawStage) { case CDDS_PREPAINT: //SetWindowLong(hWnd, DWL_MSGRESULT, CDRF_NOTIFYITEMDRAW); return CDRF_NOTIFYITEMDRAW; case CDDS_ITEMPREPAINT: if (lpCD->nmcd.dwItemSpec == SendMessage(GetDlgItem(hwnd, ID_LIST_FINDEN), LVM_GETNEXTITEM, -1, LVNI_SELECTED)) { lpCD->clrText = RGB(255,255,255); lpCD->clrTextBk = RGB(101,122,216); } else { lpCD->clrText = RGB(000,000,000); lpCD->clrTextBk = RGB(214,223,247); } if (lpCD->nmcd.uItemState & CDIS_HOT) lpCD->clrText = RGB(255,0,0); return CDRF_NEWFONT | CDRF_NOTIFYPOSTPAINT; /*case CDDS_ITEMPOSTPAINT: return CDRF_SKIPDEFAULT; if ( lpCD->nmcd.uItemState & CDIS_FOCUS ) return CDRF_SKIPDEFAULT;*/ break; } return CDRF_DODEFAULT; // ======================================================== } default: return false; } // ================================================================ } return false; }
-
Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ (auch C++0x) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Du gibst doch nut den Wert ID für das Listview an beim Erzeugen! Ich sehe nicht, dass Du die gesuchten IDs verwendest, die Du beim swtich case angegeben hast.
-
Da es sich um eine Klasse handelt - befindet sich die ID aufschlüsslung da drin , wollte jetzt nu wirklich nich alles Posten - es wird ja angezeigt , nur nicht bei allen Listview´s
hsuchen = GetDlgItem(hwnd,ID_LIST_SUCHEN);
sehe das dick gedruckte (kann man hier keine Farbe einstellen ?)... wie gesagt es wird nur die eine gefunden wenn ich die andere Listview angebe wird sie unter Loword(wParam nicht gefunden ) - unter lParam ist sie allerding existent
Die Listview werden zur gleichen Zeit(also direkt hintereinander erstellt)
und wie gesagt auch über die selbe Funktion werden die Einträge reingemachtBei der einen wird alles normal angezeigt(hier Rote farbe,hab auch ein Beispiel wo jede Zeile andere Farbe hat) - und das selbe auf die andere Listview (nach dem die Id geändert wurde) ---- nix
zum testen musste ich nur die ID austauschen
LRESULT ListviewNotify(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (LOWORD(wParam)) { // ================================================================ case [b]ID_LIST_FINDEN[/b]: switch ( ((LPNMHDR)lParam)->code ) { case NM_CUSTOMDRAW: { LPNMLVCUSTOMDRAW lpCD = (LPNMLVCUSTOMDRAW)lParam; // ======================================================== switch (lpCD->nmcd.dwDrawStage) { case CDDS_PREPAINT: //SetWindowLong(hWnd, DWL_MSGRESULT, CDRF_NOTIFYITEMDRAW); return CDRF_NOTIFYITEMDRAW; case CDDS_ITEMPREPAINT: if (lpCD->nmcd.dwItemSpec == SendMessage(GetDlgItem(hwnd, [b]ID_LIST_FINDEN[/b]), LVM_GETNEXTITEM, -1, LVNI_SELECTED)) { lpCD->clrText = RGB(255,255,255); lpCD->clrTextBk = RGB(101,122,216); } else { lpCD->clrText = RGB(000,000,000); lpCD->clrTextBk = RGB(214,223,247); } if (lpCD->nmcd.uItemState & CDIS_HOT) lpCD->clrText = RGB(255,0,0); return CDRF_NEWFONT | CDRF_NOTIFYPOSTPAINT; /*case CDDS_ITEMPOSTPAINT: return CDRF_SKIPDEFAULT; if ( lpCD->nmcd.uItemState & CDIS_FOCUS ) return CDRF_SKIPDEFAULT;*/ break; } return CDRF_DODEFAULT; // ======================================================== } default: return false; } // ================================================================ } return false; }
Hier ohne eine Abfrage , an welche Listview das gehen soll - müsste an beide gesendet werden tu es aber nicht (wieder nur die selbe wie oben - die andere nich)
LRESULT DoNotifyList1(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { LPNMLVCUSTOMDRAW lpNMLVCD = (LPNMLVCUSTOMDRAW)lParam; if (lpNMLVCD->nmcd.dwDrawStage == CDDS_PREPAINT) { return CDRF_NOTIFYITEMDRAW; } if (lpNMLVCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) { COLORREF crText; switch (lpNMLVCD->nmcd.dwItemSpec % 3) { case 0: crText = RGB(255, 0, 0); break; case 1: crText = RGB(0, 255, 0); break; case 2: crText = RGB(0, 0, 255); break; } // lpNMLVCD->clrText = crText; //Textfarbe lpNMLVCD->clrTextBk = crText; // Hintergrund } return CDRF_DODEFAULT; }
-
Ok - war ein reiner Progammierfehler von mir hatte dummerweise den Aufruf der Funktion in die Falsche Zeile drin gehabt , wo noch der case ID_LIST_SUCHEN: zuständig war - und ich sitze 3 Tage über das Problem....
Danke für die Hilfe